我怎么知道`dd`克隆需要多长时间?

我需要克隆几个1TB硬盘,但它们需要数小时的时间。我想知道有没有办法知道它们的复制速度、已完成的进度以及剩余时间。
我只能看到运行命令的终端。当我运行“ps -e”时,至少我知道“dd”正在工作,因为CPU使用率显示出来了,但我无法知道它已经完成了多少或者还需要多长时间才能完成。
这让我有点疯狂。

1这里有另一个讨论,介绍了不同的方法来监控dd命令的进度。你可以在http://askubuntu.com/questions/215505/how-do-you-monitor-the-progress-of-dd上找到更多信息。 - TheNano
重复的问题有一个更新的答案。 - Garrett
@Garrett 正确。这就是为什么这个被标记为那个的重复。谢谢。 - Luis Alvarado
4个回答

典型。每次我问问题时,总会在某种程度上找到答案(即使我花了几个小时去寻找..但是神奇的是,在创建问题之后我才找到它 -.- )。无论如何,根据我使用dd --help检查的内容,在帮助文档的末尾(我真的不敢相信我没有看到那个)提到了以下内容:
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; sleep 1; kill $pid
   18335302+0 records in
   18335302+0 records out
   9387674624 bytes (9.4 GB) copied, 34.6279 seconds, 271 MB/s

这意味着在另一个终端中,您将使用要检查的DD的进程ID运行以下命令。例如,在我的情况下,进程ID是4112。您可以通过输入“ps -e”并查找dd或只需输入“ps -e | grep dd”并查看前面的数字来查看进程ID。记下该数字,然后在另一个终端窗口中键入“kill -USR1 4112; sleep 1;”。这将给我提供自开始以来经过的时间(秒)和已复制的数据量。至少现在我知道,以大约40MB/s的速度复制1TB的信息需要大约8小时。

pv虽然更方便。 - Mechanical snail
6这在OSX上没用,它只是把它杀掉了...这真不幸,因为它已经运行了一个小时了... :( - balupton
@balupton 强烈建议你在Launchpad上报告这个问题。可能与所有的OSX有关,或者是你个人的情况。我刚刚尝试了一下(不是OSX),它可以正常工作,所以你可能是一个巨大bug的骄傲拥有者。去解决它吧! - Luis Alvarado
2不要运行kill $pid。这可能会终止复制进程。@Luis,你的回答有点误导人。你只需要运行ps -a | grep dd,然后发送信号给获取到的pid kill -USR1 123456789(其中"123456789"是pid)。 - Nux
2@nux 嗨朋友,感谢你的评论。在这种情况下,这是直接来自于man手册。以防万一,对于DD命令,当它接收到虚拟信号USR1时,它会像更详细的日志一样运行,因此会输出示例中提到的最后一行。 - Luis Alvarado
2在BSD系统上,你需要发送INFO信号。Linux没有SIGINFO,而是使用USR1代替。参见此处:http://unix.stackexchange.com/a/11264/154671 - Marc.2377

使用程序pv来查看任何管道流的实时数据传输报告。它可用于使用管道的任何应用程序。同时,它也是一个很好的工具,可以查看诸如USB、外部磁盘和网络计算机等的传输速率。
dd if=infile | pv > outfile

或者直接复制,只需使用以下内容:

pv infile > outfile

例子:

sudo pv /dev/sda1 > /home/user/sda1.ext4.img

你能否额外添加一个用于创建克隆磁盘的案例,类似于使用pv命令的dd if=/dev/sda of=/dev/sdb。 - Luis Alvarado
@LuisAlvarado:pv /dev/sda > /dev/sdb。同时给您一个漂亮的进度条。 - Mechanical snail
@Mechanicalsnail - 等一下,你是说我可以这样克隆一个光盘吗? - Luis Alvarado
2@LuisAlvarado,是的,你可以这样克隆一个光盘。Mech使用了另一个分区作为输出,但你也可以将输出保存到一个名为“sda.img”的普通文件中。 - Rucent88
1不要忘记dd if=/dev/sda | pv | dd of=/dev/sdb - Trevor Rudolph
也许甚至可以尝试使用源文件的字节大小参数-s - Trevor Rudolph
对于那些现在终于能够监控吞吐量但不明白为什么速度只有<10kiB/s的人,请参考https://unix.stackexchange.com/a/322224/120881。 - Jorn

关于在Mac上使用kill命令显示信息,你需要传递-INFO标志而不是-USR1标志。请记住,它会在你的dd进程所在的终端中显示信息,因此如果你打开一个新的标签输入kill -INFO $PID(其中$PID是你用ps -e | grep dd找到的数字),你需要切换回dd运行的标签才能看到输出。
现在,如果我能弄清楚如何将输出显示为GB或MB而不是纯字节就好了...

1关于OSX的FYI,现在似乎可以按下CTRL + t来获得进度输出。我不确定这是否是一个新功能,但在我的OSX Catalina(10.15)上可用,比大多数解决方案要简单得多 :) - abhchand

已经有另一个名为dcfldd的扩展dd,可以做很多有趣的事情,就像你所要求的一样http://dcfldd.sourceforge.net/

  1. sudo apt-get install dcfldd
  2. 不要使用dd,而是使用dcfldd

2+1 但是该应用程序的最后更新是在2006年。即使它能正常工作,我仍然会选择使用普通的dd或pv,直到我尝试了带有大量非重要信息的dcfldd。 - Luis Alvarado