it-swarm.cn

使用DD进行磁盘克隆

关于磁盘克隆工具,存在许多问题,建议至少使用dd。我已经考虑过使用dd了,主要是因为易于使用,并且几乎在所有可启动的Linux发行版中都可以使用它。

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

187
falstro

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

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

请注意,克隆每个字节时,请勿在正在使用的驱动器或分区上使用它。尤其是数据库之类的应用程序无法很好地解决这一问题,您最终可能会损坏数据。

165
Adam Gibbins

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

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

您可以使用以下方法还原磁盘:

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

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

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

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

119
David Hicks

[〜#〜]警告[〜#〜]:实时文件系统可能会损坏文件。原因很简单,它不了解可能正在进行的文件系统活动,也没有尝试缓解它。如果正在进行部分写入,则将获得部分写入。这通常对事物不利,并且通常对数据库是致命的。而且,如果您搞错了容易错字的ifof参数,您会感到困扰。在大多数情况下,rsync是在 multitasking 出现之后编写的同等有效的工具,它将提供单个文件的一致视图。

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

39
jldugger

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

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

26
TimB

要克隆磁盘,您真正需要做的就是将输入和输出指定为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,但是即使遇到一个错误。我从未真正使用过该程序,但是值得考虑,特别是如果您要从中复制的磁盘是旧的,即使系统看起来正常,该磁盘也可能有坏扇区。

17
Kyle Cronin

如果源驱动器完全损坏,则使用 dd_rhelpdd_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会快速恢复大量数据。

11
Ben Williams

源磁盘不得具有任何已挂载的文件系统。以能够读取块设备(root用户)的用户身份,运行“ dd if =/dev/sda ....”。

现在,这里的一件整洁的事情是您正在创建字节流...并且您可以做很多事情:压缩它,通过网络发送它,将它分块成较小的blob等。

例如:

dd if=/dev/sda | ssh [email protected] "cat > backup.img"

但更强大:

dd if=/dev/sda | pv -c | gzip | ssh [email protected] "split -b 2048m -d - backup-`hostname -s`.img.gz"

上面的代码将源硬盘驱动器的压缩映像复制到远程系统,在该系统中,使用源主机的名称将其存储在编号为2G的块中,同时使您随时了解最新情况。

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

7
retracile

要克隆磁盘,您真正需要做的就是指定输入和输出到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

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

第一个缺点可以通过在复制时将数据gzip压缩来解决。例如:

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

第二个缺点可以通过使用管道视图(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
James Sumners

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
user5692

请记住,dd会生成精确副本,包括所有空白。

这意味着:

  1. 第二驱动器必须至少与第一驱动器一样大
  2. 如果第二个驱动器更大,则会浪费额外的空间(可以扩展文件系统)
  3. 如果源驱动器未满,dd将浪费大量时间复制空白空间。
  4. 您可以通过这种方式复制整个驱动器或单个分区。
  5. 如果这是可引导驱动器,我敢肯定您在使用dd之后需要安装引导加载程序

希望对您有所帮助

4
Brent
dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror

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

这些是使用dd克隆或救援磁盘的基本和必不可少的选项。

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

4
Sam Watkins

你实际上可以尝试这样的事情

 dd if = // dev/sdb2 of =/dev/sda2 bs = 4096 conv = sync,noerror 

跳过所有错误并完全克隆分区或硬盘驱动器

3
hirol

另一个重要功能是复制MBR,分区表和引导记录。

只是

dd if=/dev/sda of=parttable bs=512 count=1

以及撰写时的其他方向。之后用fdisk波兰语。

备份分区表后,您会感到更加安全。

而且,它使迁移到另一个硬盘驱动器(同时更改分区结构)变得很有趣。

3
alamar

为了将来参考,请签出 ddrescue 。它挽救了我一天的时间。

3
Anders Hansson

这是一种廉价的黑客手段,但它是监视DD进程的快速而肮脏的方法。

运行您的dd命令。打开一个新的Shell并执行ps awx查找dd进程的PID。现在在新的Shell型手表中-n 10 kill -USR1 {您的DD进程的pid}

这不会在监视输出窗口中执行任何操作,但是回到原始的DD Shell,DD将每10秒开始输出状态报告。当然,您可以将watch命令中的-n 10更改为任何其他时间范围。

太子

3
Tachyon

在先前插入的食谱中描述了最多的信息,但并未描述所有信息。

在linux下,您可以通过dd命令克隆硬盘或分区。注意,当您犯错时,您将丢失所有数据。

首先,不应使用目标,其次不应使用源,或将其重新安装为只读模式。否则复印件将被损坏。如果无法重新安装,请使可引导驱动器(hdd/ssd/pendrive)为任何Linux live发行版。我喜欢knoppix,但这是您的选择。如果可能,可以将系统级别引导或更改为1(对于单用户模式),也可以直接将系统重新引导到单用户模式,具体取决于发行版。如果仅克隆一个分区,则应将该分区卸载或重新安装到RO中:

umount /mountpoint_or_device

要么

remount -o,ro /mountpoint_or_device

如果要克隆整个硬盘驱动器,则必须卸载或重新装载所有分区。

您必须标识源设备和目标设备。请查看dmesg,此处存储了有关设备以及供应商等的所有必需信息。或者,可以根据设备大小(如果不同)进行识别。接下来,目的地应该与来源相同或更大。您必须计算源,例如:fdisk -l/dev/sda除了分区几何(可以有GPT)之外,您将获取:1.磁盘总大小(GB和字节)2.历史几何和扇区总数,非常重要的信息3.块大小(以字节为单位),通常为512。

例如:

# fdisk -l /dev/sda

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000f1d1e

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    40136703    20067328   83  Linux
/dev/sda2        40138750    41940991      901121    5  Extended
/dev/sda5        40138752    41940991      901120   82  Linux swap /     Solaris

接下来让我们尝试大于512的分频器,我们有41943040个物理扇区:

41943040/256 = 163840,非常好,我们可以批量复制256个扇区。我们还能吗?让我们尝试:41943040/1024 = 40960,我认为这已经足够了,我们将选择这个。让我们计算扇区组的大小:512(扇区大小)* 1024 = 524288字节eq 512K。然后我们可以使用参数bs = 512K或更小,但是将其除以2 ^ x。对于具有大内部缓存的现代硬盘驱动器,这是足够实用的。对于缓存要小得多的旧驱动器,值不超过32K就足够了。

然后,在准备之后,我们可以进行复制:dd if =/dev/source_devide of // dev/destination_device bs = 32K并完成复制。请注意,任何错误都会覆盖您的导入和数据。在目的地,所有内容都会被覆盖。

如果尝试在损坏的源磁盘上营救数据,则最好使用本机扇区大小(通常为512字节),并添加选项conv = notrunc。否则,坏扇区掉落的源中的漏洞将与目标转移到一起。这将损坏副本,几乎没有修复机会。那么命令将是:

dd if=/dev/source of=/dev/destination bs=512 conv=notrunc  

,并等待很长时间,直到驱动器和系统放弃,然后逐段走到底。

dd是用于将分区移动到新位置的有用工具。只需创建分区,将dd设置为新分区(可以更大,更大),并且如果可能的话,扩展复制的文件系统以填充所有新分区,ext3/ext4/xfs/zfs/btrfs具有此功能。最后,您必须更改/ etc/fstab,然后更改umount/mount(如果可能),或重新引导系统。

当然,您可以克隆任何类型的分区。 dd命令不研究文件系统类型,它不执行任何结构。那么此命令可用于克隆NTFS或其他分区类型。

有什么把戏。如果没有设置参数,则dd会将输出放入其stdout中。那么您可以制作磁盘或分区的压缩原始副本,例如:

dd if=/dev/sda bs=512 | gzip >/any/place/computerOne_sda.gz

当然,这应该脱机完成。您可以通过以下方式恢复它:

zcat /any/place/computerOne_sda.gz| dd of=/dev/sda bs=512   

,则此备份将覆盖所有sda硬盘驱动器,并且所有当前数据将丢失。您也可以使用NTFS Windows分区和由此使用的硬盘驱动器。当然,您可以根据自己的选择使用其他压缩命令。

2
Znik

如何使用dd复制(在这种情况下,复制到远程计算机,但是相同的原理适用于本地复制),显示进度。

它的工作原理是通过文件描述符3将pid存储在/ tmp/pid中,然后将其用于信号USR1的后续终止操作。皱纹是通过通过子外壳过滤stderr将stderr上的进度输出过滤到仅一行。

(dd bs=1M if=$lv-snapshot & echo $! >&3 ) 3>/tmp/pid  2> >(grep 'copied' 1>&2) | gzip --fast | ssh $DEST "gzip -d | dd bs=1M of=$lv" &
# Need this sleep to give the above time to run
sleep 1
PID=$(</tmp/pid)

while kill -0 $PID; do
  kill -USR1 $PID
  sleep 5
done
2
Edward Groenendaal

dd确实提供了进度信息-Linux中的大多数版本。我见过一些不但不记得Unix风味的东西。

手册页上说:向正在运行的“ dd”进程发送USR1信号使它将I/O统计信息打印为标准错误,然后恢复复制。

我定期使用此功能。

2
Steven

有人必须这样说:试试Clonezilla(http:// clonezilla.org/)

你得到了什么?仅复制文件系统的已使用部分。 Clonezilla使用dd,grub,sfdisk,parted,partimage,ntfsclone和/或partclone。根据您选择的选项。

体面的文档可以在以下位置找到:http:// clonezilla.org/clonezilla-live/doc/

2
Roflo

您可以使用bzip2gzip(而不是dd)动态创建分区(或磁盘)的压缩映像文件。这很适合在可移动媒体中存储图像:

bzip2 -c /dev/sdaX >imagefile.bz2
or
gzip -c /dev/sdaX >imagefile.gz

如果磁盘以前已被大量使用,则可以通过在映像之前用零填充所有未使用的空间来增强压缩:

mkdir /mnt/mymountpoint
mount /dev/sdaX /mnt/mymountpoint
cat /dev/zero >/mnt/mymountpoint/dummyfile.bin
(Wait for it to end with a "disk full" error)
rm /mnt/mymountpoint/dummyfile.bin
umount /mnt/mymountpoint

要将映像还原到另一个磁盘,您要做的就是:

bzcat imagefile.bz2 >/dev/sdbY
or
zcat imagefile.gz >/dev/sdbY
1
JCCyC

您必须注意的一点是,在这样做时会覆盖接收磁盘的主引导记录。这包含分区表和其他重要信息。如果新磁盘与旧磁盘不同,则可以创建各种表。通过分区复制通常更安全(并且不必复制交换分区)

0
Paul de Vrieze

我已经离开管理角色很多年了,但是我知道'dd'可以胜任。我在80年代后期定期在Sun Sparc和386i计算机上使用此技术。我有一个超过30 386i个系统的客户订单,这些系统运行CAD在多个QIC磁带上分发的软件。

我们安装在第一台计算机上,配置了应用程序,运行了SunOS的sys-unconfig,将驱动器放入具有不同SCSI地址的鞋盒中,然后继续对其他30个驱动器进行“ dd”操作。

0
pbrooks100

只需向初学者发出警告:至少对于某些版本,bs = X意味着字面大小为X的内存将被分配。在1GB RAM)的系统上,bs = 2GB且交换不足会导致不良情况发生。

0
rackandboneman

由于某些原因,当使用音频轨道对CD进行映像时,dd会失败。您需要使用cdrdao或类似的东西来获取图像+ TOC文件。

0
Matt

对于NTFS卷,我更喜欢使用 ntfsclone 。它是 ntfsprogs 程序包的一部分。

0
Ed Brannin

正如其他人在上面提到的那样,克隆已挂载文件系统的陷阱之一是潜在的数据损坏。显然,这不适用于完整的驱动器克隆,但是如果您使用的是LVM,则可以从快照中快照LogicalVolume和dd以获得一致的映像。

0
Ophidian