ddの使い方メモ

空(ゼロの詰まった)の巨大ファイルを作る

/dev/zeroを入力として使う。空のディスクイメージ・ファイル(ファイルの中身がHDDのデータになっているもの)の作成等に使う。
例:64GiBのファイルを作成する

adsaria@ubuntu$ dd if=/dev/zero bs=1G count=64 of=fff

bsの大きさは使っている計算機のメモリサイズで決める。余り大きいとスワップが発生して、異常に時間がかかる(またbsの上限もあるので注意、詳しくはここ)。小さ過ぎると入出力回数が増えて、やはり時間がかかる。

空(本当に空)の巨大ファイルを作る

見かけの容量だけを持ったファイルを作る。ディスクイメージ・ファイルを作る時などに便利。ただし、実際にファイルの中身が書かれる時にHDDを割り当てするので書き込みに時間がかかったり、思わぬエラーが発生する可能性もあるので注意。
例:64GiBのファイルを作成する。

adsaria@ubuntu$ dd if=/dev/null bs=1 seek=64G of=fff
0+0 records in
0+0 records out
0 bytes (0 B) copied, 4.866e-06 s, 0.0 kB/s
adsaria@ubuntu$ ls -ls fff
0 -rw-r--r-- 1 adsaria adsaria 68719476736 2011-01-25 13:16 fff

実際にデータは書き込まないので瞬時に終わる。“ls -ls”で見ると実質的にはサイズがゼロになっていることが確認できる。

ファイルの大きさを目的の大きさまで“見かけ上”大きくする

これもディスクイメージ・ファイルなどの大きさを変更したい時に便利。MBR(つまりパーティション情報)だけを取ってきて、後はこの方法でサイズを大きくする、とか。
例:41バイトのファイルを1MiBに変更する。

adsaria@ubuntu$ ls -ls fff
4 -rw-r--r-- 1 adsaria adsaria 41 2011-01-25 13:12 fff
adsaria@ubuntu$ hd fff
00000000  31 32 33 34 35 36 37 38  39 30 31 32 33 34 35 36  |1234567890123456|
00000010  37 38 39 30 31 32 33 34  35 36 37 38 39 30 31 32  |7890123456789012|
00000020  33 34 35 36 37 38 39 30  0a                       |34567890.|
00000029
adsaria@ubuntu$ dd if=/dev/null of=fff bs=1 seek=1M
0+0 records in
0+0 records out
0 bytes (0 B) copied, 5.358e-06 s, 0.0 kB/s
adsaria@ubuntu$ ls -ls fff
4 -rw-r--r-- 1 adsaria adsaria 1048576 2011-01-25 13:12 fff
adsaria@ubuntu$ hd fff
00000000  31 32 33 34 35 36 37 38  39 30 31 32 33 34 35 36  |1234567890123456|
00000010  37 38 39 30 31 32 33 34  35 36 37 38 39 30 31 32  |7890123456789012|
00000020  33 34 35 36 37 38 39 30  0a 00 00 00 00 00 00 00  |34567890........|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00100000
adsaria@ubuntu$ 

見かけの大きさだけを変更するので、“ls -ls”で見ると実際のファイルの大きさは変わっていない事を確認できる。

ファイルの特定の場所からデータを上書きする

seekとconv=notruncを使う。ディスクイメージ・ファイルの中の特定のパーティションのデータだけを変更したい場合などに便利。
例:元のファイルの11バイト目(10バイト目の次)から4バイトを別のデータで置き換える。

adsaria@ubuntu$ ls -l fff
-rw-r--r-- 1 adsaria adsaria 41 2011-01-25 12:38 fff
adsaria@ubuntu$ cat fff
1234567890123456789012345678901234567890
adsaria@ubuntu$ echo -n abcd | dd of=fff bs=1 seek=10 conv=notrunc
4+0 records in
4+0 records out
4 bytes (4 B) copied, 2.1531e-05 s, 186 kB/s
adsaria@ubuntu$ ls -l fff
-rw-r--r-- 1 adsaria adsaria 41 2011-01-25 12:39 fff
adsaria@ubuntu$ cat fff
1234567890abcd56789012345678901234567890
adsaria@ubuntu$

読み出しエラーのあるHDDから無理やり読み出す

conv=noerror,sync を使う。noerrorはエラーが発生しても処理を続行するためのもの。syncは入力エラーがあった場合にその部分にNULLを埋め込み出力するためのもの。これでエラーを起こすHDDからデータを救出できる“かも”。

例:

root@ubuntu# dd if=/dev/sdb of=hdd.img bs=1M conv=noerror,sync

ただし、bs(ブロックサイズ)に大きな値を指定すると、例え1セクタ(256バイト)の読み出しエラーだけでもbsで指定したサイズのデータがNULLになってしまうので注意。上の例では1MiBがNULLになってしまう。(エラーを起こすHDDが手元にないので未確認)しかし、bsのサイズを余り小さくすると読み出しに気が遠くなるほど時間が必要になるので注意。
サルベージしたファイルはスーパーブロック、MFT等が壊れていなければmountして(mountの方法はここ)、fsckchkdskで修復して使える場合もある。