我有一个驱动器即将发生故障(C5 和 C6 被触发),因此我决定趁还能进行时再进行一次备份。为此,我使用 dd 到另一个完全相同型号的驱动器。正如预期的那样,我有一些输入/输出错误,我想知道 dd 遇到错误时会做什么。它是否只是跳过该扇区而不写入任何内容?或者它是否用 0 替换目标驱动器上先前的数据?
另外,由于我使用的是 64K 块,我可以在复制失败的位置使用较小的块大小运行 dd 来尝试从中获取更多数据吗?
答案1
正如评论中提到的,GNUddrescue
对于这个用例来说是一个更好的工具。无论如何,让我回答你的明确问题dd
。
我想知道,
dd
遇到错误时怎么办
它退出,除非conv=noerror
给出,这使得工具忽略输入错误。假设noerror
给出了并且发生了输入错误。然后
它是否只是跳过该扇区而不写入任何内容?或者它是否用 0 替换目标驱动器上先前的数据?
这取决于你是否使用过conv=sync
。如果这样做,dd
会将每个输入块填充到ibs=
,并附加空字节。我猜测如果ibs
等于源块设备的扇区大小,那么这将使您的输出流与输入保持同步,以防出现读取错误。但如果错误,ibs
读取错误很可能会使流不同步,就像这个优秀的答案。看来iflag=fullblock
有帮助。
此外,sync
即使没有读取错误,输出也可能大于输入;如果最后一个块在ibs
缓冲区变满之前到达 EOF,就会发生这种情况。
注意noerror
和sync
是POSIX 要求,fullblock
不是。
我可以
dd
在复制失败的位置以较小的块大小运行以尝试从中获取更多数据吗?
理论上——是的。但这需要您手动使用skip=
和seek=
,同时仍然处理上述问题。不要忘记您需要重新计算skip
并seek
对应新的块大小。这是可能的,但您很快就会希望使该过程自动化。
现在将所有这些问题与 GNUddrescue
默认行为进行比较:
- 它会跳过读取错误;它稍后会回到“可疑”片段,尝试以越来越小的块来读取它们。
- 无论如何,它都会保持适当的偏移。