我dd
用来将数据从旧硬盘复制到新硬盘。我想确保数据的完整性是安全的。
关于这个答案,吉尔斯说
如果[dd]成功终止,则备份是正确的,除非出现硬件故障…
这到底是什么意思?是否dd
有某种内置验证?
如果要改用rsync,我也要进行第二遍--checksum
验证。这种偏执狂是合理的吗?
rsync
可能是最简单的。
我dd
用来将数据从旧硬盘复制到新硬盘。我想确保数据的完整性是安全的。
关于这个答案,吉尔斯说
如果[dd]成功终止,则备份是正确的,除非出现硬件故障…
这到底是什么意思?是否dd
有某种内置验证?
如果要改用rsync,我也要进行第二遍--checksum
验证。这种偏执狂是合理的吗?
rsync
可能是最简单的。
Answers:
dd
或您可能正在考虑的任何其他应用程序都没有“某种内置验证”:它不会从存储介质中读取数据来与写入的内容进行比较。这就是操作系统的工作。
实际上不可能从应用程序对硬件进行读取验证。在某些情况下,它可以工作,但在大多数情况下,它什么也做不了。如果将应用程序直接写到存储介质上,则该应用程序可以读回它刚刚写的内容,但这通常会从内存中的高速缓存读回,这并不能提供任何有用的保证。在示例中,您引用了,它dd
正在写入管道,在这种情况下,它无法控制下一行数据的处理方式。在您的rsync示例中,第二遍rsync --checksum
是没有意义的:从理论上讲它可能会捕获错误,但是在实践中,如果确实发生了错误,则第二遍可能不会报告任何错误,因此您将精力浪费在实际上没有提供有用保证的事情上。
但是,应用程序确实会验证数据发生了什么,即它们验证了操作系统已对数据承担责任。所有系统调用均返回错误状态。如果系统调用返回错误状态,则应用程序通常应通过显示错误消息并返回非零退出状态,将该错误传播给用户。
请注意,这dd
是个例外:根据命令行参数,dd
可能会忽略一些错误。这是非常不寻常的:这是dd
具有此属性的唯一常见命令。使用cat
代替dd
,这样您不会遭受腐败的风险,而且可能会更快。
在数据复制链中,可能会出现两种错误。
dd if=/dev/sdc of=/dev/sdb bs=4M
,所以我的理解是忽略错误和速度(或多或少,相比cat
)的问题尚无定论。您是说然后通过安装检查尺寸df
吗?
确保“唯一”的唯一方法是执行附加的读取和比较过程(在删除缓存之后)。
除此之外,dd
以与所有其他程序相同的方式检测读取和写入错误。对于那些无声地接收数据却没有实际写入数据的驱动器,您很不幸。
这种偏执狂是合理的吗?
如果您不相信自己的硬件可靠,那么事情就会变得复杂起来...
dd
检测错误。
dd
存在严重的数据损坏问题,但是诸如此类的特殊情况并不是问题的一部分。
dd
。真正的解决方案是使用任何东西,但dd
因为静默数据损坏是的特长dd
。
dd
忽略错误。您不能完全怪罪一个程序完全按照您的要求来做。
dd
不要忽略错误?不,conv=noerror
这不是正确的答案。参见弗罗斯特斯的答案。我做怪的设计dd
制作忽略错误默认模式,和一个不能在不知道其内部机制非常精确地关闭。
是的,有故障的硬件可能会以某种速率在数据中插入随机错误位,即每兆字节数一位,这是可能的,并且有时在实践中会发生。
通常,我通过重新读取源和目标,使用md5或sha1哈希来验证数据是否完整,例如:
dd if=/dev/sdb of=~/hd_backup
dd if=/dev/sdb | md5sum
dd if=~/hd_backup | md5sum
这假定数据比文件系统缓存大得多,否则,您可能需要重新启动系统以验证介质上的实际数据(而不是缓存内容),或使用其他系统。
来自man dd
:
完成后,dd将显示完整和部分输入和输出块,截断的输入记录以及奇数字节交换块的数量,以显示标准错误输出。
部分输入块是读取的内容小于输入块大小的部分。部分输出块是写入小于输出块大小的部分。磁带设备的部分输出块被认为是致命错误。否则,将写入其余的块。字符设备的部分输出块将产生警告消息。
dd
每次复制一个块时,验证输入/输出块大小是否匹配。如果没有,它将以警告或致命错误(以代替noerror
)处理错误。这就是为什么dd
几乎所有时间都能正常工作的原因。
尽管如此,它仍不能代替手动验证磁盘完整性的方法。如果信息对您有价值,那么可以,您的偏执是有道理的。dd
完成后运行手动验证。
dd
实际上并不能一直有效:使用bs
参数,它会忽略一些错误。