原问题:
如果我有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
要快,并且比任何块大小都快;复制到同一磁盘时,块大小较大的速度稍快。)cp
cp
dd
dd
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)。
加快进程
- 将每个 HDD 连接到其自己的 SATA 端口,以便可以从一个设备读取数据并同时将数据写入另一个设备。
- 使用参数使用适当的块大小
bs=
。看一下超级用户的这个线程并为自己尝试一些值。 - 使用单独的
dd
调用进行读取和写入,并使用管道连接它们 (dd if=/dev/sda bs=1M | dd of=/dev/sdb bs=1M
)。
如果执行此操作并指定块大小,请确保在每次调用时使用相同的块大小。 - 您可以尝试其他优化,例如
direct
参数。 - 确保您的硬盘未安装,否则可能会导致副本损坏。
答案4
有一个商业软件叫高清克隆。它被许可为免费软件和商业软件。任一版本都可以创建可启动随身碟或 DVD,以及复制磁盘。连接源硬盘和目标硬盘并按照基于 GUI 的说明进行操作。
免费版本的传输速度约为 80MB/秒,而付费版本的速度则要快得多。对于 NTFS 和 FAT 文件系统,付费版本可以配置为仅克隆硬盘的已占用位,这大大提高了每次克隆的速度。