目的:确定主机硬盘文件是否完整,因此不需要重新复制。
在我的其他 1-2 个问题中,我询问了当使用“dd”命令 (sudo dd if=/dev/sdx bs=16M of=/dev/sdy) 时如果安装了一个或两个硬盘会发生什么情况。
之前,我在目标硬盘已安装时使用了该命令,这显然是一个错误。但是,主机硬盘并未安装。
我将再次执行复制(dd),但我需要知道在运行 dd 命令之后 HOST hdd 是否仍然 100% 完好无损,而目标 hdd 是唯一安装的 hdd。
如果之前未安装的 HOST hdd 在运行 dd 命令时发生了变化,那么我需要重新创建 HOST hdd,然后再将其复制到另一个 hdd。因此,我必须返回尽可能多的“原始来源”。但如果主机 hdd 很可能没有受到任何影响,那么我仍然可以使用该主机 hdd 进行另一次备份。
答案1
dd if=/dev/sdx of=/dev/sdy
读来自sdx
和写道至sdy
。您sdx
应该已经度过了这一难关并且没有改变其内容,除非:
sdx
有故障(如硬件故障),并且仅从中读取数据会使其故障更加严重;或者写入某个进程
sdx
(不一定以直接的方式)。dd
该过程可能与读取相同sdx
。写入sdy
可能意味着写入(部分)sdx
。通常,如果sdx
和sdy
实际上是sda
、sdb
等,则不应该发生这种情况。但是例如,您可以从设备(如sda
)读取并写入位于同一设备某处的已挂载文件系统中的文件。或者,您可以从设备读取并写入使用同一设备的 RAID 阵列。在这种情况下,写入目标意味着以隐式方式写入源。通常,最好知道您到底在读取什么以及在写入什么,以及两者之间的关系是什么;除非您真的知道自己在做什么并且知道这是您想要的,否则它们不应该“重叠”。sdx
或者另一个进程同时写入。请注意,这还包括sdx
对某个挂载文件系统一无所知但写入的进程sdx
(例如,sdx2
表示一部分(部分)sdx
。
如果你想复制一份设备,那么在复制过程中根本不应该写入设备。
dd
记住依次运行时发生的任何更改都dd
可能影响已读取的部分和尚未读取的部分。实际上,副本中的数据结构(如文件系统)可能最终变得不连贯,即使它们在源中在任何给定时间都是连贯的。图形模拟称为“全景失败“:现实(来源)在任何特定时间都是连贯的,但照片(目的地)看起来很奇怪,因为它们是由发生某些变化之前和之后获得的部分组成的。通常由于安装了源(的某些部分)而发生无效复制,因此该主题中最常见的建议是在使用 读取之前卸载源设备
dd
。
如果目标设备(sdy
在您的示例中)的(某些部分)已安装,dd
则写入会覆盖已安装的文件系统。它创建的副本可能会损坏,因为内核可能会将写入推送到文件系统,认为它仍然存在于设备上,而实际上dd
设法覆盖了它(的一部分)。这些写入会覆盖dd
写入的内容。内核可能会在从文件系统读取并获取不适合的数据时注意到文件系统有问题。即使内核在某个时候拒绝使用“消失”的文件系统,副本也可能已被以前的写入损坏。即使内核没有注意到,卸载的单独操作也可能会将一些数据写入目标设备并破坏dd
写入的内容。
但这只会影响副本。如果这是唯一的问题,那么您的源应该是完整的。
在我的观点卸载目标设备的建议很少被提及,因为它更直观、更明显:您将用完全不同的内容覆盖某些内容,因此您应该停止使用或依赖旧内容的任何事情。许多人往往不会说出他们认为显而易见的事情。