ディスクのゼロ化中に書き込みエラーを無視する方法は?


19

故障したハードディスクをゼロアウトするとします。可能な限りゼロで上書きする必要があります。望まないのは、最初の書き込みエラーでプロセスが中断することです。どうやってするか?

AFAICS、plain 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
dd conv=noerrorGNU拡張機能かもしれませんが、よくわかりません。いずれにせよ、それはトリックを行う必要があります。ただし、ドライブ全体を消去するというSATAの答えは、ドライブ全体を消去するために検討する価値があります。
ピーターコーデス

1
@PeterCordes、「読み取りエラー後も続行」としてのGNU ddドキュメントのマニュアルページnoerror...
maxschlepzig

1
dd conv=noerrorist POSIX標準ですが、本当に遅いかもしれません
-schily

2
dd conv=noerror書き込みエラーではなく、読み取りエラー(マンページによる)のためでなければなりません。それとを組み合わせても何も悪いことはありconv=notruncません。これは、書き込みエラーを無視するというトリックを行いました。unix.stackexchange.com/a/229379/4319
imz-イヴァンザカリヤシェフ

を使用するなど、HDDへの単純な書き込み操作では、dd if=/dev/zero of=/dev/sdXディスクの読み取りは実行されません。ddコマンドが「十分ではない」と思うのはなぜですか?どのような「エラー」が発生していますか?
おがくず

回答:


12

badblocksはこのために破壊的な書き込みモードを好みます。エラーが発生したときに書き込みを続け、最後にエラーの場所を通知します。この情報は、次に何をすべきかを判断するのに役立ちます(Will It Blend?)。

# 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の実行中に他のプロセスがディスクに書き込まないようにしてください。)

もちろん、ディスクがひどく破損していると時間がかかりすぎる可能性があります。欠陥のある領域を完全にスキップするようなコードはありません。それを達成できる唯一の方法はbadblocks、より大きなブロックサイズを使用することです。

ddrescueこれがもっと良いかどうかはわかりません。他の方向でそれを行うことになっています(できるだけ多くのデータをできるだけ早く回復します)。最初/最後のブロックを指定することにより、dd / ddrescue / badblocksに対して手動で行うことができます...


1
-t randomまたは-t 0- を使用する場合、badblocksは1回の書き込みパスを実行しますか?マニュアルページを見ると、-t4パス( '0xaa、0x55、0xff、0x00'の場合)が実行されていないようです。
maxschlepzig

2
-tコマンドラインで指定するごとに1つのパスを実行します。あなたが言うように、デフォルトは4パスです。
frostschutz

13

ディスクがUSBで接続されていない場合は、hdparm(バージョン> 9.31)を使用してディスクのATAセキュア消去を実行することを検討してください。このコマンドにより、ドライブのファームウェアが不良ブロックを含むディスクの内容を消去します。

警告:正しいドライブ文字を使用してください- /dev/sdX例として示しました-単にコピー/貼り付けしないでください。

最初に、ATAコマンドを理解していることを確認します(この10年以上製造されたほとんどのドライブはそうすべきです):

$ sudo hdparm -I /dev/sdX
.
# lots of other info here...
.
Security: 
    Master password revision code = 65534
        supported
    not enabled
    not locked
    not frozen
    not expired: security count
        supported: enhanced erase
    202min for SECURITY ERASE UNIT. 202min for ENHANCED SECURITY ERASE UNIT.

抽出の最後の2行は、サポートされていることを示しています。

そのため、パスワードをドライブに追加します(明らかに要件)。

$sudo hdparm --user-master u --security-set-pass p /dev/sdX
security_password="p"

そして消去:

$sudo hdparm --user-master u --security-erase p /dev/sdX
security_password="p"

/dev/sdX:
Issuing SECURITY_ERASE command, password="p", user=user

この手順の詳細については、こちらをご覧ください


運が良ければこれはUSB上で動作し、USB <-> SATAブリッジは非標準のSATAコマンドを通過できます(そしてLinuxドライバー+ hdparmはそのモデルでそれを行う方法を知っています)。また、例を書くのに/dev/sdX適しています。貼り付けやカスタマイズの際に誰かが見逃したとしても問題はないからです。
ピーター・コーデス

@Peter Cordes-24台のディスクがない限り...いいえ、ばかげています!おかげで、私はそれをsdXに変更しました。それは答えを急ぐことを教えてくれるでしょう!
garethTheRed

2
リンクされたページには、この方法に関する非常に多くのハードウェア/ファームウェア関連の警告がリストされています...ちょっと怖い
-maxschlepzig

実際、いくつかの注意事項があります!私が言えることは、問題なく動作したということだけです。
garethTheRed

2

ここに実行可能な4つの答えがあります。

  1. hdparmこの方法によって投稿garethTheRedは、お使いのコンピュータに直接接続されている場合は、おそらく最高です。どうやら、USB経由で接続してみると、ドライブをブリックできます。廃棄しようとしているドライブに対してこれを行っている場合、それは良いことかもしれません。ただし、おそらく破棄する前に消去を保護する必要があります。

  2. imz報告した手法-Ivan Zakharyaschevは動作しますが、非常に遅い場合があります。データを回復可能にしたくない場合は、/dev/urandom代わりに使用することをお勧めします/dev/zero。例えば、

    dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/urandom of=/dev/sdX
    
  3. 私は以下に対してアドバイスをします。同じことを行うより高速な処理を行うには、maxschlepzigによって報告された手法を使用します(質問内)。

    ddrescue --verbose --force --nosplit /dev/urandom /dev/sdX
    

    これはddコマンドより高速ですが、コマンドほど高速ではありませんhdparm。私がこれをお勧めしない理由は以下をご覧ください...

  4. badblocksまた、このコマンドは作業が、しかし、あなたはそのようにデータをランダム化することができないだろう、と再びそれが非常に遅くなります。

