dd
真是个奇迹。 它可以让你复制一个硬盘驱动器到另一个,完全零硬盘驱动器等。 但一旦你启动了一个 dd
命令,没有什么可以告诉你它的进展。 它只是坐在光标处,直到命令最终完成。 那么如何监控dd的进展呢?
更新2016>:如果您使用GNU coreutils=8.24(Ubuntu Xenial16.04向上的默认值),请参阅下面的方法2以获取显示进度的替代方法。
方法1:通过使用 pv
安装/安装 pv
并将其放在输入/输出之间 dd
命令。
注意事项:你不能使用它,当你已经开始 dd
.
从 包装说明:
pv
-管道查看器-是一个基于终端的工具,用于通过管道监控数据的进度。 它可以插入到两个进程之间的任何正常管道中,以直观地显示数据传递的速度、需要多长时间、距离完成有多近,以及估计到完成需要多长时间。
安装工程
sudo apt-get install pv
例子:
dd if=/dev/urandom | pv | dd of=/dev/null
输出
1,74MB 0:00:09 [ 198kB/s] [ <=> ]
您可以使用 --size
如果你想要一个时间估计。
示例假设从/dev/sdb复制2GB磁盘
命令没有 pv
会是:
sudo dd if=/dev/sdb of=DriveCopy1.dd bs=4096
命令与 pv
:
sudo dd if=/dev/sdb | pv -s 2G | dd of=DriveCopy1.dd bs=4096
输出:
440MB 0:00:38 [11.6MB/s] [======> ] 21% ETA 0:02:19
其他用途
你当然可以使用 pv
直接将输出通过管道传输到stdout:
pv /home/user/bigfile.iso | md5sum
输出
50,2MB 0:00:06 [8,66MB/s] [=======> ] 49% ETA 0:00:06
请注意,在这种情况下, pv
自动识别大小。
方法2:新 status
选项添加到 dd
(GNU Coreutils8.24+)
dd
在GNU Coreutils8.24+(Ubuntu16.04及更新版本)中得到了一个新的 status
显示进度的选项:
例子:
dd if=/dev/urandom of=/dev/null status=progress
输出
462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s
你可以监察 dd
一旦它运行而没有停止它使用 kill
命令向进程发送信号。
开始后 dd
,打开另一个终端并输入 要么:
sudo kill -USR1 $(pgrep ^dd$)
或,如果你在BSD或OS X:
sudo kill -INFO $(pgrep ^dd$)
这将显示在 dd
终端窗口,而不会停止过程(通过打印到其stderr流)。 例如:
# dd if=/dev/urandom of=rando bs=1024 count=1048576335822+0 records in335821+0 records out343880704 bytes (344 MB, 328 MiB) copied, 6.85661 s, 50.2 MB/s
如你想定期更新 dd
进度,然后进入:
watch -n5 'sudo kill -USR1 $(pgrep ^dd$)'
watch
将探测 dd
处理每-n秒(-n5
=5秒)并在没有停止的情况下报告。
请注意上面命令中的正确单引号。
一些方便的示例用法 pv
和更少的打字或更多的进展,然后其他答案:
首先,您需要安装 pv
,用命令:
sudo apt-get install pv
然后一些例子是:
pv -n /dev/urandom | dd of=/dev/nullpv -tpreb source.iso | dd of=/dev/BLABLA bs=4096 conv=notrunc,noerror
注意:第一个示例是5个字符少打字然后 dd if=/dev/urandom | pv | dd of=/dev/null
.
我最喜欢克隆磁盘驱动器(用驱动器号替换X):
(pv -n /dev/sdX | dd of=/dev/sdX bs=128M conv=notrunc,noerror) 2>&1 | dialog --gauge "Running dd command (cloning), please wait..." 10 70 0
资料来源: http://www.cyberciti.biz/faq/linux-unix-dd-command-show-progress-while-coping/
也是为了自己存档。
为了完整起见:
版本 8.24 的 GNU coreutils 包括dd的补丁,引入一个参数来打印进度。
承诺 介绍这一变化有评论:
dd:新 状态=进度 定期打印统计信息
许多发行版,包括 Ubuntu16.04.2LTS 使用此版本。
使用方法 Ctrl+Shift+T 而 dd
正在运行,它将输出进度(以字节为单位):
load: 1.51 cmd: dd 31215 uninterruptible 0.28u 3.67s321121+0 records in321120+0 records out164413440 bytes transferred in 112.708791 secs (1458745 bytes/sec)
本机进度状态被添加到dd!!!
新版本的Coreutils(8.24)将进度状态添加到 dd
工具:
Xubuntu15.10上的用法:
打开终端并键入以下命令:
wget ftp://ftp.gnu.org/pub/gnu/coreutils/coreutils-8.24.tar.xztar -xf coreutils-8.24.tar.xzcd coreutils-8.24./configure && make -j $(nproc)
跑 dd
作为根:
sudo sucd src./dd if=/dev/sdc of=/dev/sda conv=noerror status=progress
您将看到:字节,秒和速度(字节/秒)。
要检查的版本 dd
:
土着人:
dd --version
新的:
cd coreutils-8.24/src./dd --version
如果您已经启动了dd,并且正在编写文件,例如在创建pendrive到磁盘的副本时,您可以使用watch命令不断观察输出文件的大小以查看更改并估计完成情况。
watch ls -l /pathtofile/filename
只查看档案大小(h-人类视图):
watch ls -sh /pathtofile/filename
该 dd | pv | dd
triad使我的50gb vm副本需要800秒,而不是仅使用dd的260秒。 通过这个管道,至少,pv不知道输入文件有多大,所以它不能告诉你你有多远,所以这样做没有缺点-而且你会得到一个很好的速度优势:
我会避免pv在任何大的东西上,并且(如果使用Bash):
控制-z dd过程
bg
把它放在后台。 注意这一点 bg
会给你输出像 [1] 6011
其中后一个数字是进程id。 所以,做:
while true; do kill -USR1 process_id ; sleep 5; done
其中process_id是您观察到的进程id。 当你看到类似的东西时,点击Control-C:
[1]+ Done dd if=/path/file.qcow2 of=/dev/kvm/pxetest bs=4194304 conv=sparse-bash: kill: (60111) - No such process
你玩完了。
编辑:愚蠢的系统管理员! 自动化你的生活,不要工作! 如果我有一个很长的dd过程,我想监控,这里有一个单行,将为你照顾整个enchilada;把这一切放在一条线上:
dd if=/path/to/bigimage of=/path/to/newimage conv=sparse bs=262144 & bgid=$!; while true; do sleep 1; kill -USR1 $bgid || break; sleep 4; done
当然,您可以编写脚本,也许将input1作为输入文件,将output2作为输出文件。 这是留给读者的练习。 请注意,在杀死之前你需要一点睡眠,或者杀死可能会在dd还没有准备好的时候试图向dd发送信号。 根据需要调整你的睡眠(甚至可能完全取消第二次睡眠)。
Bash-FTW! :-)
http://linuxcommando.blogspot.com/2008/06/show-progress-during-dd-copy.html
基本上:
kill -USR1 < dd pid >