同じメディアの継続的な回復試行によって生成された2つのddrescueイメージがあります。両方の画像のサイズは同じですが、補完的なデータがあります。
$ od part-one/ddrescue_image --skip-bytes 227966006774 --read-bytes 32
3242365232766 113056 016517 102014 074371 144073 000000 000000 000000
3242365233006 000000 000000 000000 000000 000000 000000 000000 000000
3242365233026
$ od part-two/ddrescue_image --skip-bytes 227966006774 --read-bytes 32
3242365232766 000000 000000 000000 000000 000000 124616 163450 064251
3242365233006 074567 134433 012742 022160 044301 054235 140604 020633
3242365233026
これを完全なイメージにマージする方法は?
詳細
2番目の図は、次のように最初の回復試行の連続です。
$ ddrescue corrupt-partition part-one/ddrescue_image part-one/ddrescue_log $ mkdir part-two; cp part-one/ddrescue_log part-two/ddrescue_log $ ddrescue corrupt-partition part-two/ddrescue_image part-two/ddrescue_log
2番目の画像はほぼ完全にゼロですが、1847の分離領域に分散された18KBの回復データが含まれています。
言及された技術を試してみました。このメーリングリストに、
$ ddrescue --domain-logfile=part-two/ddrescue_log part-two/ddrescue_image part-one/ddrescue_image part-one/ddrescue_log GNU ddrescue 1.16 Press Ctrl-C to interrupt Initial status (read from logfile) rescued: 937286 MB, errsize: 62976 B, errors: 122 Current status rescued: 937286 MB, errsize: 62976 B, current rate: 0 B/s ipos: 0 B, errors: 122, average rate: 0 B/s opos: 0 B, time since last successful read: 0 s Finished
しかし、何も変わらないようです。
答え1
コピーするデータの範囲を正確に知っている場合は、次のものを使用できますdd
。
dd conv=notrunc if=input of=output seek=123456 skip=123456 bs=4k count=128
これにより、123456から始まり、入力から出力まで128個の4kブロックがコピーされます。
上書きするブロックを最初にバックアップすることをお勧めします。
dd if=output skip=123456 bs=4k count=128 of=output-backup-bs4k-pos123456
どのデータ領域をコピーする必要があるかわからない場合、または確信がない場合はGNU dd
お知らせくださいsparse
。
dd conv=notrunc,sparse if=input of=output bs=4k
これは、ゼロ以外のすべての4k入力ブロックを出力にコピーします。bs=512
ブロックが小さい場合はこれを使用してください!
この方法ではバックアップされないため、ファイルが重要な場合はファイルのコピーを作成することをお勧めします。
答え2
このようなことを試してみますか?
dd if=part-one/ddrescue_image bs=1 count=227966006784 >result
dd if=part-two/ddrescue_image bs=1 seek=227966006785 >>result
チャンクサイズが小さいと、速度が非常に遅くなります。より大きなチャンクサイズを使用するようにリファクタリングし、まだ正しいオフセットに達すると速度が速くなります。
そうでない場合は、dd
タスクをより多くの呼び出しに分割することをお勧めします。チャンクサイズ(65536など)を使用して最も近い64K境界まで読み込み、そこから速度を遅くします(徐々に1Kブロックにドロップダウン可能)、サイズを最も近い1K境界に調整してからシングルバイトまで減らします。細かい作業が終わったら、再びスピードアップします。