これをやる。
dd if=/dev/sda of=/dev/sdb bs=512 conv=noerror,sync status=progress
ifとofをミスると死ぬので気をつけましょう。
上記の例は/dev/sda
から/dev/sdb
へコピーする場合。
if=
にはコピー元ドライブを指定し、of=
にはコピー先ドライブを指定する。
bs=
にはコピー元ドライブのセクタサイズを指定する。この値を大きくするとコピー速度は早くなるものの、その分救出できないセクタが出てくるので、なるべくセクタサイズを指定するほうがよい。
dd では入力ブロックサイズ (IBS) と出力ブロックサイズ (OBS) の指定ができます。bs をセットすると IBS と OBS の両方をセットしたことになります。例えばブロックサイズを 1MiB にすると、通常は 1024*1024 バイト単位で読み書きします。しかし読み取りエラーが起きるとおかしくなります。noerror,sync オプションを使うと dd は読み取りエラーをゼロで埋めるようになると思いがちですが、そうではありません。ドキュメントによると dd は読み取りが完了した後で OBS を IBS と同じサイズになるようゼロ埋めします。つまりそのブロックの最後にゼロが追加されます。したがって、1MiB のブロックの最初でたった 512 バイトの読み取りエラーがあるだけで、1MiB 全体が駄目になってしまうことを意味します。例えば 12ERROR89 というデータの読み取り部分にエラーがあると、結果は 120000089 ではなく 128900000 になります。
自分のディスクにエラーがないと自信を持てるなら、ブロックサイズを大きくしてもよいでしょう。そうするとコピー速度が数倍向上します。例えば、単純な Celeron 2.7 GHz のシステムで bs を 512 から 64 KiB に変えたところ、コピー速度は 35 MB/s から 120 MB/s になりました。しかしくれぐれも、コピー元ディスクで読み取りエラーがあった場合はコピー先ディスクで破損ブロックになってしまうことに注意してください。つまり 512 バイトの読み取りエラーが1回あるだけで出力先ブロックの 64 KiB 全体が駄目になってしまいます。
conv=noerror,sync
はエラーがあっても継続し、エラー分は0埋めするオプション。不良セクタがあるHDDをコピーする際は必ず指定する。
status=progress
は進捗を表示するためのオプション。指定したほうが終わりの目安がわかって精神衛生上よい。