故障したハードドライブをゼロにしたいとしましょう。できるだけ多くのコンテンツをゼロで覆いたいと思います。望ましくないのは、最初の書き込みエラーでプロセスが中断されることです。どうすればいいですか?
AFAICS、一般dd
は読み取りエラーを無視するオプションのみを提供します。そのように
dd if=/dev/zero of=/dev/disk/by-id/lousy-vendor-123 bs=128k
十分ではありません。
ddrescue
エラーを無視する方が良いようです。しかし、最も適切なコマンドラインは何ですか?
GNU ddrescueを使ってみました。
ddrescue --verbose --force --no-split /dev/zero /dev/disk/by-id/lousy-vendor-123
ベストアンサー1
私はbadblocks
破壊的な書き込みモードを使用することを好みます。エラーが発生した場合は、引き続きエラーを発生させ、最終的にそのエラーがどこにあるかを知らせ、次に何をすべきかを判断するのに役立つ可能性がある情報を提供することを記録します(混合されますか?)。
# badblocks -v -b 4096 -t random -o badblocks.txt -w /dev/destroyme
Checking for bad blocks in read-write mode
From block 0 to 2097151
Testing with random pattern: done
Reading and comparing: done
Pass completed, 52105 bad blocks found. (0/52105/0 errors)
そしてブロックリストは次のとおりです。
# head badblocks.txt
2097000
2097001
2097002
2097003
2097004
その後、ディスクに残ったものは何ですか?
# hexdump -C /dev/destroyme
00000000 be e9 2e a5 87 1d 9e 61 e5 3c 98 7e b6 96 c6 ed |.......a.<.~....|
00000010 2c fe db 06 bf 10 d0 c3 52 52 b8 a1 55 62 6c 13 |,.......RR..Ubl.|
00000020 4b 9a b8 d3 b7 57 34 9c 93 cc 1a 49 62 e0 36 8e |K....W4....Ib.6.|
これは実際にはランダムなデータではないことに注意してください。パターンが繰り返されるので、スキップすると1MiB
同じ出力が再び表示されます。
また、データを再読み込みして確認しようとするため、書き込みが成功したと主張しますが、再読み込み時に誤ったデータを返すディスクがある場合は、そのエラーも検出します。 (誤った肯定を避けるために、不良ブロックの実行中に他のプロセスがディスクに書き込まれていないことを確認してください。)
もちろん、深刻な損傷を受けたディスクの場合、時間がかかることがあります。欠陥のある領域を完全にスキップするコードはありません。これを達成する唯一の方法は、badblocks
より大きなブロックサイズを使用することです。
ddrescue
これが良いかどうかはわかりません。別の方向に実行する必要があります(できるだけ早くできるだけ多くのデータを回復します)。最初の/最後のブロックを指定して、dd/ddrescue/badblocksを手動で実行できます。