dd会进行任何形式的验证吗?


16

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

关于这个答案,吉尔斯说

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

这到底是什么意思?是否dd有某种内置验证?

如果要改用rsync,我也要进行第二遍--checksum验证。这种偏执狂是合理的吗?


定义“完整性是安全的”。
托尔比约恩Ravn的安徒生

@ThorbjørnRavnAndersen我的意思是,该副本与原始副本相同。
Sparhawk

如果只有平面文件,则复制文件的传统方法是使用tar或cpio。GNU tar有一个验证标志: gnu.org/software/tar/manual/html_section/tar_81.html。这些日子rsync可能是最简单的。
托尔比约恩Ravn的安徒生

1
“禁止硬件故障”表示它进行任何验证。如果这样做,则可以检测到硬件故障。
巴马尔(Barmar)'17年

Answers:


20

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

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

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

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

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

  • 腐败:传输过程中发生了一些翻转。无法在应用程序级别上对此进行验证,因为如果发生这种情况,则是由于编程错误或硬件错误而导致的,当回读时很可能导致相同的损坏。验证没有发生此类损坏的唯一有用方法是物理断开介质并重试,最好是在另一台计算机上,以防RAM出问题。
  • 截断:已复制的所有数据均已正确复制,但某些数据根本未复制。这一个有时值得一试,这取决于指令的复杂性。您无需读取数据即可:只需检查大小即可。

我相信大多数存储介质会使用足够的FEC来检测和纠正单比特翻转。
Gardenhead '17

2
当然,如果您用dd复制整个硬盘,然后立即比较硬盘,就知道它可以工作,因为缓存不够大。
约书亚记

1
感谢您的回答(+1)。我可能应该提到我使用的是相当基本的dd if=/dev/sdc of=/dev/sdb bs=4M,所以我的理解是忽略错误和速度(或多或少,相比cat)的问题尚无定论。您是说然后通过安装检查尺寸df吗?
Sparhawk

4

不,dd不做任何明确的验证。如果您想要/需要磁盘或其任何部分的经过司法鉴定的副本,请使用由美国国防部计算机鉴证实验室开发dcfldd的增强版本dd


4

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

除此之外,dd以与所有其他程序相同的方式检测读取和写入错误。对于那些无声地接收数据却没有实际写入数据的驱动器,您很不幸。

这种偏执狂是合理的吗?

如果您不相信自己的硬件可靠,那么事情就会变得复杂起来...


它比这更复杂,包括读取和比较以及dd检测错误。
吉尔斯(Gilles)'“ SO-别再邪恶了”

好吧,如果您走的那么远,则dd存在严重的数据损坏问题,但是诸如此类的特殊情况并不是问题的一部分。
弗罗斯特斯

这些损坏问题可以证明对使用产生的数据进行验证dd。真正的解决方案是使用任何东西,但dd因为静默数据损坏是的特长dd
吉尔(Gilles)'所以

2
@Gilles,或者只是不告诉dd忽略错误。您不能完全怪罪一个程序完全按照您的要求来做。
标记

@Mark那么,如何祈祷,告诉你dd不要忽略错误?不,conv=noerror这不是正确的答案。参见弗罗斯特斯的答案。我怪的设计dd制作忽略错误默认模式,和一个不能在不知道其内部机制非常精确地关闭。
吉尔斯(Gilles)'所以

2

是的,有故障的硬件可能会以某种速率在数据中插入随机错误位,即每兆字节数一位,这是可能的,并且有时在实践中会发生。

通常,我通过重新读取源和目标,使用md5或sha1哈希来验证数据是否完整,例如:

dd if=/dev/sdb of=~/hd_backup
dd if=/dev/sdb | md5sum
dd if=~/hd_backup | md5sum

这假定数据比文件系统缓存大得多,否则,您可能需要重新启动系统以验证介质上的实际数据(而不是缓存内容),或使用其他系统。


卸载/装载文件系统足以迫使操作系统将文件系统缓存写入设备。
miracle173

miracle173,但即使同步后,操作系统也不会将写入的内容保存在缓存中吗?所以我不确定卸载将清除RAM中的所有缓存。
马特

1

来自man dd

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

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

dd每次复制一个块时,验证输入/输出块大小是否匹配。如果没有,它将以警告或致命错误(以代替noerror)处理错误。这就是为什么dd几乎所有时间都能正常工作的原因。

尽管如此,它仍不能代替手动验证磁盘完整性的方法。如果信息对您有价值,那么可以,您的偏执是有道理的dd完成后运行手动验证。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.