dd 做任何类型的验证吗?

Spa*_*awk 18 dd verification integrity

我正在使用dd将数据从旧硬盘驱动器复制到新硬盘驱动器。我想确保数据的完整性是安全的。

关于这个答案,吉尔斯说

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

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

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

Gil*_*il' 20

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

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

但是,应用程序确实会验证数据发生了什么,从某种意义上说,它们会验证操作系统是否已接受对数据的责任。所有系统调用都返回错误状态。如果系统调用返回错误状态,应用程序应该将该错误传播给用户,通常是通过显示错误消息并返回非零退出状态。

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

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

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

  • 当然,如果您使用 dd 复制整个硬盘,然后立即比较硬盘,您知道它可以工作,因为缓存不够大。 (2认同)
  • 感谢您的回答(+1)。我可能应该提到我正在使用一个相当基本的`dd if=/dev/sdc of=/dev/sdb bs=4M`,所以我的理解是忽略错误和速度的问题(或多或少,与`猫`)没有实际意义。您是说通过安装“df”来检查大小吗? (2认同)

fpm*_*phy 6

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


fro*_*utz 6

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

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

这种偏执有道理吗?

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

  • @Gilles,或者只是不告诉“dd”忽略错误。你不能完全责怪一个程序完全按照你的要求去做。 (2认同)

归档时间:

查看次数:

10035 次

最近记录:

8 年,4 月 前