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

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

评论

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

看起来您获得了Spolsky凹凸:joelonsoftware.com/items/2009/05/29.html

当我在超级用户上询问(并回答)类似问题时,在这里没有看到此问题-superuser.com/questions/11453/…

具有讽刺意味的是,乔尔将这个问题作为服务器故障的一个很好的例子,尽管没有一个很好的答案。在25个问题(注释除外)中,没有一个答案带有正确的dd选项来跳过坏块-这对于克隆磁盘进行恢复非常重要。我添加了一个更好的答案,它可以克隆具有坏块的磁盘:dd if = / dev / sda of = / dev / sdb bs = 4096 conv = sync,noerror

此方法还将保存磁盘的未分配部分(如果有)。如果您不需要它,可以告诉它在哪里停止(dd的count参数,或者通过head -c管道传输数据……等等);但是我不确定如何找到确切的字节数,或至少是一个好的上限)

#1 楼

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

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


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

评论


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

–艾迪
09年5月5日在21:09

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

–蒂姆·威利斯克罗夫特(Tim Williscroft)
09年5月6日在22:14

请非常小心“ i”和“ o”字母...

– Bandi
09年5月29日在21:52

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


2010-10-19 20:50

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

–psusi
2012年5月10日下午1:53

#2 楼

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

评论


这对BTRFS,NILFS之类的“现代”文件系统也起作用吗?

– Steve Schnepp
2009年6月26日14:41

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

–大卫·希克斯(David Hicks)
09年6月28日在22:47

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

– stuartc
2012年11月3日,10:17

为Kill -SIGUSR1 1234 +1我一直在寻找那个。

– John K. N.
2012-12-12 13:17

应该是:dd if = / dev / hdb | gzip -c> /image.img.gz?

–迈克·凯瑟(Mike Causer)
2015年10月7日在10:18

#3 楼

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

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

评论


我怀疑同步不是解决文件损坏问题的答案。如果在dd操作期间同步后,守护进程或其他内容写入了更多文件,会发生什么情况?

–已删除
09年8月13日在10:47

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

– Alex Bolotov
09年8月22日在9:36

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

– jldugger
09年8月22日在21:18

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

– 3molo
13年4月12日在10:11

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

–马丁·盖斯勒(Martin Geisler)
2014年12月16日22:37

#4 楼

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

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

评论


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

–davr
2010年3月19日在20:27

如果尝试跳过坏块,则不应使用较大的块大小,否则将跳过太多。 4096足够大。

–山姆·沃特金斯(Sam Watkins)
2014年11月13日在2:54



#5 楼

要克隆磁盘,您真正需要做的就是将输入和输出指定到dd:从/ dev / hdb(我建议以root用户身份运行),并且不挂载/ dev / hdb(您不希望在更改磁盘时进行复制-也可以以只读方式挂载)。完成后,image.img将是整个磁盘的逐字节克隆。

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

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

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


,但是您仍然需要遵守以上是关于自由空间的限制。

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

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

评论


... dd绝对没有进度指示...-事实并非如此-有种技巧显示进度-您必须找出dd进程的pid('ps -a | grep dd'),然后发送信号USR1到此进程-'kill -USR1 '(不带<>),该命令强制dd显示进度信息。

–米哈尔·伯恩哈德(Michal Bernhard)
2011年6月19日15:51



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

–Gauthier
2011年11月30日10:00

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

–山姆·沃特金斯(Sam Watkins)
2014年11月13日在2:51



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

– Endolith
2015年2月25日在2:46



获得dd进度的一种较不复杂的方法是添加选项status = progress

–詹姆斯
17年7月30日在16:49

#6 楼

如果源驱动器完全损坏,那么将dd_rhelpdd_rescue(我个人喜好)或GNU ddrescue配合使用会带来更多的运气。并不断尝试-可能需要等待很长时间才能发生超时。 dd做一些聪明的事情,例如读取错误,然后在磁盘上进一步挑出一个点,然后向后读到最后一个错误,而dd_rescue本质上是一个dd_rhelp会话管理器-巧妙地启动和恢复dd_rescue可以使其运行更快。 br />
dd_rescue的最终结果是在最短的时间内恢复了最大的数据。如果让dd_rhelp保持运行,最后它将在同一时间执行与dd_rhelp完全相同的工作。但是,如果dd在100Gb磁盘的字节100处遇到读取错误,则必须等待很长时间才能恢复其他9,999,900字节*,而dd + dd_rhelp会更快地恢复大部分数据。

