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

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

原问题:

如果我有2 个相同的硬盘具有以下特点:

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

完整的 dd 复制需要多长时间才能完成?

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

我使用的是Linux Ubuntu 12.04 64位,我使用的命令是:

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

更新:1

我现在可以看到进度了,复制 430GB 已经用了 6 个多小时了。硬盘容量是3TB...

难道没有更快的方法吗?


更新:2

这看起来比以前好多了(感谢格罗克斯达为了建议):

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

3TB 的预计到达时间约为 9 小时,而之前 6 小时后达到 430GB,所以我猜测使用之前的命令大约需要 36 小时。

答案1

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要快,并且比任何块大小都快;复制到同一磁盘时,块大小较大的速度稍快。)cpcpdddd

cat /dev/sdb >/dev/sdc

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

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

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

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

如果您想要进度报告,并且您的 UNIX 变体没有提供获取文件描述符位置的简单方法,您可以安装并使用pv代替cat

答案2

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,它会重新复制一些已经复制的部分,这通常不会造成任何损害。因此,如果有疑问,您应该选择一个比您认为已复制的值稍小的值。

答案3

获取有关正在进行的 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. 确保您的硬盘未安装,否则可能会导致副本损坏。

答案4

有一个商业软件叫高清克隆。它被许可为免费软件和商业软件。任一版本都可以创建可启动随身碟或 DVD,以及复制磁盘。连接源硬盘和目标硬盘并按照基于 GUI 的说明进行操作。

免费版本的传输速度约为 80MB/秒,而付费版本的速度则要快得多。对于 NTFS 和 FAT 文件系统,付费版本可以配置为仅克隆硬盘的已占用位,这大大提高了每次克隆的速度。

相关内容