Dd (UNIX)

ddはUnix系のシステムにあるプログラム（コマンド）で、データのコピーや変換をブロックデバイスを直接読み書きして行うことが特徴である。dataset definitionの略であるが、IBMのメインフレームのJob Control Language（ジョブ制御言語、JCL）の「DD文」（DD statement）に由来するため、引数の構文が、Unixの一般的なコマンドの引数のそれとは激しく異なっている（datasetというのはメインフレーム用語）。

ddの主な機能は指定されたバイト数もしくはブロック数のデータのコピーであり、この機能は、ハードディスク（全体もしくはパーティション単位、またはブートセクター等）のバックアップや、/dev/zeroや/dev/randomを用いて指定された領域を完全消去するために利用される。同様にディスクの（可能な限り）全状態をそのままクローンしたい、コンピュータ・フォレンジックスなどの場合にも使われる。

ddコマンドが行うようなディスクの直接の読み書きには、通常は管理者権限が必要であり、従って危険なコマンドであっても簡単に実行できてしまう状態で作業していることが多い。そしてddは、例えば、入力と出力の指定をうっかり逆にしただけで（具体的には "of" と "if" の、QWERTYキーボードでは隣の1文字の違いである）、大事なデータをバックアップする代わりに、まっさらなディスクの内容をそれに上書きして消してしまう、という恐ろしいことを起こし得る。そのためしばしばベテランは、data destroyer（あるいはdisk destroyer、destroyer=破壊者）の略である、などという。なお、copy commandあるいはcopy and convertの略でccにしようとしたが、C言語コンパイラ（ないしコンパイラドライバ）のccがあったのでひとつずらしてddにした、という説が流布していたが、これは誤りであることがUNIXの開発者であるデニス・リッチー氏による投稿で確定している。

コマンドラインに指定できるオプション 
入出力を指定するオプション
if=[file] : 標準入力の代わりに、ファイル file から読み込む
of=[file] : 標準出力の代わりに、ファイル file へ書き出す
コピーするサイズを指定するオプション
count=[blocks] :  ibs バイトのブロック blocks 個分だけ入力ファイルをコピーする
読み書きの開始位置を指定するオプション
skip=[blocks] :  ibs バイトのブロック blocks 個分だけ入力ファイルの先頭をスキップする
seek=[blocks] : 出力の先頭にある obs バイトのブロック blocks 個分を書き出さない
1回の読み書きのデータサイズを指定するオプション
bs=[bytes] :  一 度に bytes バイトずつ読み込みと書き出しをする
ibs=[bytes] : 一度に bytes バイトずつ読み込む。デフォルトは 512
obs=[bytes] : 一度に bytes バイトずつ書き出す。デフォルトは 512
オンザフライのデータ変換を指定するオプション
conv=[CONVERSION]
noerror : 読み込みエラーが発生しても継続する
sync : 入力ブロックサイズがibsに指定されていないバイト数に満たないとき、パディングを行う

使用例 
ハードディスク上のパーティションを、別のディスクにコピーする
 dd if=/dev/sda2 of=/dev/sdb2 bs=4096 conv=notrunc,noerror

ハードディスク全体を完全消去する
 dd if=/dev/urandom of=/dev/hda

CDをiso仮想イメージファイルに変換する
 dd if=/dev/cdrom of=/home/sam/myCD.iso bs=2048 conv=sync,notrunc

ハードディスクのMBRをバックアップする
 dd if=/dev/sda of=/home/sam/MBR.image bs=446 count=1

関連項目 
ddrescue : 不良セクタのあるディスクの扱いを得意とするデータコピー・プログラム
パーティション
ディスクセクタ
データの完全消去

外部リンク 
 dd(1) man page（JM Project）

参考文献 

標準UNIXプログラム