我将如何加速完整磁盘dd?


62

我正在dd使用此命令在两个相同的驱动器上执行以下操作:

 dd if=/dev/sda of=/dev/sdb bs=4096

两个硬盘驱动器的型号完全相同,并且都具有1TB的存储空间。/dev/sda 使用的块大小为4096。/dev/sda是本地驱动器,并且/dev/sdb是远程球童。我可能可以使用以下协议:

  • USB2.0 HighSpeed(当前计划)
  • 千兆网络克隆(真的不想甚至尝试一下)
  • USB3.0(如果找到其他驱动器盒)
  • eSATA(如果找到/购买电缆)
  • SATA(如果我发现/购买电缆,一定喜欢笔记本电脑的CD驱动器)

有没有一种方法可以运行少于96小时的驱动器副本?我愿意使用除以外的工具dd

我需要克隆以下分区(包括UUID)

  • Fat32 EFI分区(*)
  • NTFS Windows分区(*)
  • HFS + OSX分区
  • EXT4 Ubuntu分区(*)
  • 交换分区(*)

* 由Clonezilla支持


我尝试了Clonezilla(速度更快),但它不支持我需要的HFS +智能复制。也许最新版本支持此功能?

当我进行第一个克隆时,我做了除HFS +以外的所有分区,并且运行非常迅速。(总共不超过3小时)


1
您最好使用clonezilla之类的东西。dd复制所有内容,包括可用空间。当您的大磁盘没有完全装满时,缺点会变得非常明显。
蜘蛛鲍里斯(Boris)

是否可以购买SATA电缆并将外部驱动器临时连接到主板上的SATA端口?
Mark Plotnick 2014年

也许有人可以详细说明以下内容:克隆分区表(使用clonezilla或dd),使用Clonezilla克隆除HFS +以外的所有分区,并对那个分区使用dd怎么样?这可行吗?
亚历山大

@Alexander这就是我第一次克隆的方式。
卡兹·沃尔夫

1
@LuisAlvarado,我刚刚开始克隆,伙计!
卡兹·沃尔夫

Answers:


68

根据我的经验,我认为命令行中没有比更快的东西dd。调整bs参数可以提高速度,例如,我有2个HDD,我知道其读写速度大于100 MB / s,因此我可以这样做:

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

还有pv(需要安装第一),对于两个驱动器上以最快的速度检查,然后进行上克隆。当然,这必须从根本上完成:

pv < /dev/sda > /dev/sdb

有了PV,我的速度为156 MB / s

这种做法的好处关于pv从速度与众不同的是,它显示了进步,目前的速度,时间,因为它开始和ETA。关于HFS +,我不知道,我只是想在“速度”部分提供帮助。使用pv或非常优化的bs参数,您可以在不到7小时的时间内完成4 TB的驱动器(以150 MB / s的当前速度运行6小时50分钟)。

在此处输入图片说明

我对您使用的连接类型和其他可用的连接类型进行了一些测试。我使用的是华硕Z87 Pro和英特尔DZ68DP。这是我的结果,但是首先我们需要知道,许多传输速率(原始速度)的理论速度就是理论值。进行实际测试后发现,它们处于原始速度的40%至80%之间。该测试可能会根据使用的设备,连接类型,主板,连接电缆的类型,文件系统的类型等而变化。考虑到这一点,这就是我所得到的(我只测试了对设备的写入速度,读取速度通常更高):

Connected Device  -  Connection Type  -  Speed (Write Speed)
  USB 2.0                 USB 2.0              25 MB/s
  USB 3.0                 USB 2.0              35 MB/s
  USB 3.0                 USB 3.0              73 MB/s
  eSata                   eSata                80 MB/s
  Sata 2G HDD             Sata 2G              120 MB/s
  Sata 3G HDD             Sata 2G              140 MB/s
  Sata 3G HDD             Sata 3G              190 MB/s
  Sata 2G SDD             Sata 2G              170 MB/s
  Sata 3G SDD             Sata 2G              210 MB/s
  Sata 3G SDD             Sata 3G              550 MB/s 

3
发送USR1信号,以获取dd的进度。dd的缺点是它会复制可用空间。
jfs 2014年