评论


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

–约翰
17年7月12日在21:52

#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管道可以节省大量时间和带宽!

–杜德利先生
2011年9月7日23:33

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

–溯源
2012年7月26日在14:11

#8 楼

要克隆磁盘,您真正要做的就是指定输入和输出到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 }'`m) | cat > hdb.img


我知道没有办法克服第三个缺点。另外,您可以通过告知dd可处理更大的数据块。例如:

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


评论


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

–davr
2010年3月19日在20:28

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

–喷头
2012-2-22在20:51

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

–溯源
2012年7月26日14:15



#9 楼

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

remote_machine$ nc -l -p 12345

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


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

评论


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

–davr
2010-3-19在20:26

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

– 3molo
13年4月12日在10:12

#10 楼

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

这意味着:


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

希望有帮助

评论


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

–克里斯蒂安·丘皮图
09年5月29日在22:16

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

–bbqchickenrobot
2012年3月24日19:40

#11 楼

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

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

这不会在watch输出窗口中起作用,但是回到原始DD shell中,DD将开始输出状态报告每10秒发送一次。您当然可以将watch命令中的-n 10更改为其他任何时间范围。

Tachyon

评论


OS X没有监视功能,-USR1杀死dd。但是,以下命令可以运行:while [true];做killall -INFO dd;睡30;完成

–亚当·佛朗哥(Adam Franco)
2011年8月9日在23:04

我认为这对于新手来说不太实用,使用pv命令可能会更好。

–罗比·麦肯尼(Robbie Mckennie)
13年7月19日在9:36

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

–市民开普勒
2014年9月2日下午16:34

#12 楼

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


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

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

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

评论


实际上,它是在之前的一个答案和至少两个评论中提到的。

–迈克尔·汉普顿
2014年11月13日在2:51



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

–山姆·沃特金斯(Sam Watkins)
2014年11月14日下午6:32



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

–山姆·沃特金斯(Sam Watkins)
2014年11月14日6:38



#13 楼

供将来参考,可能需要检查ddrescue。它挽救了我很多次。

#14 楼

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

只需

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


以及编写时的其他方向。之后用fdisk进行抛光。

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

#15 楼

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

通过在/ tmp /中通过文件描述符3存储pid来工作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

– fastro
13年7月31日在6:10

克隆磁盘时,我本人在此页面上使用了不同的dd选项,因此当时似乎是放置克隆所用最终结果的合适位置,尤其是因为我认为这样做很整洁:)

–爱德华·格罗伦达尔(Edward Groenendaal)
13年7月31日在23:29

回声$! > / tmp / pid

–mug896
5月29日18:54



#16 楼

您实际上可以尝试使用类似的方法

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


跳过所有错误并获得分区或硬盘驱动器的精确克隆

评论


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

–山姆·沃特金斯(Sam Watkins)
2014年11月13日在2:35



#17 楼

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

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

我定期使用此功能。

评论


虽然有用,但我怀疑它对初学者的实用性。

–罗比·麦肯尼(Robbie Mckennie)
13年7月19日在9:34

或在dd调用中添加status = progress参数。

–drzymala
2月23日12:55

#18 楼

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

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

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

评论


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

– jbdavid
09年5月30日,0:43

#19 楼

在以前插入的食谱中描述了最多的信息,但没有描述全部。 ,您将丢失所有数据。

首先,不应使用目标,其次,不应使用源,或将其重新装入只读模式。否则,副本将被损坏。
如果无法重新安装,请使可引导驱动器(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物理扇区:

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

然后在准备好之后,我们可以进行复制:
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分区和由此使用的硬盘驱动器。当然,您也可以使用其他压缩命令,具体取决于您的选择。

#20 楼

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


评论


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

–困惑
2012年6月12日20:18在

这个,我需要这个! SD卡以前曾用于视频捕获,但充斥着垃圾,压缩根本无济于事。

–科迪·史密斯
16年5月16日在21:03

#21 楼

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

#22 楼

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

评论


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

–user4767
2009年5月29日19:32

#23 楼

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

#24 楼

我已经离开管理角色很多年了,但是我知道'dd'可以胜任。我在80年代后期定期在Sun Sparc和386i计算机上使用此技术。我有一个超过30 386i个系统的客户订单,这些系统运行分布在多个QIC磁带上的CAD软件。一个具有不同SCSI地址的鞋盒,然后继续对其他30个驱动器进行“ dd”操作。

#25 楼

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

#26 楼

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

#27 楼

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