使用DD进行磁盘克隆


182

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

dd克隆磁盘的最佳方法是什么?我对Google进行了快速搜索,第一个结果显然是失败的尝试。使用后dd,我需要做些什么吗,也就是说,有什么不能读取的dd


我知道dd是如何工作的,我的问题更多是针对克隆磁盘时与dd相关的任何已知问题(如链接所述),也许这不是很清楚。他的答案所包含的和您所没有的是“我从来没有遇到过任何问题”。我也赞成您的回答,因为您确实提出了一些有趣的观点(我喜欢关于没有进度指示的观点)。
falstro

1
看起来您获得了Spolsky的冲击
凯尔·克罗宁

没有看到这对这里的时候,我问(回答)的超级用户类似的问题- superuser.com/questions/11453/...
沃伦

3
具有讽刺意味的是,乔尔将这个问题作为服务器故障的一个很好的例子,尽管没有一个很好的答案。在25个问题中(答案除外),没有一个答案dd可以跳过坏块,这是克隆磁盘进行恢复时必不可少的。我添加了一个更好的答案,它可以克隆具有坏块的磁盘:dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror
Sam Watkins 2014年

我认为如果谈论与驱动器几何相关的文件系统,并且在不相同的硬盘上进行还原,dd还原可能会“失败”?我在dd restore上遇到了一些故障,我认为这是我的问题。
Marco Marco

Answers:


160

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

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

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


12
当然,只要/ dev / sdb至少等于/ dev / sda ...
埃迪

22
添加一个“ bs = 100M conv = notrunc”,根据我的经验,它要快得多。
Tim Williscroft,2009年

127
只是要非常小心'i'和'o'字母...
bandi

17
似乎没有人知道这个技巧... dd是一个非对称复制程序,意味着它将先读取,然后写入,然后再返回。您可以将dd传递给自身,并强制其对称执行复制,如下所示:dd if=/dev/sda | dd of=/dev/sdb。在我的测试中,在不使用管道的情况下运行命令使我的吞吐量约为112kb / s。使用管道,我的速度约为235kb / s。我从未遇到过这种方法的任何问题。祝好运!
Mistiry

13
@Mistiry,不是对称这个词的意思。
psusi

113

为了节省空间,您可以使用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报告状态)。


2
这是否也适用于“现代” fs,例如BTRFS,NILFS,[您可以梦想的一切]?
史蒂夫·施内普

DD在块设备上工作,其抽象级别低于文件系统,因此应该。我实际上还没有尝试过。嗯,NILFS看起来很有趣,我不得不看一看。
David Hicks,2009年

4
+1 kill -SIGUSR1 %1,OSX dd命令愉快地接受SIGUSR1 ...超级有用,谢谢!
stuartc 2012年

1
+1,因为Kill -SIGUSR1 1234我一直在寻找。
hot2use 2012年

2
应该是dd if=/dev/hdb | gzip -c > /image.img.gz吗?
Mike Causer 2015年

37

注意:实时文件系统可能会损坏文件。原因很简单,它不了解可能正在进行的文件系统活动,也没有尝试缓解它。如果正在进行部分写入,您将获得部分写入。这通常对事物不利,并且通常对数据库致命。此外,如果你搞砸了错字多发,如果参数,你们这。在大多数情况下,rsync是在多任务处理问世之后编写的同等有效的工具,它将提供单个文件的一致视图。

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


7
我怀疑这sync不是文件损坏问题的答案。如果syncdd操作过程中,守护进程或某物在以后写入了更多文件,该怎么办?
删除

5
首先卸载驱动器(或重新安装为只读)是个好主意,但并非总是可能的
Alex Bolotov

1
在这种情况下,您可以使用rsync并让它执行文件魔术处理以获得一致的文件,并让“写时复制”语义处理传入的写操作。
jldugger

4
我想补充一点,在已挂载的文件系统上运行dd不会损坏已挂载的文件系统上的文件,但这意味着文件系统的副本必然处于已知的良好状态。
3molo 2013年

