web-dev-qa-db-ja.com

同じドライブの2つのddrescue出力を効率的にマージ

2台目の1TBドライブへのddrescueを使用して、/dev/sdbで障害が発生した500GBハードドライブのパーティションをレスキューしようとしています。私が最初のパスに使用するddrescueコマンドは次のとおりです。

ddrescue -n /dev/sdb2 core.img core.log

2番目のパスが続きます:

ddrescue -d -r 3 /dev/sdb2 core.img core.log

問題は、2番目のコマンドの画像名を誤って入力してしまったことです。 core.imgの代わりにcore.ingと書きましたが、翌朝2回目のパスが実行され、core.logが上書きされて100%成功したことを報告するまで気づきませんでした。

今、私は2つの巨大なファイルで立ち往生しています。私はまだsdb3を救出しているので、雑用全体を再実行することは不可能です。私はすでにhexeditでチェックし、2つのファイルが互いに補完し合っています(つまり、オフセット0x5000から0x7000のcore.imgがゼロで埋められている場合、core.ingの同じオフセットが実際のオフセットで埋められますデータ、その逆。)

core.img/dev/sdc2(私が準備したddの交換用ドライブ)にsdb-してから、どういうわけかコピーのみcore.ingから/dev/sdc2のゼロ以外のバイトですが、ゼロ以外のバイトのみをコピーする方法がわかりません。考えられる解決策は非常に面倒で、コンプリート。

参考までに、GentooベースのSystemRescueCD 4.9.6を実行しています。sdb2はNTFSです。

2
Dalva

2つの異なるレスキューをマージするにはどうすればよいですか?

(これはGNU ddrescueを想定しています

tl; dr

  1. 最初のコピーのマップファイル/ログファイルを生成します:ddrescue --generate-mode infile outfile mapfile

  2. 2番目→1番目からマージされたコピーを作成します ddrescueメーリングリストへの投稿で説明されているようにddrescue -m logfile2 image2 image1 logfile1


1.最初の画像のログファイルを生成します

最初のパスのログファイルが事実上ないため、これは少し複雑です。ただし、次のものを生成できます。

Ddrescueが--generate-modeオプションで呼び出されると、デフォルトの「レスキューモード」とは異なる「生成モード」で動作します。つまり、「-generate-mode」オプションを使用した場合、ddrescueは何もレスキューしません。後で使用するためにマップファイルを生成しようとするだけです。

.。

(まだ)絶望しないでください。 Ddrescueは、場合によっては、infileとoutfileの(部分的な)コピーからおおよそのマップファイルを生成できます。これは、正確なマップファイルとほぼ同じです。これは、すべてゼロを含むセクターがレスキューされなかったと単純に仮定することで実現されます。

...次のコマンドでおおよそのマップファイルを生成できます。

ddrescue --generate-mode infile outfile mapfile

(強調鉱山)

GNU ddrescue manual ;からセクション12、「生成モード」。

したがって、最初の画像に対してこれを行うことができます(混乱を避けるために名前を変更することをお勧めします(例:core-1.img))。

ddrescue -G /dev/sdb2 core-1.img core-1.log

「私はまだ/dev/sdbから読んでいますが、それと相互参照するログを生成しますか?」

ddrescueは主にoutfile(この場合はcore-1.img)から再構築され、infileからの読み取りはほとんどないことに注意してください。私はこれをinotifywatchでテストしました。

$ inotifywatch 840-linux.img # infile
$ inotifywatch 840-linux2.img # outfile
$ inotifywatch 840-linux2.log
$ ddrescue -G 840-linux.img 840-linux2.img 840-linux2.log

total  close_nowrite  open  filename
6      3              3     840-linux.img
17467  17465   1              1     840-linux2.img

total  access  modify  close_write  close_nowrite  open  filename
196    1       189     2            1              3     840-linux2.log

したがって、読み取りが無視できるため、別のプロセスがsdb(OPの場合、 別のパーティションでの別のレスキュー試行 )で実行されているときにこれを実行しても安全です。

2.2つの部分コピーをマージします

この種の状況 以前に発生したことがあります

これで、ほとんどオーバーラップしないドライブの2つの部分的なイメージができました...そして、スキップされた適切な領域と遅い領域を定義する2つの一致するログファイルがあります。

幸い、これらは --domain-mapfile を使用してマージできます。

--domain-mapfile=file
   Restrict the rescue domain to the blocks marked as 
   finished in the mapfile file. This is useful for 
   merging partially recovered images of backups, or if 
   the destination drive fails during the rescue. Use 
   '-' as file to read from standard in`

そして 同様の問題の解決策にはそのオプションが含まれていました

次のように入力して、画像をマージできます。

cd dir1
ddrescue -m dir2/logfile dir2/image image logfile

これにより、現在レスキューされているすべてのデータを含むファイルdir1/logfile dir1/imageが作成されます。次に、たとえば次のようにレスキューを続行できます。

あなたの場合、core.imgのログファイルを生成し、それらに1のラベルを付け、core.ingcore.log2として保持したと仮定します(もっと混乱!):

ddrescue -m core-2.log core-2.img core-1.img core-1.log
1
bertieb