我有两个来自故障硬盘的部分磁盘映像。文件 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 位于两台不同的计算机上 - 这就是为什么我不只是告诉ddrescue
尝试填补 B 中的空白 - 但 A 可以是通过网络传输相对容易,稀疏。)
答案1
您的算法是在 GNU 中实现的dd
。
dd bs=512 if=A of=B conv=sparse,notrunc
请事先使用您选择的一些测试文件对此进行验证。您不想无意中损坏您的 File B
。更好的算法是检查B
该位置是否也有零,可惜这是不做dd
的。
对于两台不同的计算机,您有多种选择。使用支持写入查找的网络文件系统(并非全部支持);提前传输文件;或通过 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
选项启用压缩,否则您将通过网络传输千兆字节的零。