使用 DD 进行磁盘克隆

使用 DD 进行磁盘克隆

关于磁盘克隆工具,有很多问题,dd至少有人提出过一次。我已经考虑dd自己使用它,主要是因为它易于使用,而且几乎所有可启动的 Linux 发行版都可以使用它。

dd克隆磁盘的最佳方法是什么?我快速进行了 Google 搜索,第一个结果显然是失败的尝试。使用后我需要做什么dd,即是否有一些内容无法使用来读取dd

答案1

dd 无疑是最好的克隆工具,只需使用以下命令,它就会创建 100% 的副本。我从来没有遇到过任何问题。

dd if=/dev/sda of=/dev/sdb bs=32M status=progress

请注意,在克隆每个字节时,您不应在正在使用的驱动器或分区上使用它。尤其是数据库等应用程序无法很好地处理这种情况,最终可能会导致数据损坏。

答案2

为了节省空间,您可以使用 gzip 压缩 dd 生成的数据,例如:

dd if=/dev/hdb | gzip -c  > /image.img.gz

您可以使用以下方法恢复磁盘:

gunzip -c /image.img.gz | dd of=/dev/hdb

为了节省更多空间,请预先对要克隆的驱动器/分区进行碎片整理(如果合适),然后将所有剩余未使用的空间清零,以使 gzip 更容易压缩:

mkdir /mnt/hdb
mount /dev/hdb /mnt/hdb
dd if=/dev/zero of=/mnt/hdb/zero

稍等片刻,dd 最终会失败并显示“磁盘已满”消息,然后:

rm /mnt/hdb/zero
umount /mnt/hdb
dd if=/dev/hdb | gzip -c  > /image.img.gz

另外,你可以让 dd 进程在后台运行,通过使用 kill 命令向其发送信号来报告状态,例如:

dd if=/dev/hdb of=/image.img &
kill -SIGUSR1 1234

检查您的系统 - 上述命令适用于 Linux,OSX 和 BSD dd 命令在它们接受的信号上有所不同(OSX 使用SIGINFO- 您可以按Ctrl+T来报告状态)。

答案3

警告:对实时文件系统进行 dd 操作可能会损坏文件。原因很简单,它无法理解可能正在进行的文件系统活动,也不会尝试缓解这种活动。如果写入操作部分正在进行,您将得到部分写入。这通常对事情不利,并且通常对数据库来说是致命的。此外,如果您搞砸了容易出现拼写错误的如果参数,你就会倒霉了。在大多数情况下,同步是同样有效的工具,在多任务,并将提供各个文件的一致视图。

但是,DD 应该能够准确捕获未安装驱动器的位状态。引导加载程序、llvm 卷、分区 UUID 和标签等。只需确保您拥有能够逐位镜像目标驱动器的驱动器即可。

答案4

要克隆磁盘,您真正需要做的就是指定 dd 的输入和输出:

dd if=/dev/hdb of=/image.img

当然,请确保您具有直接从 /dev/hdb 读取的适当权限(我建议以 root 身份运行),并且 /dev/hdb未安装(您不想在磁盘更改时进行复制 - 以只读方式安装也是可以接受的。)完成后,image.img 将是整个磁盘的逐字节克隆。

使用 dd 克隆磁盘有几个缺点。首先,dd 会复制整个磁盘,甚至是空白空间,如果在大型磁盘上执行此操作,则会产生非常大的映像文件。其次,dd 完全不提供进度指示,这可能会令人沮丧,因为复制需要很长时间。第三,如果您将此映像复制到其他驱动器(再次使用 dd),它们必须与原始磁盘一样大或更大,但在调整分区大小之前,您将无法使用目标磁盘上的任何额外空间。

您还可以直接进行磁盘到磁盘的复制:

dd if=/dev/hdb of=/dev/hdc

但您仍然受到上述有关可用空间的限制。

就问题或陷阱而言,dd 在大多数情况下表现非常出色。然而,不久前我的一个硬盘快要坏了,所以我用 dd 尝试在硬盘完全坏掉之前复制我能复制的信息。后来我了解到 dd 不能很好地处理读取错误 - 磁盘上有几个扇区 dd 无法读取,导致 dd 放弃并停止复制。当时我找不到一种方法告诉 dd 继续执行,尽管遇到了读取错误(尽管它出现好像它确实有那个设置),所以我花了相当多的时间手动指定跳过并寻求跳过不可读的部分。

我花了一些时间研究这个问题的解决方案(在我完成任务之后),我发现了一个名为救援,据该网站称,它的操作方式与 dd 类似,但即使遇到错误也会继续读取。我从未真正使用过该程序,但值得考虑,特别是如果你要复制的磁盘很旧,即使系统看起来正常,也可能有坏扇区。

相关内容