最後に、人々がディスクを完全に消去しようとする一番の理由を指摘しなかった場合、それは処分しようとしているということで、私は失望するでしょう。その場合、まだ行っていない場合は、最初にディスクを試してみてください。ブロックを読み取ってI / Oエラーが返された場合、次に同じブロックに書き込むと、ディスクは予約リストから別のブロックを再割り当てしようとします。予約リストがいっぱいになると、書き込み時にI / Oエラーが発生します。本当にドライブを破棄する必要があるときです。

したがって、次のような簡単なことができます。

dd if=/dev/sdX of=/dev/null conv=noerror

そして、次に、次のような不良ブロックを書き換えます。

dd if=/dev/zero of=/dev/sdX bs=128k

このコマンドが機能する場合、勇気がある場合は、ディスクを再フォーマットして再度使用できます。

または、badblocksディスク上でコマンドを2回実行できます。2回目は、不良ブロックがないことを報告する必要があります...

badblocks -v -s -w -t random /dev/sdX
badblocks -v -s -w -t random /dev/sdX

これには時間がかかりますが、より信頼性があります。

また、hdparmコマンドを除いて、どの手法も実際に安全な消去を実行しないことに注意してください。それらすべての不良ブロックを覚えていますか?それらには、元のデータの一部がほとんどそのまま残っています。データ回復の専門家がこれらにアクセスして、以前にハードドライブにあったものの少量を確認できます。

ddrescueとそれに対してアドバイスする理由に関して、次の解毒剤があります。

問題は、ddrescureがエラーを無視するのに非常に優れていることです。ddと一貫して約102 GBのマークで書き込み速度が低下し、238 GBのマークで書き込みエラーが発生し始めたハードドライブがありました。ddrescueがエラーを報告しなくても、ディスクを一定の速度で絶え間なく移動し続けたことに非常に感銘を受けました。17時間後、1300 GBになったときに、たまたまドライブライト自体の点滅が止まったことに気付きました。簡単なチェックにより、USBエンクロージャー全体がオフラインになっていることが明らかになりました。ドライブをクレードルから引き出しました。ddrescueは、ディスクを手に持っていても、エラーなしでまだコピー中であることを喜んで報告していることに気付きました。ディスクを別のマシンに差し込んだところ、レンガになったことがわかりました。

私はドライブをレンガにするためにddrescueを責めません。ドライブに障害が発生し、レンガになりました。気になるddrescueは、無視している書き込みエラーの数のエラーカウントさえも与えないことに気付きました。この使用法では、ddrescueは、すべての書き込みエラーに関係なく、完全に成功したとみなします。事実、スローダウンのセクションではフルスピードで続行できなかったはずです。セクションが遅い理由は、多くのブロックがドライブによって再配置され、そのセクションにアクセスするときに多くのシークが発生したためです。そのため、おそらくddrescueの出力がフィクションになった時点です。


1
「安全に消去するには、同じブロックをランダムデータで複数回上書きする必要があります。」-参照を使用してクレームを実証できますか(最新のハードディスク上のゼロ化されたデータの回復を示すピアレビュー記事)。また、ハードディスクファームウェアはブラックボックスです。ATAセキュア削除コマンドがwrite-zero-pattern-to-each-ectorとして実装されているだけではないことをどのように知っていますか?
maxschlepzig

ちょうど逆。2006年には、現代のドライブではデータが非常に密集しているため、1回の書き込みでも同じくらい効果的であるため、古いドライブでは複数の書き込みが不要になったことが多くの研究で示されています。
user6856

1
dd conv=notrunc

おそらく私のためにトリックをしました。

言及された

dd conv=noerror

読み取りエラー用でなければなりません(マンページによる)。この2つを組み合わせても何も悪いことはありません。

ディスクをゼロにするための私の完全なコマンドは次のようになりました。

dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/zero of=/dev/sda

bs=場合によっては、カスタムの追加も必要になる場合があります。


1

高速で成熟した方法はを使用することsddです。

すべてのコンテンツを破棄したい場合は、以下を呼び出します。

sdd -inull bs=1m of=/dev/rdsk/cXdXtXp0 -noerror

常に「raw」ディスクドライバーインターフェイスを使用します。

ディスクを修復し、古いコンテンツをできるだけ多く保持したい場合は、以下を呼び出します。

sdd if=/dev/rdsk/cXdXtXp0 of=/dev/rdsk/cXdXtXp0 bs=1m -noerror

これにより、すべての読み取り不能ブロックが512バイトレベルでゼロに置き換えられます。再試行回数を変更するにはtry=#、を使用します。デフォルトは2です。

sdd速くよりもdd、それが最初の付属ブロックサイズと、エラーの場合に読み取ろうとしてエラーが発生した場合には、それは512バイトで読み取ります。読み取りエラーがある場合、sddはランダムシークとダミー読み取りを行って、ドライブのファームウェアを落ち着かせます。

拡張されたエラー回復機能は、私が2番目に大きなSun-Microsystems OEMで働いていた1980年代に開発されました。

Sddソースコードは、schilyツールに含まれています。

http://sourceforge.net/projects/schilytools/files/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.