web-dev-qa-db-ja.com

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

故障したハードディスクをゼロにしたいとします。できるだけゼロで上書きしたい。望まないのは、最初の書き込みエラーでプロセスが異常終了することです。どうやってするか?

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
21
maxschlepzig

これには、破壊的な書き込みモードで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でそれを実現できる唯一の方法は、はるかに大きなブロックサイズを使用することです。

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

12
frostschutz

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

警告:正しいドライブ文字を使用してください-私は/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

この手順の詳細については、 ここ を参照してください。

13
garethTheRed

私はここに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の出力が架空のものになった時点です。

2
user6856
dd conv=notrunc

多分私のためにトリックをしました。

上記の

dd conv=noerror

(マンページによると)読み取りエラー用である必要があります。 2つを組み合わせても問題はありません。

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

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

場合によっては、カスタムbs=を追加することもできます。

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

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

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

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

ディスクを修復して古いコンテンツをできるだけ多く保存したい場合は、次のように呼び出します。

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/

1
schily