web-dev-qa-db-ja.com

IOエラー)に関する情報を失うことなくディスクをクローン化する

partedのようなパーティション作成ソフトウェアをテストしたいと思います。

読み込もうとするとプログラムがクラッシュする古いUSBスティックを見つけました。このテストケースを保存するには、USBスティックをできるだけ正確にコピーする必要があります保存IOエラー

そのファイルの一部のバイトを読み取るときにHDDにIOエラーをスローさせることはおそらく不可能ですが、USBスティックの内容全体がハードコードされて記憶されているある種のプログラムによってエミュレートできる可能性がありますいつスローするかIOエラー?

私はArchLinuxを使用しており、それに適応できるソリューションを好みます(おそらく、ある種のVMまたはマシンエミュレーターを介して)。

2
styrofoam fly

コピーするには、ddrescuesafecopy、または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テーブル構文に変換することは、読者の練習問題として残されています...)

4
user1686

ddは、エラーが発生したときに続行するように指示できます。これにより、元のディスクから読み取れないスペースにゼロが書き込まれます...

dd bs=<blocksize here> conv=sync,noerror if=/dev/sdc123 of=/home/me/testFile

Ddrescueを使用して実際にデータを回復することもできますが、USB(フラッシュベース)ディスクでどれだけうまく機能するかはわかりません。

[〜#〜] warning [〜#〜]-ブロックサイズを台無しにすると、最初の未読ブロックの後にすべてのデータが台無しになります-ブロックサイズをのブロックサイズに設定しますコピーしているデバイスfrom