1
以我的经验,调整bs参数的dd速度最快cat。您最好先使用cat
Gilles 2014年

3
pv就其本身而言,效果非常好。
卡兹·沃尔夫

11
您可以使用dd来完成工作,但可以在链中插入pv来监视传输速率,如下所示:dd if=/dev/sda1 | pv | dd of=/dev/sdb1
thomasrutter 2014年

4
我一直pvdds 之间使用。不知道它可以单独使用!
korylprince 2015年

12

要批量复制分区,请使用cat代替dd。我前一段时间进行了基准测试,在两个磁盘之间复制一个大文件而不是一个分区(在同一磁盘上,相对时间不同):

dd bs=64M    51.3
dd bs=1M     41.8
dd bs=4k     48.5
dd bs=512    48.9
cat          41.7
cp           45.3

从该基准得出的结论是,针对dd问题选择块大小(但不是很多),并cat自动找到进行快速复制的最佳方法:dd只会减慢您的速度。由于块大小较小,dd浪费了时间,因此丢失了微小的读写操作。块大小较大时,一个磁盘保持空闲,而另一个磁盘正在读取或写入。当一个磁盘读取而另一磁盘写入时,可以达到最佳速率。

要复制分区,使用来复制文件可能更快cp -a。这取决于有多少文件以及多少文件系统可用空间。复制文件的开销大约与文件数成正比,但是另一方面,复制可用空间会浪费时间。

USB2的最大数据速率略低于50 MB / s,可以在6到7个小时内传输1TB。假设硬盘的速度足以使USB总线饱和。我认为更快的7200 rpm驱动器可以做到,但是5900 rpm可能不那么快(也许它们用于线性写入?)。

如果并行使用任何一个磁盘,这将大大降低复制速度,因为磁盘头将需要移动。


我正在尝试复制整个磁盘。
Kaz Wolfe

我希望两者之间的差异相同,但是要在系统上运行基准测试以获得更可靠的数据。
Gilles 2014年

可以cat用于dd if=ubuntu.iso of=/dev/usbdd对USB2或USB3执行此操作的速度非常慢。
Oxwivi 2014年

1
@Oxwivi是的,cat ubuntu.iso >/dev/usb完全等效。中没有魔力dd,它只是将其输入复制到其输出的工具。
吉尔斯2014年

上面给出的cat命令在Mac上不起作用。我尝试sudo cat linuxmint-17.3-cinnamon-64bit.iso >/dev/disk1回退“ -bash:/ dev / disk1:权限被拒绝”
2016年

12

问题是您的连接类型和块大小。为了获得最快的结果,您的块大小应该是通常收到的最低写入速度的一半。这将为您提供安全的余量,但仍允许大量的余量;当然,您还需要有足够的内存来容纳数据。

USB 2.0为每秒12兆位(Mbps),USB 2.0高速为480 Mbps。当然,这是原始速度。一个字节有8位,并且有成帧开销,可用速度(MB / s)通常在小数点后。因此,例如480原始,就可以使用48MB。请记住,这是数学上最好的,在现实世界中它会更低一些。对于USB 2.0高速连接,您可以期望最大写入速度约为30-35 MB,前提是实际的存储设备可以达到或超过连接速度。


6
单位挑剔:USB2.0高速为480 Mbit / s = 60 MByte / s,原始速度。可用速度不是小数位,而是原始速度的80%。经验法则“以MByte / s为单位的实际速度是以Mbit / s为单位的原始速度的1/10”有效。
jpa 2014年

5

我同意调优dd('pv')或'cat'命令的原始速度很难克服,但是如果复制出现任何问题(坏扇区,电源故障,用户错误等),则必须开始过度。

我想建议使用ddrescue-一种具有dd速度的所有速度的FOSS工具,但是它可以解决磁盘错误,并且如果出现故障可以在以后恢复。


2

我正在将Windows 7从HDD转移到SSD,并找到了这个问题和其他一些答案...我学到的东西可能会对其他人有所帮助。就我而言,源驱动器更大,否则我应该在/ dev / sda-​​> / dev / sdb设备级别上工作。

Win7及其3个分区...我在USB上使用Xbuntu 14.04 live cd。弹出胜利计算机的DVD,然后将SSD放回原处。安装了partclone并尝试了此操作:

