'dd' 命令是否耗时太长?

25 clone dd

我设置dd将较小的系统 40.00GB 硬盘驱动器 (/dev/sda) 克隆到通过 USB 读取器 (dev/sdb) 连接的新的更大的 111.00GB 硬盘驱动器,现在已经运行了两个小时。新硬盘驱动器上的活动计显示它正在做某事。但是CPU只有20%左右。这件事什么时候能完成?我应该重新开始这个过程吗?

Jim*_*ter 60

将来,您应该使用pv来获取正在运行的进度条。

sudo apt-get install pv

pv安装,让我们假设你想要一个20GB硬盘,克隆/dev/foo,到另一个驱动器(20GB或更大!) /dev/baz

sudo dd if=/dev/foo bs=4M | pv -s 20G | sudo dd of=/dev/baz bs=4M

需要注意的重要部分:bs=4M参数将 dd 操作的块大小设置为 4MB,这大大提高了整个过程的速度。并且-s 20G参数说明pv此操作预计有多大,因此它可以为您提供 ETA 以及当前速度。

pv太爱了,应该是违法的。

请注意,虽然这样做从左到右的顺序是直观、漂亮和整洁的,但如果您谈论的是真正快速的数据流,则往返 STDOUT 的管道可能会导致性能损失。如果您正在考虑移动数百 MB/秒,以下语法会更快:

pv -s 20G < /dev/foo > /dev/baz

-s 20G是可选的,如果您确实知道流有多大(或大约有多大),它可以pv为您提供完成时间的估计。如果没有,pv将尝试弄清楚数据集有多大(例如,它知道文件有多大),但如果不能(例如,使用块设备,而不是文件),它只会告诉您无需猜测事情将需要多长时间的传输速率。

  • 稍后再谈:与 pv 的作者交谈后,我发现您可以通过将 dd 完全从等式中删除来避免速度损失:`pv &lt; /dev/sda &gt; /dev/sdb` 工作得很好,并且将与底层硬件能够运行的一样快。 (14认同)

Col*_*ing 27

您可以通过向它发送 SIGUSR1 信号来查看它已经走了多远,以便查看它复制了多少数据和传输速率:

kill -SIGUSR1 $(pidof dd)
Run Code Online (Sandbox Code Playgroud)

对于复制活动,您会受到设备 I/O 速度的限制,因此 CPU 不应满载,因此不必担心。

  • OS X 的 dd 必须损坏,因为发送 SIGUSR1 也为我杀死了它。 (4认同)
  • 从别处:在 BSD 系统(如 OSX)上 kill -INFO $(pgrep ^dd$)。 (3认同)

Eld*_*eek 7

正如其他答案中所建议的那样,我过去曾使用过 pv 以及 (ps and kill),但最近我一直在使用dc3dd它来产生相同的结果,同时在整个过程中提供进度报告。

您可以检查它是否已经安装: which dc3dd

如果没有,你可以安装它 sudo apt-get install dc3dd

命令开关类似于 dd(用于克隆,尽管擦除更简单一些)。

在你的情况下,我会使用命令 dc3dd if=/dev/sda of=/dev/sdb

编辑:

dd来自Ubuntu 16.04 及更高版本中包含的coreutils 包版本 8.24+ 的最新版本包含一个状态参数。您可以dd通过将status=progress开关添加到dd命令行来实现相同的结果。

例子: dd if=/dev/zero of=/dev/null count=1000 status=progress