关于磁盘克隆工具有很多问题dd
,至少有人提出过一次。我已经考虑过使用dd
自己,主要是因为易于使用,而且它在几乎所有可引导的 Linux 发行版上都很容易获得。
dd
克隆磁盘的最佳方法是什么?我做了一个快速的谷歌搜索,第一个结果是一个明显的失败尝试。使用后有什么我需要做的吗dd
,即有什么不能阅读的内容dd
吗?
关于磁盘克隆工具有很多问题dd
,至少有人提出过一次。我已经考虑过使用dd
自己,主要是因为易于使用,而且它在几乎所有可引导的 Linux 发行版上都很容易获得。
dd
克隆磁盘的最佳方法是什么?我做了一个快速的谷歌搜索,第一个结果是一个明显的失败尝试。使用后有什么我需要做的吗dd
,即有什么不能阅读的内容dd
吗?
dd 无疑是最好的克隆工具,只需使用以下命令即可创建 100% 副本。我从来没有遇到过任何问题。
请注意,在克隆每个字节时,您不应在正在使用的驱动器或分区上使用它。特别是像数据库这样的应用程序不能很好地处理这个问题,你最终可能会得到损坏的数据。
为了节省空间,您可以使用 gzip 压缩 dd 生成的数据,例如:
您可以使用以下方法恢复磁盘:
为了节省更多空间,请事先对您要克隆的驱动器/分区进行碎片整理(如果合适),然后将所有剩余的未使用空间清零,使 gzip 更容易压缩:
稍等一下, dd 最终将失败并显示“磁盘已满”消息,然后:
此外,您可以通过使用 kill 命令向其发送信号来让 dd 进程在后台运行以报告状态,例如:
检查您的系统 - 上述命令适用于 Linux、OSX 和 BSD dd 命令,它们接受的信号不同(OSX 使用
SIGINFO
- 您可以按Ctrl+T报告状态)。注意:dd'ing 实时文件系统可能会损坏文件。原因很简单,它不了解可能正在进行的文件系统活动,也没有尝试减轻它。如果写入部分正在进行,您将获得部分写入。这通常对事物不利,对数据库通常是致命的。此外,如果你搞砸了容易出现拼写错误的if和of参数,那你就有祸了。在大多数情况下,rsync是在多任务出现之后编写的同样有效的工具,并且将提供单个文件的一致视图。
但是,DD 应该准确地捕获未安装驱动器的位状态。引导加载程序、llvm 卷、分区 UUID 和标签等。只需确保您有一个能够逐位镜像目标驱动器的驱动器。
用于
dd
克隆可能包含坏扇区的磁盘时,conv=noerror,sync
请确保它在遇到错误时不会停止,并用空字节填充丢失的扇区。如果尝试从故障或故障磁盘中恢复,这通常是我采取的第一步 - 在进行任何恢复尝试之前获取副本,然后在良好(克隆的)磁盘上进行恢复。我把它留给恢复工具来处理任何无法复制的空白扇区。此外,您可能会发现
dd
的速度会受到 bs(块大小)设置的影响。我通常会尝试bs=32768
,但您可能想在自己的系统上对其进行测试,看看哪种方法最适合您。(这假设您出于其他原因不需要使用特定的块大小,例如,如果您正在写入磁带。)要克隆磁盘,您真正需要做的就是指定 dd 的输入和输出:
当然,请确保您具有直接从 /dev/hdb 读取的适当权限(我建议以 root 身份运行),并且 /dev/hdb未挂载(您不想在磁盘运行时复制正在更改 - 安装为只读也是可以接受的)。完成后,image.img 将是整个磁盘的逐字节克隆。
使用 dd 克隆磁盘有一些缺点。首先, dd 将复制整个磁盘,甚至是空白空间,如果在大磁盘上完成,可能会导致图像文件非常大。其次, dd 绝对不提供进度指示,这可能会令人沮丧,因为复制需要很长时间。第三,如果您将此映像复制到其他驱动器(同样,使用 dd),它们必须与原始磁盘一样大或更大,但您将无法使用目标磁盘上可能拥有的任何额外空间,直到您调整分区大小。
您还可以执行直接磁盘到磁盘复制:
但是您仍然受到上述关于可用空间的限制。
就问题或陷阱而言,dd 在大多数情况下都做得很好。然而,前段时间我有一个硬盘快要死了,所以我用 dd 尝试在它完全死之前复制我能从它那里得到的信息。后来得知 dd 不能很好地处理读取错误——磁盘上有几个扇区 dd 无法读取,导致 dd 放弃并停止复制。当时我找不到告诉 dd 继续的方法,尽管遇到了读取错误(尽管它看起来好像确实有那个设置),所以我花了很多时间手动指定跳过并寻求跳过不可读的部分。
我花了一些时间研究这个问题的解决方案(在我完成任务之后),我发现了一个名为ddrescue的程序,根据该站点,它的操作类似于 dd 但即使遇到错误也会继续阅读。我从未真正使用过该程序,但值得考虑,特别是如果您要从中复制的磁盘是旧的,即使系统看起来很好,它也可能有坏扇区。
如果源驱动器完全损坏,使用
dd_rhelp
withdd_rescue
(我的个人偏好)或 GNU会有更多的运气ddrescue
。这背后的原因是,在读取错误时,
dd
不断尝试和尝试 - 可能会等待很长时间才能发生超时。dd_rescue
做一些聪明的事情,比如读取一个错误,然后在磁盘上选择一个位置并向后读取到最后一个错误,并且dd_rhelp
基本上是一个dd_rescue
会话管理器 - 巧妙地开始和恢复dd_rescue
运行以使其再次更快。的最终结果
dd_rhelp
是在最短的时间内恢复了最大的数据。如果您离开dd_rhelp
运行,最终它会执行与同一时间完全相同的工作dd
。但是,如果dd
在 100Gb 磁盘的第 100 字节处遇到读取错误,则您必须等待很长时间才能恢复其他 9,999,900 字节*,而dd_rhelp
+dd_rescue
会更快地恢复大部分数据。源磁盘不能有任何挂载的文件系统。作为能够读取块设备的用户(root 工作),运行 'dd if=/dev/sda ....'
现在,这里的一个巧妙的事情是你正在创建一个字节流......你可以用它做很多事情:压缩它,通过网络发送它,将它分成更小的 blob,等等。
例如:
但更强大的是:
以上将源硬盘驱动器的压缩映像复制到远程系统,并使用源主机的名称将其存储在编号为 2G 的块中,同时让您随时了解进度。
请注意,这取决于磁盘的大小、源上的 cpu 速度、目标上的 cpu 速度、网络速度等。您可能想要跳过压缩,或者在远程端进行压缩,或者启用 ssh 的压缩。
这将复制磁盘,并跳过有错误的块,这非常重要。
这些是使用 dd 克隆或拯救磁盘的基本和必要选项。
我不想发布另一个答案,但是在已经发布的 25 个中,基本的“conv=sync,noerror”选项没有很好的答案。
要克隆磁盘,您真正需要做的就是指定输入和输出
dd
:当然,请确保您具有直接读取的适当权限
/dev/hdb
(我建议以 root 身份运行),并且/dev/hdb
未安装(您不想在更改磁盘时复制)。一旦完成,hdb.img
将是整个磁盘的逐字节克隆。dd
使用克隆磁盘有一些缺点。首先,dd
将复制整个磁盘,甚至是空白空间,如果在大磁盘上完成可能会导致图像文件非常大。其次,dd
完全没有提供进度指示,这可能会令人沮丧,因为复制需要很长时间。第三,如果您将此映像复制到其他驱动器(同样,使用 dd),它们必须与原始磁盘一样大或更大,但您将无法使用目标磁盘上可能拥有的任何额外空间,直到您调整分区大小。您还可以执行直接磁盘到磁盘复制:
但是您仍然受到上述关于可用空间的限制。
第一个缺点可以通过在制作副本时压缩数据来解决。例如:
第二个缺点可以通过使用 pipeview (
pv
) 工具来解决。例如:我知道没有办法克服第三个缺点。
dd
此外,您可以通过告诉处理更大的数据块来加快复制时间。例如:使用 dd 和救援磁盘可以做的另一件好事是通过网络复制数据:
如果网络不是本地的,您可以在这两个管道中使用 gzip。为了进步,请使用
pv
. 要使 local_machine 的 netcat 在完成复制后退出,您可以添加-w 5
或其他内容。