当遇到输入/输出错误时 dd 会写什么?

当遇到输入/输出错误时 dd 会写什么?

我有一个驱动器即将发生故障(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,就会发生这种情况。

注意noerrorsyncPOSIX 要求fullblock不是。

我可以dd在复制失败的位置以较小的块大小运行以尝试从中获取更多数据吗?

理论上——是的。但这需要您手动使用skip=seek=,同时仍然处理上述问题。不要忘记您需要重新计算skipseek对应新的块大小。这是可能的,但您很快就会希望使该过程自动化。


现在将所有这些问题与 GNUddrescue默认行为进行比较:

  • 它会跳过读取错误;它稍后会回到“可疑”片段,尝试以越来越小的块来读取它们。
  • 无论如何,它都会保持适当的偏移。

相关内容