从硬盘到硬盘的完整DD复制


34

原始问题:

如果我有两个具有以下特征的相同硬盘驱动器

  • SATA 6.0 Gb /秒
  • 5400转
  • 3TB

完整的dd副本需要多长时间才能完成?

到目前为止,它已经运行了5个小时,并且仍在运行...

我正在使用Linux Ubuntu 12.04 64bit,并且我正在使用的命令是:

dd if=/dev/sdb of=/dev/sdc

更新:1

现在,我可以看到进度,复制430GB已超过6个小时。硬盘为3TB ...

没有更快的方法吗?


更新:2

这似乎比以前要好得多(感谢Groxxda的建议):

sudo dd if=/dev/sdb bs=128K | pv -s 3000G | sudo dd of=/dev/sdc bs=128K

对于3TB,ETA大约需要9个小时,而在6小时之后达到430GB之前,所以我猜测使用前一个命令大约需要36个小时。


尝试获取该进程的统计信息:将USR1信号发送到正在运行的“ dd”进程将使其打印I / O统计信息为标准错误,然后继续复制。$ dd if = / dev / zero of = / dev / null&pid = $!$ kill -USR1 $ pid检查您的手册页以获取实际信号,因为不同的dd实现会有所不同。
groxxda 2014年

@Groxxda,我不知道该怎么做。
oshirowanen 2014年

1
GNU dd使用SIGUSR1,而BSD dd使用SIGINFO
groxxda 2014年

另外,“连接到相同的sata电缆”是什么意思?您是否正在使用某种端口倍增器?(如果达到150MB / s的传输速率,则需要5-6小时,但我认为其中一半是更现实的。)
groxxda 2014年

1
您可以通过指定其他(更大)的块大小(作为的bs=参数dd)来加快此过程。还可以考虑将每个HDD连接到其自己的sata端口。
groxxda 2014年

Answers:


58

dd在过去人们使用磁带(块大小很重要)以及较简单的工具(例如cat可能不是二进制安全的工具)时,这种方法很有用。

如今,dd if=/dev/sdb of=/dev/sdc这只是一种复杂的,容易出错的,缓慢的书写方式cat /dev/sdb >/dev/sdc。尽管dd对于一些相对罕见的任务仍然有用,但它比许多让您相信的教程有用得多。没有魔力dd,魔力无所不包/dev/sdb

您的新命令sudo dd if=/dev/sdb bs=128K | pv -s 3000G | sudo dd of=/dev/sdc bs=128K又不必要又缓慢又复杂。一次读取的数据为128kB(比dd默认值512B好,但不及更大的值)。然后在写入之前先经过两个管道。

使用更简单,更快速的cat命令。(根据几年前我在Linux下进行的一些基准测试cat它比cp在不同磁盘之间进行复制cp要快,并且比dd任何块大小都要快;dd对于大块大小,当复制到同一磁盘上时要快一些。)

cat /dev/sdb >/dev/sdc

如果要在中运行此命令sudo,则需要以root身份进行重定向:

sudo sh -c 'cat /dev/sdb >/dev/sdc'

如果需要进度报告,因为您使用的是Linux,因此可以通过注意cat进程的PID (例如1234)并查看其输入(或输出)文件描述符的位置来轻松获得一份进度报告。

# cat /proc/1234/fdinfo/0
pos:    64155648 
flags:  0100000

如果您需要进度报告,而您的Unix变体不提供一种获取文件描述符位置的简便方法,则可以安装和使用pv代替cat


大块的奇怪之处在于瓶颈是磁盘,那么什么cat比磁盘快dd?可能是cat使用缓存吗?
伊曼纽尔

1
@吉尔斯,谢谢你的回答。我还有五个3TB驱动器要克隆,接下来将尝试使用cat选项。据我所知,新的dd命令将需要另外3个小时来完成,总共大约需要11个小时。如果第二个3TB HDD的cat方法快于11小时,我将对其余驱动器使用该方法。
oshirowanen 2014年

2
@Gilles,因此要获取进度报告,我可以使用sudo sh -c 'pv /dev/sdb >/dev/sdc'代替sudo sh -c 'cat /dev/sdb >/dev/sdc'吗?
oshirowanen 2014年