1
使用rsync将确保目标文件系统中的内部数据一致。它不能确保文件中的数据是一致的—为此,您需要锁定文件,并且写入文件的任何程序都需要遵守这些锁定。
马丁·盖斯勒

26

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

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


13
如果您的磁盘扇区损坏,则实际上应该使用“ ddrescue”而不是dd。它效率更高,并且恢复更多数据的机会更大。(不要把它与dd_rescue混淆,这不是那么好)
davr 2010年

3
如果尝试跳过坏块,则不应使用较大的块大小,否则将跳过太多。4096足够大。
山姆·沃特金斯

17

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

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

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

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

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

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

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

就问题或困境而言,dd在很大程度上发挥了出色的作用。但是,不久前,我有一个即将死掉的硬盘,因此我使用dd尝试复制可以完全消亡的信息。然后得知dd不能很好地处理读取错误-磁盘上的多个扇区dd无法读取,导致dd放弃并停止了复制。当时,尽管遇到读取错误,但我仍然找不到告诉dd继续的方法(尽管看起来好像确实有该设置),所以我花了很多时间手动指定跳过并尝试跳过不可读的部分。

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


7
... dd绝对没有进度指示...-嗯,这不是真的-有种技巧来显示进度-您必须找出dd进程的pid('ps -a | grep dd'),然后发送信号USR1到此进程-'kill -USR1 <dd_pid_here>'(不带<>),该命令强制dd显示进度信息。
Michal Bernhard

4
“ dd无法读取磁盘上的几个扇区”:我认为这conv=sync,noerror会有所帮助。
Gauthier

2
这些conv=sync,noerror选项是必不可少的,它们允许dd跳过坏块并将它们在映像中归零,以便正确对齐。支持很少有人对此发表评论的人。
山姆·沃特金斯

1
GNU ddrescue提供了进度指示器,没有任何特殊选项,您可以停止复制并从上次中断的地方继续。
endlith 2015年

2
使用dd取得进展的一种比较棘手的方法是添加该选项status=progress
James

11

如果源驱动器是在所有的损坏,你必须使用更多的运气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可以更快地恢复大部分数据。


1
在dd_rescue和ddrescue之间选择的一些帮助:askubuntu.com/a/211579/50450
Johann

7

