
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
。
ddrescue
options で呼び出されると、--generate-mode
デフォルトの「構造モード」とは異なる「ビルドモード」で実行されます。つまり、「生成モード」ではddrescue
何も保存されません。後で使用するために作成しようとしますmapfile
。[… ]
ddrescue
場合によっては、sumの(部分的な)コピーであるsummapfile
から近似値を生成できます。これは、単に全てゼロを含むセクタが記憶されていないと仮定して行われる。infile
outfile
mapfile
[… ]
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.iso
とIDTa.img
。役に立たddrescue
ない最初の場所truncate
)。 - 人を救おうとしてエラーを再現した後、プログラムをテストしてみました。タブレットデバイス。