故障したハードディスクをゼロにしたいとします。できるだけゼロで上書きしたい。望まないのは、最初の書き込みエラーでプロセスが異常終了することです。どうやってするか?
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
これには、破壊的な書き込みモードで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に対して手動で行うことができます...
ディスクが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
この手順の詳細については、 ここ を参照してください。
私はここに4つの実行可能な答えを見ます:
hdparm
メソッド 投稿者garethTheRed は、コンピュータに直接接続している場合におそらく最適です。どうやら、しかし、それをUSB経由で接続しようとすると、ドライブをブリックすることができます。処分しようとしているドライブに対してこれを行っている場合、それは良いことかもしれません。ただし、破棄する前に消去を確保する必要があります。
imzによって報告された手法-Ivan Zakharyaschev は機能しますが、非常に遅くなることがあります。データを回復可能にしたくない場合は、/dev/urandom
ではなく/dev/zero
を使用することをお勧めします。例えば。、
dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/urandom of=/dev/sdX
私は次のことに対して助言します。同じことをするより速い何かのために、(質問の)maxschlepzigによって報告されたテクニックを使用してください:
ddrescue --verbose --force --nosplit /dev/urandom /dev/sdX
これはdd
コマンドより高速ですが、hdparm
コマンドほど高速ではありません。私がこれをお勧めしない理由を以下に示します...
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の出力が架空のものになった時点です。
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ツールに含まれています: