ブールORを介して2つのバイナリイメージファイルをマージします(ddrescue出力ファイル名が正しくありません)。

ブールORを介して2つのバイナリイメージファイルをマージします(ddrescue出力ファイル名が正しくありません)。

ddrescueを復元するときに、間違った出力ファイル名を使用して愚かな間違いを犯しました。何が起こるかは次のとおりです。

ddrescue -b 2048 -d -v /dev/sr1 IDTa.img IDTa.ddrescue.log 

その後、コンピュータがクラッシュして誤って復元しました。

ddrescue -b 2048 -d -v /dev/sr1 IDTa.iso IDTa.ddrescue.log

どちらの画像ファイルもゼロで始まるということを収集したので、両方のファイルに対してブール値ORを実行すると、結果は私が間違えなかった場合はddrescue出力になると思いました。

これらのファイルは互いに連続していません(例:2つのddrescue画像をマージする方法は?)以前に実行したことddrescue -nがあり、正常に完了したためです。つまり、IDTa.imgにはほとんどのデータが含まれており、IDTa.isoには画像全体に分散されたチャンクが含まれています(IDTa.imgではこれらのチャンクは0です)。

これを行う簡単なCLI方法はありますか?おそらくCでこれを行うことができます。しかし、私は非常に錆びました!また、私が一度も学んだことがないPythonの最初の練習になることができます!それでも既に存在するものがある場合は、車輪を再発明しようとする誘惑を特に感じないでください。パフォーマンスに集中しすぎない。

修正する:(返信に返信するのに間違った場所であればお詫び申し上げます。「コメント」オプションを使用すると、文字数が少なすぎるため、ここに返信を残します!)

また、上記の問題に対する解決策として、ddrescueに '--fill-mode =?'を使用してみましたが、成功しませんでした。これが私がしたことです:

ddrescue --generate-mode -b 2048 -v /dev/sr1 IDTa.img IDTa.img.log
cp IDTa.img IDTa.img.backup
ddrescue '--fill-mode=?' -b 2048 -v IDTa.iso IDTa.img IDTa.img.log 

確認するために、IDTa.isoにデータがある最初の場所を見つけました。

hexdump -C IDTa.iso |less

出力は次のとおりです

00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
001da800  00 00 01 ba 21 00 79 f3  09 80 10 69 00 00 01 e0  |....!.y....i....|
...
001db000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
...

IDTa.imgで001da800を見つけました。

hexdump -C IDTa.img |less
/001da800

出力:

001da800  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
001db000  00 00 01 ba 21 00 7b 00  bf 80 10 69 00 00 01 e0  |....!.{....i....|
...

もしそうなら、001da800の場所のデータはIDTa.isoファイルからIDTa.imgにコピーされませんでしたか?

IDTa.img.logをチェックしてください。

# Mapfile. Created by GNU ddrescue version 1.22
# Command line: ddrescue --fill-mode=? -b 2048 -v IDTa.iso IDTa.img IDTa.img.log
# Start time:   2021-06-28 13:52:39
# Current time: 2021-06-28 13:52:46
# Finished
# current_pos  current_status  current_pass
0x299F2000     +               1
#      pos        size  status
0x00000000  0x00008000  ?
0x00008000  0x001D2800  +
0x001DA800  0x00000800  ?
0x001DB000  0x00049000  +
...

そして現実の確認:

diff -q IDTa.img IDTa.img.backup

差は返されません。

アップデート2:

@Kamilはパラメータを削除してソリューションを編集しました(下記参照)--fill-mode=?。効果があるようです!

ベストアンサー1

私の考えでは、このことは自分でできると思いますddrescue。あなたはする必要があります--generate-mode

ddrescueoptions で呼び出されると、--generate-modeデフォルトの「構造モード」とは異なる「ビルドモード」で実行されます。つまり、「生成モード」ではddrescue何も保存されません。後で使用するために作成しようとしますmapfile

[… ]

ddrescue場合によっては、sumの(部分的な)コピーであるsummapfileから近似値を生成できます。これは、単に全てゼロを含むセクタが記憶されていないと仮定して行われる。infileoutfilemapfile

[… ]

ddrescue --generate-mode infile outfile mapfile

源泉)

場合に備えて、これら2つの画像をコピーしてください。ファイルシステムが CoW コピーをサポートしている場合は、cp --reflink=alwaysイメージごとにコピーがほぼ瞬時に行われます。

両方の画像のサイズが同じであることを確認する必要があります。そのうちの1つが小さい場合は拡大する必要があります。つまり、ゼロ(まれなゼロ)を追加する必要があります。このコードは自動的に実行されます(truncate必須)。

( f1=IDTa.img
  f2=IDTa.iso
  s1="$(wc -c <"$f1")"
  s2="$(wc -c <"$f2")"
  if [ "$s2" -gt "$s1" ]; then
    truncate -s "$s2" "$f1"
  else
    truncate -s "$s1" "$f2"
  fi
)

(サブシェルを使用しているため、変数が消え、メインシェルは影響を受けません。)

さて、ツールは最初の画像を分析し、修復されていないセクタを探します。

ddrescue --generate-mode -b 2048 -v /dev/sr1 IDTa.img new_mapfile

参考までに、new_mapfileこのファイルは新しいファイルです。いいえあなたのIDTa.ddrescue.log。触れないでくださいIDTa.ddrescue.log

new_mapfile作成されると、そのフラグメントが「救済済み」または「試行されていない」と見なされるかどうかに応じて、その中の行にステータスが+表示されます。?

IDTa.img今"試行されていない"チャンクをIDTa.iso。次のコマンドはこれを修正しますIDTa.img

IDTa.imgデータを読み取り、いわゆる「試行されていない」ブロックを回復しますIDTa.iso

ddrescue -b 2048 -v IDTa.iso IDTa.img new_mapfile

これで、変更されたコンテンツIDTa.imgと変更されていないコンテンツIDTa.ddrescue.logは間違っていないようにする必要があります。

メモ:

  • すべてゼロを含む一部のセクタが実際に保存されている可能性があります。--generate-modeとして分類してください。彼らは「無駄」からのデータ?でいっぱいになります。IDTa.iso他のファイルでもすべてゼロなので、最終結果には重要ではありません。
  • IDTa.iso全体的に合計を変更すると、結果は同じでなければなりませんIDTa.img(ただし、これは結果がに表示されることに注意してくださいIDTa.iso)。だから選択肢があります。最後のコマンドのワークロードを最小限--generate-modeに抑える必要があるため、すべてゼロを含むと予想されるセクタ数が少ないファイルを使用します。
  • このメソッドは、一般的なファイルIDTa.isoIDTa.img。役に立たddrescueない最初の場所truncate)。
  • 人を救おうとしてエラーを再現した後、プログラムをテストしてみました。タブレットデバイス

おすすめ記事