AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 4906
Accepted
falstro
falstro
Asked: 2009-05-06 10:21:52 +0800 CST2009-05-06 10:21:52 +0800 CST 2009-05-06 10:21:52 +0800 CST

使用 DD 进行磁盘克隆

  • 772

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

dd克隆磁盘的最佳方法是什么?我做了一个快速的谷歌搜索,第一个结果是一个明显的失败尝试。使用后有什么我需要做的吗dd,即有什么不能阅读的内容dd吗?

disk-image dd
  • 29 29 个回答
  • 556864 Views

29 个回答

  • Voted
  1. Best Answer
    Adam Gibbins
    2009-05-06T10:31:57+08:002009-05-06T10:31:57+08:00

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

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

    请注意,在克隆每个字节时,您不应在正在使用的驱动器或分区上使用它。特别是像数据库这样的应用程序不能很好地处理这个问题,你最终可能会得到损坏的数据。

    • 203
  2. David Hicks
    2009-05-07T14:47:31+08:002009-05-07T14:47:31+08:00

    为了节省空间,您可以使用 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
    

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

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

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

    • 135
  3. jldugger
    2009-05-06T12:20:34+08:002009-05-06T12:20:34+08:00

    注意:dd'ing 实时文件系统可能会损坏文件。原因很简单,它不了解可能正在进行的文件系统活动,也没有尝试减轻它。如果写入部分正在进行,您将获得部分写入。这通常对事物不利,对数据库通常是致命的。此外,如果你搞砸了容易出现拼写错误的if和of参数,那你就有祸了。在大多数情况下,rsync是在多任务出现之后编写的同样有效的工具,并且将提供单个文件的一致视图。

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

    • 47
  4. TimB
    2009-05-07T18:42:47+08:002009-05-07T18:42:47+08:00

    用于dd克隆可能包含坏扇区的磁盘时,conv=noerror,sync请确保它在遇到错误时不会停止,并用空字节填充丢失的扇区。如果尝试从故障或故障磁盘中恢复,这通常是我采取的第一步 - 在进行任何恢复尝试之前获取副本,然后在良好(克隆的)磁盘上进行恢复。我把它留给恢复工具来处理任何无法复制的空白扇区。

    此外,您可能会发现dd的速度会受到 bs(块大小)设置的影响。我通常会尝试bs=32768,但您可能想在自己的系统上对其进行测试,看看哪种方法最适合您。(这假设您出于其他原因不需要使用特定的块大小,例如,如果您正在写入磁带。)

    • 32
  5. Kyle Cronin
    2009-05-06T10:26:44+08:002009-05-06T10:26:44+08:00

    要克隆磁盘,您真正需要做的就是指定 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 继续的方法,尽管遇到了读取错误(尽管它看起来好像确实有那个设置),所以我花了很多时间手动指定跳过并寻求跳过不可读的部分。

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

    • 19
  6. Ben Williams
    2009-05-31T18:12:25+08:002009-05-31T18:12:25+08:00

    如果源驱动器完全损坏,使用dd_rhelpwith dd_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会更快地恢复大部分数据。

    • 14
  7. retracile
    2009-05-30T11:23:34+08:002009-05-30T11:23:34+08:00

    源磁盘不能有任何挂载的文件系统。作为能够读取块设备的用户(root 工作),运行 'dd if=/dev/sda ....'

    现在,这里的一个巧妙的事情是你正在创建一个字节流......你可以用它做很多事情:压缩它,通过网络发送它,将它分成更小的 blob,等等。

    例如:

    dd if=/dev/sda | ssh user@backupserver "cat > backup.img"
    

    但更强大的是:

    dd if=/dev/sda | pv -c | gzip | ssh user@backupserver "split -b 2048m -d - backup-`hostname -s`.img.gz"
    

    以上将源硬盘驱动器的压缩映像复制到远程系统,并使用源主机的名称将其存储在编号为 2G 的块中,同时让您随时了解进度。

    请注意,这取决于磁盘的大小、源上的 cpu 速度、目标上的 cpu 速度、网络速度等。您可能想要跳过压缩,或者在远程端进行压缩,或者启用 ssh 的压缩。

    • 9
  8. Sam Watkins
    2014-11-13T18:47:35+08:002014-11-13T18:47:35+08:00
    dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror
    

    这将复制磁盘,并跳过有错误的块,这非常重要。

    这些是使用 dd 克隆或拯救磁盘的基本和必要选项。

    我不想发布另一个答案,但是在已经发布的 25 个中,基本的“conv=sync,noerror”选项没有很好的答案。

    • 7
  9. James Sumners
    2009-05-30T14:03:58+08:002009-05-30T14:03:58+08:00

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

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

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

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

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

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

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

    第一个缺点可以通过在制作副本时压缩数据来解决。例如:

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

    第二个缺点可以通过使用 pipeview ( pv) 工具来解决。例如:

    dd if=/dev/hdb | (pv -s `fdisk -l /dev/hdb | grep -o '[0-9]*\{1\} MB' | awk '{print $1}'`m) | cat > hdb.img
    

    我知道没有办法克服第三个缺点。

    dd此外,您可以通过告诉处理更大的数据块来加快复制时间。例如:

    dd if=/dev/hdb of=hdb.img bs=1024
    
    • 6
  10. user5692
    2009-05-30T10:09:14+08:002009-05-30T10:09:14+08:00

    使用 dd 和救援磁盘可以做的另一件好事是通过网络复制数据:

    remote_machine$ nc -l -p 12345
    
    local_machine$ dd if=/dev/sda | nc remote_machine 12345
    

    如果网络不是本地的,您可以在这两个管道中使用 gzip。为了进步,请使用pv. 要使 local_machine 的 netcat 在完成复制后退出,您可以添加-w 5或其他内容。

    • 5

相关问题

  • 如何在 Windows 7 中挂载 CD/DVD ISO?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve