の簡単な解決策はありませんddrescue
。
編集:私は今ではそれほど単純ではない解決策を持っています。
対象ファイルの準備
ソースハードドライブのサイズを512バイト単位で知る必要があります。変数に保存します。
SIZE=$(sudo blockdev --getsz /dev/sdX)
ターゲットファイルは、事前に適切なサイズにする必要があります。
fallocate -l $((512*$SIZE)) /mnt/samba/share/target.dd
遅延デバイスの準備
まず、ループデバイスが必要です。
sudo losetup -f /mnt/samba/share/target.dd
sudo losetup -a
2番目のコマンドは、どのループデバイスが関連付けられているかを示しますtarget.dd
。ここではそうです/dev/loop0
。
次に、デバイスマッパーでデバイスを作成します。
echo "0 $SIZE delay /dev/loop0 0 0 /dev/loop0 0 500" | sudo dmsetup create delayed_target
500
この例の数値は、すべての書き込み操作/dev/mapper/delayed_target
が500ミリ秒遅れることを示しています。(詳細についてはman dmsetup
、およびこのドキュメントを参照してください。)
実際の読書
sudo ddrescue --force -D -c 2048 /dev/sdX /dev/mapper/delayed_target logfile.log
スイッチ-c 2048
はddrescue
、一度に2048 * 512バイト、つまり1メガバイトを処理するように指示します。-D
プログラムがキャッシュなどを省略しているため、多くの書き込み操作が1つにまとめられます。では-D
、すべてのメガバイトフォームは500ミリ秒の遅延を打つ書き込み操作を分離します。
微調整
1つの微調整は-c 2048
、ddrescue
呼び出しを変更することです。もう1つ–遅延を変更するdmsetup
(クリーニングセクションを参照)。
で停止ddrescue
しCtrl+C、必要に応じて遅延を微調整ddrescue
し、同じログファイルと別の-c
パラメータで再実行することができます。それは継続します。ニーズに合った値を見つけるために実験してください。
クリーニング
sudo dmsetup remove delayed_target
(遅延を調整するには、dmsetup create
今に戻ります。)
sudo losetup -d /dev/loop0
注意
ターゲットファイルへの書き込みを遅らせる代わりに、ソースデバイスからの読み取りを遅らせることができます。ループデバイスは必要ないので、より良い方法のようです。ただし、私のテストでは、新しく作成されたマッパーデバイスからの即時読み取りがあることが示されました。これらの読み取りは何度も遅延にヒットし、dmsetup
それ自体をブロックします。私の解釈はすべて間違っているかもしれませんが、それでもかなりの遅れがありdmsetup create
ます。調整(すべての手順ではないにしても)を事実上不可能にします。
私の元の答え:
私の経験からは、読み取りエラーが発生した場合ddrescue
よりもはるかに優れていdd
ます。あなたのディスクは、一般的に良い形であり、あなたはまれであることを読み取りエラーを期待する場合は、使用することdd
にpv
。
例:
dd if=/dev/sdb conv=sync,noerror bs=32M 2>dd.log | pv -L 4M > /mnt/samba/desktop/my-image.dd
のnoerror
パラメーターdd
は、読み取りエラーが発生した場合、それを続行します。sync
原因dd
その場合の出力ゼロにするので、良好なデータは、その後、適切な画像ファイル内のオフセットで配置されています。私bs
はhddのパフォーマンスのために大規模なものを好みます。このように大きなbs
1つの読み取りエラーがあると、画像に32MiBの誤ったゼロが発生する可能性があることに注意してください。
- 手動電卓とと遊ぶ
dd
のbs
、skip
、seek
そしてconv=notrunc
何をするために、オプションddrescue
(これらの数字は、ディスクに共通のセクタサイズです)読んで、うまくいけば512Bまたは読み取りエラーあたり4096Bに誤ったゼロを減らし、できるだけ多くを保存します。自動ありません。
- または、ポケット電卓で手動で再生し、のログファイルを作成して
ddrescue
から、実行ddrescue
してソースの問題のあるフラグメントのみを再読み取りします。info ddrescue
ログファイル構造を参照してください。
どちらの場合でも、保存されたstderrはdd
、問題のあるセクター、つまり2>dd.log
リダイレクトを見つけるのに役立ちます。
良いことは、pv
(実際にPIDを置き換え、その場で制限速度を変更する能力であるPID元のpv
と一緒に使用しますdd
):
pv -L 6M -R PID
これにより、最初からやり直すことなく制限を調整できます。