私はWindows7でCygwinを実行しています。
次のdd
コマンドを使用して、1TBのメカニカルディスクを安全に消去しました。
dd if=/dev/zero of=/dev/sde bs=4M status=progress
ワイプの約2時間半後、ワイプが完了すると予想していた頃、ディスクに約930GB(またはGiBの可能性が高い)を正常に書き込んだ後、エラーが発生しました。
dd:書き込みエラー '/ dev/sde':入出力エラー
seek
を指定してコマンドを再度実行し、ファイルの最後の数ギガバイトをゼロで書き込んでエラーを再現しようとしました。
dd if=/dev/zero of=/dev/sde bs=4M status=progress seek=231100
...そして確かに私は同じエラーを受け取りました:
dd: error writing '/dev/sde': Input/output error
7368+0 records in
7367+0 records out
35196174335 bytes (35 GB, 33 GiB) copied, 405.703 s, 86.8 MB/s
ワイプが正常に実行されたようですが、その場合、エラーが生成されるのはなぜですか?
正常ですか?そうでない場合、どうすればそれを回避できますか?
さらに調査すると、これはドライブの最後のXセクターがワイプされないようにするCygwinのバグのようですが、このバグはエラーメッセージとはまったく関係がない可能性があります。
私は最初に、ディスク全体に1つのパスを1つ書き込むことによってテストしました。
badblocks -t "1" -vws /dev/sda
次のコマンドを実行して、これがディスク上で成功したことを確認しました。
od /dev/sda
それから私はしました:
dd if=/dev/zero of=/dev/sda bs=4M status=progress
...ディスク全体。これは、通常のI/Oエラーで失敗しました。 16進エディタを使用してディスクを検査すると、最後の48セクターを除いて、ドライブ全体が正常にゼロ調整されたことがわかります。
1953525168セクター-48 = 1953525120セクターであることがわかり、この数値をseek
と組み合わせて使用して、ディスクの最後の48セクターをワイプしました。
$ dd if=/dev/zero of=/dev/sda seek=1953525120
dd: writing to '/dev/sda': Input/output error
49+0 records in
48+1 records out
4294991871 bytes (4.3 GB, 4.0 GiB) copied, 0.230269 s, 18.7 GB/s
これにより、セクター48から最後までディスクがゼロになりました。これは、16進エディターとod /dev/sda
を使用して再度確認しました。 I/Oエラーは、最後に到達してもまだ存在していることに注意してください。これは、エラーが必ずしもワイプの不良を示しているわけではないことを示しています。
最後に、起動可能なUSBからLinux Kaliを起動し、同じコマンドでディスク全体をワイプしました。
dd if=/dev/zero of=/dev/sda bs=4M status=progress
ワイプされたディスクを16進エディタで再度チェックすると、コマンドがディスク全体をワイプし、ゼロ以外の文字が残っていないことを確認します。
結論として:
Cygwinのディスク全体でdd
を実行すると、最後の48セクターがワイプされなくなります
seek
を使用してディスクを選択的にワイプすると、ディスク全体がワイプされますが、それでもI/Oエラーが発生します
起動可能なLinuxシステムからディスク全体をワイプすると、I/Oエラーなしでディスク全体がワイプされます
このバグを確認するために、使用可能な唯一の他のスペアドライブである128GBSSDでも同じdd
コマンドを実行しました。ここでは、最後の48セクターを除くすべてをワイプします。
私の推測では不良セクタでしょう。これは、I/Oエラーにつながる可能性のあるケースの1つです。
とにかく、dd
がドライブの終わりを超えて書き込もうとしたためにエラーが発生する可能性はほとんどありません。 別の質問に対する私の回答 でも、代わりにNo space left on device
が表示されます。
ちなみに、Cygwinのバグのため、35196174335
は実際に書き込まれたバイト数ではない可能性があります。代わりに、35196174335 - 4294967295 = 30901207040
である必要があります。 (512
に対してこれらの番号を「 mod 」で試すことができます。)
その場合、正常に書き込まれたバイト/セクターの数は231100 * 4 * 1024 ^ 2 + 30901207040 = 1000204861440
/1953525120
である必要があります。あなたがあなたの質問で与えた他の情報に基づいて、これはとにかくドライブ全体のサイズである可能性は低いです。 (30901207040
バイトは "4M
"(4 * 1024 ^ 2
)でも割り切れないことに言及する価値があるかもしれません。)