parted
のようなパーティション作成ソフトウェアをテストしたいと思います。
読み込もうとするとプログラムがクラッシュする古いUSBスティックを見つけました。このテストケースを保存するには、USBスティックをできるだけ正確にコピーする必要があります保存IOエラー。
そのファイルの一部のバイトを読み取るときにHDDにIOエラーをスローさせることはおそらく不可能ですが、USBスティックの内容全体がハードコードされて記憶されているある種のプログラムによってエミュレートできる可能性がありますいつスローするかIOエラー?
私はArchLinuxを使用しており、それに適応できるソリューションを好みます(おそらく、ある種のVMまたはマシンエミュレーターを介して)。
コピーするには、ddrescue
、safecopy
、またはdd_rescue
を使用します。それらはすべて、失敗した領域のログを保持し、データを取得できるようになるまで自動的に再試行します。
一般的な使用法は次のとおりです。
ddrescue:(古いdd_rescueと混同しないでください)
ddrescue /dev/sdc3 sdc3.img sdc3.map
必要に応じて、--retrim
または `--try-againで繰り返します。
ddrescue --try-again /dev/sdc3 sdc3.img sdc3.map
に不良領域を記録するマップファイルを指定することを忘れないでください。
safecopy:
safecopy --stage1 /dev/sdc3 sdc3.img
safecopy --stage2 /dev/sdc3 sdc3.img
safecopy --stage3 /dev/sdc3 sdc3.img
ステージ3の後、個々の不良セクタをリストしたstage3.badblocks
ファイルが作成されます。
再試行する場合は、次を使用します。
mv stage3.badblocks stage2.badblocks
safecopy --stage3 /dev/sdc3 sdc3.img
dd_rescue:(より機能的なddrescueと混同しないでください)
dd_rescue -o sdc3.badblocks /dev/sd3 sdc3.img
(このツールが2回目の呼び出しでの再開/再試行をサポートしているかどうかはわかりませんが、少なくともbadblocksログを出力します。)
これらのプログラムは、できるだけ多くのデータを高速で取得し、後で使用するために低速の回復を維持することを強調しています。したがって、「ステージ1」が1つの不良ブロックのためにメガバイト全体をスキップする場合でも、驚かないでください。ステージ2でそのブロックに戻ります。
不良ディスクをエミュレートするには、取得したbadblocksログを取得して、この投稿に適用します。
dmsetup
を使用して、「エラー」ターゲットに裏打ちされたデバイスを作成します。/dev/mapper/<name>
に表示されます。デバイスマッパープレゼンテーション(PDF) の7ページには、まさにあなたが探しているものがあります。
dmsetup create bad_disk << EOF 0 8 linear /dev/sdb1 0 8 1 error 9 204791 linear /dev/sdb1 9 EOF
または、
sdb1
パーツを省略し、「エラー」ターゲットをブロック0〜8のデバイスとして(sdb1
の代わりに)配置して、純粋なエラーディスクを作成します。参照 デバイスマッパー 「RHEL5論理ボリュームマネージャーの管理」の付録。
— Peter Cordes、 https://stackoverflow.com/questions/1870696/simulate-a-faulty-block-device-with-read-errors
(badblocksログまたはddrescueマップファイルをdmsetupテーブル構文に変換することは、読者の練習問題として残されています...)
ddは、エラーが発生したときに続行するように指示できます。これにより、元のディスクから読み取れないスペースにゼロが書き込まれます...
dd bs=<blocksize here> conv=sync,noerror if=/dev/sdc123 of=/home/me/testFile
Ddrescueを使用して実際にデータを回復することもできますが、USB(フラッシュベース)ディスクでどれだけうまく機能するかはわかりません。
[〜#〜] warning [〜#〜]-ブロックサイズを台無しにすると、最初の未読ブロックの後にすべてのデータが台無しになります-ブロックサイズをのブロックサイズに設定しますコピーしているデバイスfrom。