dd 是否进行任何类型的验证?

dd 是否进行任何类型的验证?

我用来dd将数据从旧硬盘复制到新硬盘。我想确保数据的完整性是安全的。

对此回答,吉尔斯说

如果 [dd] 成功终止,则备份正确,除非出现硬件故障……

这究竟意味着什么?是否dd有某种内置验证?

如果我要使用 rsync,我--checksum也会运行第二遍来进行验证。这种偏执有道理吗?

答案1

dd或者任何其他应用程序都没有您可能想到的“某种内置验证”:它不会从存储介质读回数据来与写入的数据进行比较。这就是操作系统的工作。

实际上不可能从应用程序对硬件进行读取验证。它在某些情况下会起作用,但在大多数情况下它不会有任何效果。应用程序可以读回刚刚写入的内容如果直接写入存储介质,但这通常会从内存缓存中读回,这不会提供任何有用的保证。在你引用的例子dd正在写入管道,在这种情况下,它无法控制接下来的数据会发生什么。在您的 rsync 示例中,第二遍rsync --checksum是毫无意义的:理论上它可以捕获错误,但实际上,如果确实发生错误,那么第二遍可能不会报告任何错误,因此您在浪费精力实际上并没有提供有用的保证。

然而,应用程序验证数据发生了什么,即验证操作系统已接受对数据的责任。所有系统调用都会返回错误状态。如果系统调用返回错误状态,则应用程序应将该错误传播给用户,通常是通过显示错误消息并返回非零退出状态。

请注意,这dd是一个例外:根据命令行参数,dd可能会忽略一些错误。这是非常不寻常的:dd是唯一具有此属性的常见命令。使用cat而不是dd,这样您就不会冒损坏的风险,它可能会更快

在数据复制链中,可能会出现两种错误。

  • 损坏:传输期间翻转了一位。无法在应用程序级别验证这一点,因为如果发生这种情况,则是由于编程错误或硬件错误造成的,在读回时很可能会导致相同的损坏。验证没有发生此类损坏的唯一有用方法是物理断开介质连接并重试,最好在另一台计算机上重试,以防问题出在 RAM 上。
  • 截断:所有复制的数据都被正确复制,但有些数据根本没有复制。这个有时值得检查,具体取决于命令的复杂性。您不需要读取数据来执行此操作:只需检查大小即可。

答案2

不,dd不进行显式验证。如果您想要/需要经过取证验证的磁盘或其任何部分的副本,请使用由美国国防部计算机取证实验室开发的dcfldd增强版本。dd

答案3

“确定”的唯一方法是执行额外的读取和比较过程(在删除缓存之后)。

除此之外,dd以与所有其他程序相同的方式检测读取和写入错误......如果驱动器(和其他涉及的组件)报告错误,它就会起作用;对于以静默方式接受数据而不实际写入数据的驱动器,您就不走运了。

这种偏执有道理吗?

如果您不能相信您的硬件是可靠的,事情就会变得复杂......

答案4

man dd

完成后,dd 将完整和部分输入和输出块、截断的输入记录和奇数长度字节交换块的数量显示到标准错误输出。

部分输入块是读取小于输入块大小的输入块。部分输出块是写入小于输出块大小的输出块。磁带设备的部分输出块被视为致命错误。否则,将写入块的其余部分。字符设备的部分输出块将产生警告消息。

dd每次复制块时都会验证输入/输出块大小是否匹配。如果不这样做,它会通过警告或致命错误来处理错误(用 覆盖noerror)。这就是为什么dd几乎一直有效的原因。

尽管如此,它并不能取代手动验证磁盘完整性的操作。如果该信息对您有价值,那么是的,你的偏执是有道理的dd.完成后运行手动验证。

相关内容