partclone.ntfs -b -N -s /dev/sda3 -o /dev/sdb3

Partclone在Windows上运行的需要chkdisk的ntfs上呕吐,因此快速解决方案使partclone高兴了:

ntfsfix -b /dev/sda3
ntfsfix -d /dev/sda3

所有命令均以root身份运行。Partclone的ncurses UI(-N选项)表示,传输速度为7GB / min,最终为5GB / min,相当于83MB / sec。很大的一部分是partclone不会复制未使用的空间,因此这使得克隆速度非常快。

其他可能的豆腐乳:

  • 如果您要转移到的驱动器以前曾使用过,则可能有GPT残留。Windows 7工厂安装通常是msdos / mbr分区表。您需要从目标驱动器中删除GPT片段。这个Unix&Linux质量保证帮助了我。您必须gdisk在设备上使用,依次使用x,z和yes转换GPT数据,并确保保留MBR。

  • 并且不要忘记是否不执行设备级别dd,您将需要使用
    dd if=/dev/sdb of=/dev/sda bs=446 count=1
    sdb是源驱动器或旧驱动器,而sda是目标驱动器或新驱动器source)来复制MBR。


1

我最近一直在创建100GB分区(HDD)的映像并将其写入新的SSD磁盘。

这是可以大大加快此过程的提示:)

将文件分割成较小的部分(文件越大,工作越慢)

sudo dd if=/dev/sda3 conv=sync,noerror bs=2M | split -a 3 -d -b 1G - /maindisk.img

在此过程中,您可以使用(在单独的终端中)检查速度

pgrep -l '^dd$' #to find PROCESSID
kill -USR1 PROCESSID #to check the speed

然后,当您拥有一个充满结果文件的目录(maindisk.img000,maindisk.img001等)时,请使用

sudo cat maindisk.img* | sudo dd of=/dev/sda1

将映像“刻录”到新的SSD部分(分区必须与旧分区的大小相同)

对我来说,它的工作速度比平时快(不拆分)。创建图像的平均速度为〜13MB / s。当我使用“正常”方式时,它从〜15MB / s开始,然后下降到1MB / s。


1
为什么写一个大文件而不是多个小文件会更慢?目标文件系统的类型和安装标志是什么?
David Foerster 2014年

conv=sync有损于性能和在这个用例完全没有用处的。
David Foerster 2014年

0

对于任何发现此线程的人,只需使用为数据恢复设计的工具(如ddrescue),将更加轻松快捷。如果出现读取错误,它将首先抢救好零件。另外,您可以随时中断救援,并在以后再恢复。

运行两次:

第一轮,复制没有读取错误的每个块,然后将错误记录到result.log。

sudo ddrescue -f -n /dev/sdX /dev/sdY rescue.log

第二轮,仅复制坏块,并尝试3次从源头读取,然后放弃。

sudo ddrescue -d -f -r3 /dev/sdX /dev/sdY rescue.log

现在,您可以挂载新驱动器,并检查文件系统是否损坏。

更多信息:https
//www.gnu.org/software/ddrescue/manual/ddrescue_manual.html


0

ID建议将输入/读取-文件/磁盘放在SATA上以提高读取速度。USB 2.0高速也不错,因为与设置为2014 kb / s的 USB 2.0到SATA相比,我使用ddrescue获得的平均速度为33816 kb / s


0

使用不同的块大小。它dd是一次读取的数据量。如果读取得太少,则程序逻辑上将花费更多的时间;如果读取得太多,则将大数据移至周围将花费大量时间。

要测量不同块大小下的速度,请使用以下bash脚本:

  • 设置$dev到设备
  • 修复cbtotal至少为预期读取速度的5倍
    (set -o errexit; skip=0; cbtotal=$((120*1024**2)); bs=256;
    for power in `seq 10`; do
      bs=$((bs*2)); skip=$((skip/2)); count=$((cbtotal/bs));
      if [ "$count" -lt 1 ]; then break; fi;
      echo $bs;
      dd if=$dev of=/dev/null skip=$skip bs=$bs count=$count
      skip=$((skip+count))
    done)

由于前面的磁盘读取,结果可能会偏向更大的大小-这就是为什么设置cbtotal足够大的重要性。

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.