“dd”是制作 SSD 映像的可靠工具吗?

use*_*052 14 backup ssd dd hard-disk

我想使用 Linuxdd命令备份我的 SSD ,但我不确定该方法的可靠性。我想我读过的地方dd没有检查或报告错误,所以很明显,如果是真的,那么这将是一个交易破坏者。

这将是命令:

sudo dd status=progress bs=512K if=/dev/nvme0n1 of=/media/d/ssd.img

因此,请解释该dd命令对于所述用例的可靠性。

而且,有没有更可靠和/或更简单的替代方案?

Nor*_*tfi 27

TLDR:使用 ddrescue

它支持恢复/继续功能,具有自动日志和大量其他选项。更多在ddrescue 主页

示例语法:

ddrescue /dev/sde yourimagename.image sde.log
Run Code Online (Sandbox Code Playgroud)

如果您想(根据您的评论提到恢复)将图像从上面的命令恢复到另一个完全相同大小的驱动器上:

ddrescue -f yourimagehere.image /dev/sde restore.logfile
Run Code Online (Sandbox Code Playgroud)

此外,比 dd 更快——至少在比较ddrescuedd+ 的速度时看起来确实如此pv

  • 如果你使用 `bs=128k` 或其他东西,简单的 `dd` 会很快,在 128kiB 块而不是默认的 512 字节扇区中进行读/写系统调用。(大约一半的 CPU 二级缓存大小是每个系统调用开销与内核的 copy_to_user / copy_from_user 缓存命中之间的一个很好的权衡)。将它通过 `pv` 显然会花费更多的 CPU 时间,尽管如果你运行 `pv` 让它攻击一个已经运行的进程(查看 `/proc/<PID>/fdinfo` 中的文件位置),那么它就可以避免这种情况内存带宽成本。我假设 `ddrescue` 默认选择一个合理的块大小。 (8认同)
  • @PeterCordes OTOH,由于诸如`-S` 选项之类的东西,你可以使`ddrescue` 比普通`dd` 更快,并且能够做一些其他有用的事情,比如预先分配输出文件或绕过操作系统的页面缓存。 (2认同)
  • 如果您只想要进度统计信息,GNU `dd status=progress` 显示它正在做什么。你不需要“pv”。(甚至在任何 Unix 上,您都可以随时使用“ls -l”输出文件。) (2认同)

小智 5

关于“不检查或报告错误”的原始评论可能是因为默认情况下“dd”不会填充坏读取,因此对于面向块的设备不仅坏块而且所有后续块都将是不正确的(因为它们是不再对齐)。正如其他人所说,这是可以使用 'conv=noerror,sync' 选项修复的,该选项告诉 dd 确保块保留在块边界上。它应该通过与文件系统块大小匹配的块大小设置加入,通常为 4096 字节,但可以更低。

我同意 Johan Myréen 关于使用文件备份的评论,因为备份的粒度要小得多 - 备份一个文件的错误不一定会影响其他文件。您还可以使用对文件数据进行纠错的文件系统(例如 zfs、btrfs 和其他一些配置),因此至少您知道何时发生错误并希望可以修复它们。

检测错误备份的另一种方法是使用消息摘要哈希代码,例如原始设备(未安装!!)和 dd 备份文件上的“sha256”……它们当然应该是相同的。

最后,备份的最佳实践永远不要只依赖一个备份……至少保留 2 个!

  • 存在 [dd conv noerror sync 数据损坏的风险](https://superuser.com/a/1075837/195171) - 添加 conv=f​​ullblock 或使用 ddrescue (7认同)