有关磁盘克隆工具的问题有很多, dd
至less提出一次。 我已经考虑过使用dd
,主要是因为易于使用,而且它几乎可以在所有可引导的Linux发行版上使用。
使用dd
克隆磁盘的最佳方法是什么? 我做了一个快速的谷歌search,第一个结果是一个明显的失败的尝试 。 使用dd
后有什么需要做的,即有没有什么不能用dd
读取?
dd是最好的克隆工具,只需使用以下命令即可创build100%的副本。 我从来没有遇到任何问题。
dd if=/dev/sda of=/dev/sdb bs=32M
请注意,在克隆每个字节的同时,您不应该在正在使用的驱动器或分区上使用它。 特别是像数据库这样的应用程序不能很好地处理这个问题,最终可能会导致数据损坏。
为了节省空间,可以使用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
另外,你可以在后台运行一个dd进程来通过发送一个kill命令的信号来报告状态,例如:
dd if=/dev/hdb of=/image.img & kill -SIGUSR1 1234
检查你的系统 – 上面的命令是针对Linux,OSX和BSD的dd命令,它们接受的信号是不同的(OSX使用SIGINFO
– 你可以按Ctrl + T来报告状态)。
小心 :生活的文件系统可能会损坏文件。 原因很简单,它不了解可能正在进行的文件系统活动,也没有尝试缓解它。 如果写入部分正在进行,您将得到部分写入。 这通常对事物不好,对数据库通常是致命的。 此外,如果你搞错了, 如果和参数的错字,祸害你。 在大多数情况下, rsync是在多任务出现之后编写的同样有效的工具,并且将提供对于单个文件的一致的视图。
但是,DD应该准确地捕获未安装的驱动器的位状态。 引导加载程序,llvm卷,分区UUID和标签等。只要确保您有一个能够将目标驱动器位镜像的驱动器。
使用dd克隆可能包含坏扇区的磁盘时,请使用“conv = noerror,sync”确保在遇到错误时不会停止,并用空字节填充缺less的扇区。 这通常是我尝试从发生故障或发生故障的磁盘中恢复时所采取的第一步 – 在执行任何恢复尝试之前获取副本,然后在良好(克隆)的磁盘上进行恢复。 我把它留给恢复工具,以应付任何不可复制的空白部分。
此外,您可能会发现dd的速度会受到bs(块大小)设置的影响。 我通常尝试bs = 32768,但是你可能想在你自己的系统上testing一下,看看你的速度最快。 (这里假设你不需要使用特定的块大小,例如,如果你正在写一个磁带。)
克隆一个磁盘,你真正需要做的是指定input和输出到dd:
dd if=/dev/hdb of=/image.img
当然,确保你有正确的权限直接从/ dev / hdb中读取(我build议以root用户身份运行),并且/ dev / hdb 没有被挂载 (你不想在磁盘正在更改 – 以只读方式安装也是可以接受的)。 一旦完成,image.img将是整个磁盘的一个字节对每个字节的克隆。
使用dd克隆磁盘有一些缺点。 首先,dd会复制你的整个磁盘,甚至是空的空间,如果在大磁盘上完成,可能会导致一个非常大的图像文件。 其次,dd提供绝对没有进展迹象,这可能是令人沮丧的,因为副本需要很长时间。 第三,如果您将此映像复制到其他驱动器(再次使用dd),它们必须与原始磁盘一样大或更大,但是您将无法使用目标磁盘上可能具有的任何额外空间,直到您调整分区大小。
您也可以执行直接的磁盘到磁盘复制:
dd if=/dev/hdb of=/dev/hdc
但是你仍然受到上述关于可用空间的限制。
至于问题或陷阱,dd大部分都做得很好。 但是,前一阵子我有一个即将死亡的硬盘,所以我用dd在它完全死亡之前尝试复制我可以删除的信息。 然后得知dd不能很好地处理读取错误–dd在磁盘上有几个扇区无法读取,导致dd放弃并停止复制。 当时我无法find一种方法来告诉dd继续,尽pipe遇到一个读取错误(虽然它看起来好像它有这样的设置),所以我花了相当多的时间手动指定跳过并寻求跳过不可读的部分。
我花了一些时间研究这个问题的解决scheme(在我完成任务后),我发现了一个名为ddrescue的程序,根据该网站,它运行的是dd,但即使遇到错误也会继续读取。 我从来没有真正使用过这个程序,但是值得考虑,特别是如果你正在复制的磁盘是旧的,即使系统显示正常,也可能有坏扇区。
如果源驱动器完全损坏,那么使用dd_rescue
(使用我的个人偏好)或使用GNU ddrescue
使用dd_rhelp
会有更多的运气。
这背后的原因是,在读取错误, dd
不断努力尝试和尝试 – 可能会等待很长时间超时发生。 dd_rescue
做一些聪明的事情,例如读取错误,然后在磁盘上进一步select一个位置,并向后读取最后一个错误,而dd_rhelp
基本上是一个dd_rescue
会话pipe理器 – 巧妙地启动和恢复dd_rescue
运行,使其再次更快。
dd_rhelp
的最终结果是在最短时间内恢复的最大数据量。 如果你离开dd_rhelp
运行,最后它会在同一时间完成与dd
相同的工作。 但是,如果dd
在100Gb磁盘的字节100处遇到读取错误,则必须等待很长时间才能恢复其他9,999,900字节*,而dd_rhelp
+ dd_rescue
将快速恢复大部分数据。
源磁盘不能有任何已安装的文件系统。 作为能够读取块设备的用户(root works),运行“dd if = / dev / sda ….”
现在,这里的一个很好的东西是你正在创build一个字节stream……你可以做很多事情:压缩它,通过networking发送它,把它分块成更小的块。
例如:
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上的速度,networking速度等,您可能需要跳过压缩,或者在远端进行压缩,或者启用ssh的压缩。
克隆一个磁盘,你真正需要做的是指定input和输出到dd
:
dd if=/dev/hdb of=hdb.img
当然,确保你有正确的权限直接从/dev/hdb
读取(我build议以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
第二个缺点可以通过使用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
使用dd和rescue磁盘可以做的另一件好事是通过networking复制数据:
remote_machine$ nc -l -p 12345 local_machine$ dd if=/dev/sda | nc remote_machine 12345
如果networking不在本地,则可以在这两个pipe道中使用gzip。 为了进步,请使用pv
。 为了使local_machine的netcat在完成复制后退出,可以添加-w 5
或其他东西。
请记住,dd做了一个确切的副本 ,包括所有的空白。
这意味着:
希望有帮助
为了将来的参考,可能有兴趣检查ddrescue 。 它已经挽救了我的一天几次。
另一个重要function是复制MBR,分区表和引导logging。
只是
dd if=/dev/sda of=parttable bs=512 count=1
和另一个方向,当你写它。 波兰与fdisk
之后。
当您备份分区表时,感觉更安全。
此外,它使迁移到另一个硬盘驱动器(同时改变分区结构)一个喜悦。
dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror
这将复制磁盘,并跳过有错误的块,这是非常重要的。
这些是使用dd克隆或恢复磁盘的基本和必要选项。
我不想发表另一个答案,但在已经发布的25个选项中,没有很好的答案,其中有“conv = sync,noerror”选项。
dd确实提供了进度信息 – 在linux中的大多数版本。 我已经看到了一些不,但不记得unix的味道。
该手册页说:发送一个USR1信号到一个正在运行的“dd”进程使它打印I / O统计到标准错误,然后恢复复制。
我经常使用这个function。
有人不得不这样说:给Clonezilla一个尝试(http:// clonezilla.org/)
你得到了什么? 仅复制文件系统的已用部分。 Clonezilla使用dd,grub,sfdisk,parted,partimage,ntfsclone和/或partclone。 取决于您select的选项。
体面的文档可以在以下urlfind:http:// clonezilla.org/clonezilla-live/doc/
这是一个便宜的黑客,但这是一个快速和肮脏的方式来监视你的DD进程。
运行你的dd命令。 打开一个新的shell并执行ps awx来查找你的dd进程的PID。 现在在新的shelltypes中看-n 10 kill -USR1 {你的DD进程的pid}
这将不会在观察输出窗口中做任何事情,但回到原来的DDshell,DD将开始输出状态报告每10秒。 当然,您可以将watch命令中的-n 10更改为任何其他时间范围。
超光速粒子
如何使用dd(在这种情况下是远程机器,但同样的原则适用于本地副本),它显示进度。
它通过将文件描述符3中的pid存储在/ tmp / pid中来工作,然后将其用于随后用信号USR1进行的杀死。 一个皱纹是通过过滤stderr通过一个子shell筛选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
你可以尝试这样的事情
dd if = / dev / sda2 of = / dev / sdb2 bs = 4096 conv = sync,noerror
跳过所有的错误,并有一个分区或硬盘驱动器的确切克隆
您可以使用bzip2
或gzip
而不是dd
来创build分区(或磁盘)的压缩映像文件。 这对于在可移动介质中存储图像很好:
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
由于某些原因,dd在audio轨道成像时失败。 您需要使用cdrdao或类似的东西来获取图像+目录文件。
关于速度的说明:根据我的经验,如果指定bs = 1024而不是默认的bs = 512,那么dd的速度会快一倍。 使用更大的块大小比bs = 1024没有明显的加速。
有一件事你必须知道,当一个完整的磁盘是这样做将覆盖接收磁盘的主引导logging。 这包含分区表和其他重要信息。 如果新磁盘与旧磁盘不一样,则可以创build各种表。 在分区上复制通常是比较安全的(交换分区不需要复制)
我已经脱离了多年的pipe理angular色,但是我知道“dd”是可以胜任的。 我经常在80年代后期在Sun Sparc和386i电脑上使用这种技术。 我有一个客户订单超过30个386i系统,运行分布在多个QIC磁带上的CAD软件。
我们安装在第一台计算机上,configuration了应用程序,运行SunOS的sys-unconfig,将驱动器放置在一个带有不同SCSI地址的鞋盒中,然后继续“dd”到另外30个驱动器。
正如其他人上面提到的,克隆已挂载文件系统的一个棘手问题是潜在的数据损坏。 这显然不适用于全驱动器克隆,但是如果您使用的是LVM,则可以从快照中快照LogicalVolume和dd以获得一致的映像。
对于NTFS卷,我更喜欢使用ntfsclone 。 它是ntfsprogs包的一部分。
只是对初学者的一个警告,需要说的是:至less在一些版本中,bs = X意味着内存大小X将被分配。 在1GB内存和交换不足的系统上bs = 2GB将导致不好的事情发生。
以前插入的收件人中描述了大部分信息,但并非全部描述。
在Linux下,您可以通过dd命令克隆硬盘驱动器或分区。 注意,当你犯了一个错误,你将失去所有的数据。
起初,目的地不应该被使用,其次源应该不被使用,或者被重新装入只读模式。 否则复制将被损坏。 如果重新安装是不可能的,请使可启动驱动器(hdd / ssd / pendrive)的任何Linux的现场发行。 我prevo knoppix,但这是你的select。 如果可能的话,可以将系统级别启动或更改为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字节等于512K。 那么我们可以使用参数bs = 512K或更less,但是除以2 ^ x。 对于具有大内部caching的现代硬盘驱动器,这是足够实用的。 对于具有更小caching的旧驱动器,值32K或更less就足够了。
然后准备好后,我们可以做一个副本:dd if = / dev / source_devide = / dev / destination_device bs = 32K,复制完成。 注意,任何错误都会覆盖您的导入和数据。 在目的地所有将被覆盖。
如果尝试在损坏的源磁盘上search数据,则最好使用本机扇区大小,通常为512字节,并添加conv = notrunc选项。 否则,由于不利的因素而导致的源头漏洞将由目标上的部门转移而join。 这会损坏复制几率很小的修复。 那么命令将是:
dd if=/dev/source of=/dev/destination bs=512 conv=notrunc
等待很长一段时间,驱动和系统将放弃,并将扇区逐步走到最后。
DD是有用的工具移动分区到新的地方。 只需创build分区,将dd设置为新的分区(这可以更大,更大),如果可能的话,展开复制的文件系统以填充所有新分区,ext3 / ext4 / xfs / zfs / btrfs具有此function。 最后,您必须更改/ etc / fstab,然后在可能的情况下卸载/挂载,或重新启动系统。
当然,你可以克隆任何types的分区。 dd命令不会查看文件系统types,它的结构没有任何作用。 那么这个命令可以用于克隆NTFS或其他分区types。
有什么窍门。 如果你没有设置参数,那么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硬盘将被这个备份覆盖,所有的当前数据将会丢失。 You can do this also with NTFS windows partition and hard drive used by this. Of course you can use other compression command, depended by your choose.