故障したハードドライブの部分ディスクイメージが2つあります。ファイルBには、セクターの読み取りに失敗したスペースを含むほとんどのディスクが含まれています。ファイルAは、次のように述べた結果です。ddrescue
失敗したセクタはすべて再試行されるため、ほぼ完全に空白がありますが、再読み込みに成功したいくつかのセクタが含まれています。これで、ファイルAの興味深いコンテンツを再度ファイルBにマージする必要があります。アルゴリズムは簡単です。
while not eof(A):
read 512 bytes from A
if any of them are nonzero:
seek to corresponding offset in B
write bytes into B
そして私できるこの記事を自分で書くために席に座っていましたが、すでに書いてデバッグした人がいるかどうかを最初に知りたいです。
(複雑なことに、ファイルBとファイルAは、限られたスペースのために2台の異なるコンピュータにあります。これはddrescue
Bの空白を埋めようとするのではなく、Aは比較的簡単にネットワーク経由で転送できるということです。)
答え1
あなたのアルゴリズムはGNUとして実装されましたdd
。
dd bs=512 if=A of=B conv=sparse,notrunc
選択したいくつかのテストファイルを使用して、事前に確認してください。誤ってファイルを破損したくありませんB
。より良いアルゴリズムは、B
その場所にもゼロがあることを確認することですが、残念ながらこれはdd
行われません。
2台の異なるコンピュータにはいくつかのオプションがあります。書き込みナビゲーションをサポートするネットワークファイルシステムを使用してください(すべてサポートされているわけではありません)。次のようにファイルを事前に転送するか、SSH経由で転送します。
dd if=A | ssh -C B-host dd of=B conv=sparse,notrunc
# or the other way around
ssh -C A-host dd if=A | dd of=B conv=sparse,notrunc
このssh -C
オプションを使用すると圧縮が可能です。それ以外の場合は、ネットワークを介してギガバイト単位のゼロを送信します。