web-dev-qa-db-ja.com

ディスクのゼロ書き込みの最後にddでエラーが発生するのはなぜですか?

私は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

ワイプが正常に実行されたようですが、その場合、エラーが生成されるのはなぜですか?

正常ですか?そうでない場合、どうすればそれを回避できますか?

1
Hashim

さらに調査すると、これはドライブの最後の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セクターを除いて、ドライブ全体が正常にゼロ調整されたことがわかります。

enter image description here

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セクターを除くすべてをワイプします。

enter image description here

1
Hashim

私の推測では不良セクタでしょう。これは、I/Oエラーにつながる可能性のあるケースの1つです。

とにかく、ddがドライブの終わりを超えて書き込もうとしたためにエラーが発生する可能性はほとんどありません。 別の質問に対する私の回答 でも、代わりにNo space left on deviceが表示されます。

enter image description here

ちなみに、Cygwinのバグのため、35196174335は実際に書き込まれたバイト数ではない可能性があります。代わりに、35196174335 - 4294967295 = 30901207040である必要があります。 (512に対してこれらの番号を「 mod 」で試すことができます。)

その場合、正常に書き込まれたバイト/セクターの数は231100 * 4 * 1024 ^ 2 + 30901207040 = 1000204861440/1953525120である必要があります。あなたがあなたの質問で与えた他の情報に基づいて、これはとにかくドライブ全体のサイズである可能性は低いです。 (30901207040バイトは "4M"(4 * 1024 ^ 2)でも割り切れないことに言及する価値があるかもしれません。)

1
Tom Yan