1
@oshirowanen是的,pv在您要使用的地方使用cat
吉尔斯(Gilles)'所以

1
@unhammer不!您将一个一个地复制每个设备,例如cat /dev/sdc1 >/dev/sdb1 && cat /dev/sdd1 >/dev/sde1。将两个部分串联起来是没有意义的。如果要更改btrfs卷的结构,将其从具有两个子卷更改为一个子卷,则需要使用btrfs工具来更改结构,或者像创建具有所需结构的新文件系统并复制文件一样。
吉尔斯(Gillles)“所以-别再作恶了”

7

dd默认情况下使用很小的块大小(512字节)。这会导致大量开销(每512字节一个read()和一个write()系统调用)。

当您使用更大的块大小时,它的运行速度要快得多。最佳速度大约在bs=64k。大多数人使用更大的尺寸,bs=1M因此变得易于阅读(当dd说复制时1234 blocks,您1234 MiB无需做任何数学运算)。使用更大的块大小不太可能导致速度提高,而只会增加内存消耗。

因此,命令应为:

dd bs=1M if=/dev/sdb of=/dev/sdc

如果您已经dd运行缓慢,则可以中断它并以更快的dd实例继续运行。为此,重要的是要知道复制已经进行了多长时间。dd通常在取消时打印进度,或者您可以USR1在运行时向其发送信号以使其打印进度。

kill -USR1 $(pidof dd)

例如,如果复制的数量大于1234MiB,则可以1234MiB使用以下命令在该位置继续:

dd bs=1M seek=1234 skip=1234 if=/dev/sdb of=/dev/sdc

如果复制的数量少于1234MiB,则您的副本将不完整。如果复制的数量超过1234MiB,它将重新复制一些已经复制的部件,通常不会造成任何伤害。因此,如果有疑问,您应该选择一个比您认为已经复制的值稍小的值。


5

获取有关正在进行的dd进程的统计信息

您可以将kill命令与适当的信号一起使用,以使dd输出统计信息达到标准错误。
在GNU dd手册页中:

Sending a USR1 signal to a running 'dd' process makes it print I/O statistics to standard error and then resume copying.
      $ dd if=/dev/zero of=/dev/null& pid=$!
      $ kill -USR1 $pid
      18335302+0 records in 18335302+0 records out 9387674624 bytes (9.4 GB)  copied,  34.6279 seconds, 271 MB/s

确保首先检查手册页中是否有正确的信号,因为在不同的dd实现中它可能会有所不同:(BSD dd使用SIGINFO)。

加快流程

  1. 将每个HDD连接到其自己的SATA端口,以便可以同时从一台设备读取数据并将其写入另一台设备。
  2. 使用bs=参数使用适当的块大小。看一下超级用户的这个线程并为自己尝试一些值。
  3. 使用单独的dd调用进行读写,并使用管道将它们连接起来(dd if=/dev/sda bs=1M | dd of=/dev/sdb bs=1M)。
    如果执行此操作并指定一个块大小,请确保在每次调用时使用相同的块大小。
  4. 您可以尝试其他优化方法,例如direct参数。
  5. 确保未安装硬盘,否则可能导致副本损坏。

0

您是否尝试过“ gparted”?您可以将分区从一个驱动器复制粘贴到另一个驱动器,然后根据需要调整其大小。您会得到传输速率和剩余时间。它在Linux分区下面使用“ e2image”。


0

有一种称为HDClone的商业软件。它被许可为免费软件和商业软件。两种版本都可以创建可启动的Pendrive或DVD,以及复制磁盘。连接源HD和目标HD,并遵循基于GUI的说明。

免费版本的传输速度约为80MB /秒,而付费版本的传输速度更快。对于NTFS和FAT文件系统,可以将付费版本配置为仅克隆HD的占用位,从而显着提高每个克隆的速度。


(1)您与此产品有关联吗?(2)我们在哪里可以得到它?
斯科特,

1
或者你可以只用“猫的/ dev / SDX>的/ dev / SDY”免费...
HörmannHH
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.