源磁盘不得具有任何已挂载的文件系统。以能够读取块设备(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的压缩。


通过gzip +1管道可以节省大量时间和带宽!
M. Dudley

我还应该注意,在dd命令中添加“ bs = 1M”通常会大大提高速度。
撤退

6

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

第二个缺点可以通过使用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

1
您已经说过克服第三个缺点的方法...调整分区大小。扩大分区通常是安全,快速的操作(与缩小或移动相比,这是缓慢且危险的操作,因为它正在移动数据)。
davr 2010年

gziping不适用于已经使用了一段时间的磁盘,因为它将填充当前或已删除的数据。只有在空白空间为零的情况下,gzip才有效,只有全新磁盘才有这种情况。
Tozz 2012年

3
@Tozz:您可以通过用0填充的文件填充文件系统,将其同步到磁盘,然后将其删除,从而提高文件系统映像的可压缩性。 dd if=/dev/zero bs=1M of=/balloon; sync; rm /balloon (文件系统层中的模块额外智能。)
追溯

5

您可以用dd和应急磁盘做的另一件事是通过网络复制数据:

remote_machine$ nc -l -p 12345

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

如果网络不是本地的,则可以将gzip插入这两个管道中。要取得进步,请使用pv。要在复制完成后退出local_machine的netcat,可以添加-w 5或添加一些内容。


9
这不是很正确。'remote_machine'命令缺少某些内容,例如> disk_backup.img|dd of=/dev/sdb或其他,这取决于您要执行的操作。我猜您不想将磁盘映像转储到stdout。
davr 2010年

1
并在两端放入gzip,以进一步最小化发送的数据。
3molo 2013年

4

请记住,dd会进行精确复制,包括所有空白。

这意味着:

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

希望对您有所帮助


8
如果要克隆整个硬盘,那么也要克隆引导加载程序。
2009年

嗯,只是一个提示,但是您不能只使用gparted将要复制的分区/磁盘还原为所用的内容,然后删除dd吗?假设它是一次性映像,则应减轻此问题。
bbqchickenrobot 2012年


3

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

只是

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

以及撰写时的其他方向。抛光fdisk后。

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

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


3

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

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

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

太子


OS X没有watch可用空间,因此会-USR1杀死dd。不过,可以使用以下命令: while [ true ]; do killall -INFO dd; sleep 30; done
Adam Franco

我认为这对于新手来说不太实用,可以通过pv命令更好地为他们服务。
罗比·麦肯尼

我发现您也可以在dd中使用CTRL-T发送SIGINFO。它比while循环和我没有的OSX 10.6 cd没有killall容易。从en.wikipedia.org/wiki/Unix_signal#Sending_signals
Citizen Kepler

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

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

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

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


1
实际上,它是在之前的一个答案和至少两个评论中提到的。
迈克尔·汉普顿

1
@Michael您链接的答案不包含完整的示例命令,并且还存在其他错误-使用较大的块大小不是一个好主意,conv=sync,noerror因为它将为每个坏块跳过太多数据。这些选项对于“恢复克隆”是必不可少的,不必在注释中搜索它们。如果磁盘没有坏块,例如克隆原始磁盘,但不能恢复磁盘,那么最流行的答案就足够了。
Sam Watkins 2014年

@Michael我给出的示例是我已多次使用它进行专业磁盘恢复的命令。尽管还有其他一些工具可能做得更好,但是我提供的示例在磁盘恢复克隆方面比dd这里的所有其他示例都更好,同时也适合于克隆无错误的磁盘。因此,我认为在“如何使用DD进行磁盘克隆”方面,我的答案是最好的。我没有添加有关监视进度,压缩等的信息,因为我想保持简单,而是专注于提供一个简短的答案,以使基础知识正确。
Sam Watkins 2014年

3

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

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

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


应该为conv = sync,noerror需要sync选项,否则将删除有错误的块,而不是将其复制为零。
山姆·沃特金斯

2

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

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

我定期使用此功能。


虽然有用,但我怀疑它对初学者的实用性。
罗比·麦肯尼

2

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

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

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


我发现文档有些粗糙,将linux PATA驱动器克隆到SATA驱动器并没有给我留下我可以引导的东西。但是达到与dd相同结果的速度要快得多,它对我的​​笔记本电脑驱动器升级非常有用。
jbdavid

2

如何使用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

与问题无关,但它是一个精巧的shell技巧,使用了一个子shell和高(高于stderr)文件描述符来传输数据,+ 1
falstro

克隆磁盘时,我本人是用不同的dd选项来指代此页面,因此当时似乎是放置克隆所用最终结果的合适位置,尤其是因为我认为这样做比较整洁:)
Edward Groenendaal

2

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

在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分区和由此使用的硬盘驱动器。当然,可以根据您的选择使用其他压缩命令。


1

您可以使用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

推荐使用零填充剩余空间的技巧。聪明!
混乱2012年

这个,我需要这个!SD卡以前曾用于视频捕获,但充斥着垃圾,压缩根本没有帮助。
科迪·史密斯

0

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


0

关于速度的注意事项:根据我的经验,如果您指定bs = 1024而不是默认的bs = 512,则dd的速度是其两倍。使用更大的块大小在bs = 1024上没有明显的加速。


4
磁盘群集现在通常约为4k,因此使用4096可能是一个不错的选择,如果您想一次读取2个群集,甚至可以使用8192。但是不要过大,因为会遇到零碎的内存问题
user4767

0

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


0

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

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


0

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



0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.