Answers:
更新2016年:如果您使用GNU coreutils> = 8.24(在Ubuntu Xenial 16.04以上版本中是默认设置),请参见下面的方法2,以显示进度的另一种方法。
pv
安装pv
并放在仅输入/输出dd
命令之间。
注意:启动后无法使用dd
。
从包装说明中:
pv
-Pipe Viewer-是基于终端的工具,用于监视通过管道的数据进度。可以将其插入两个过程之间的任何常规管道中,以直观地指示数据通过的速度,花费的时间,完成的时间以及完成之前的估计时间。
安装
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
自动识别尺寸。
status
选项添加到dd
(GNU Coreutils 8.24+)dd
在GNU Coreutils 8.24+(Ubuntu 16.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 if=/dev/zero bs=1M count=35000 | pv | dd of=VirtualDisk.raw
。
pv bigfile.iso | dd of=VirtualDisk.raw bs=1M count=35000
作品,经过验证。@SopalajodeArrierez,参数可以在第二个dd中给出。
pv < /dev/sda > /dev/sdb
似乎会获得更好的速度(来源)
dd if=/dev/urandom | pv | of=/dev/sdb
写入速度为〜18MB / s,速度dd if=/dev/zero | pv | of=/dev/sdb
为〜80MB / s,而普通的速度dd if=/dev/zero of=/dev/sdb
为〜550MB / s(接近SSD的最大写入速度)。全部带有bs=4096000
。
您可以使用以下kill
命令监视dd的进度而无需暂停它。
要查看运行后的进度dd
,请打开另一个终端并输入:
sudo kill -USR1 $(pgrep ^dd)
这将dd
在dd
终端窗口中显示进度,而不会停止该过程。如果您使用的是BSD或OS X,请使用INFO
代替USR1
。该USR1
信号将在dd处终止。
如果您希望获得dd
进度的定期更新,请输入:
watch -n5 'sudo kill -USR1 $(pgrep ^dd)'
watch
将dd
每隔-n秒(-n5
= 5秒)探测一次该过程,并在不停止的情况下进行报告。
注意上面命令中的正确单引号。
kill -INFO $(pgrep ^dd$)
在BSD系统(如OSX)上使用。
sudo pkill -usr1 dd
更容易记住,可以很好地工作(至少在Ubuntu 14.04上),而且键入的次数更少。
pv
会像TeddHansen所示那样降低传输速度。另外,我敢打赌,很多人正在Google上搜索,因为他们已经开始dd
操作了;)
一些方便的示例用法,pv
键入更少,进度更多,然后其他答案:
首先,您需要pv
使用命令安装:
sudo apt-get install pv
然后是一些示例:
pv -n /dev/urandom | dd of=/dev/null
pv -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/
也用于存档自己。
dialog
使用以下命令进行安装apt-get install dialog
dialog
例子。现在宁静!
dialog
这将
brew install pv dialog
对于Mac。这位先生也以风格计算。太棒了
在运行时使用Ctrl+ Shift+ ,它将输出进度(以字节为单位):Tdd
load: 1.51 cmd: dd 31215 uninterruptible 0.28u 3.67s
321121+0 records in
321120+0 records out
164413440 bytes transferred in 112.708791 secs (1458745 bytes/sec)
dd
。
^T
到终端(许多终端应用除外,它们会拦截Ctrl-Shift-T并打开一个新选项卡)。OSX / BSD上的许多搜索者都可能会喜欢这个答案,但应该明确指出,它不是针对Ubuntu(或一般而言是GNU / LInux?)的
为了完整性:
版本8.24的的GNU的coreutils包括用于DD引入参数来打印进度的贴剂。
引入此更改的提交有评论:
dd:new status =进度级别以定期打印统计信息
许多发行版(包括Ubuntu 16.04.2 LTS)都使用此版本。
apt install build-essential
和apt-get build-dep coreutils
,然后下载coreutils-8.25.tar.xz,tar xvf coreutils-8.25.tar.xz
configure --prefix=$HOME/usr/local
然后运行即可make
。新编译的dd
将在src
dir 下。您可以将其复制到/ bin并替换现有的以src / dd
最好是使用http://dcfldd.sourceforge.net/,通过apt-get轻松安装
dd
和选项status=on
,用于进度消息,statusinterval=N
(以N为块)用于消息更新频率和sizeprobe=[if|of]
百分比指示符。我将其别名为DD
:)
本机进度状态已添加到dd !!!
新版本的Coreutils(8.24)向该dd
工具添加了进度状态:
Xubuntu 15.10上的用法:
打开终端并键入以下命令:
wget ftp://ftp.gnu.org/pub/gnu/coreutils/coreutils-8.24.tar.xz
tar -xf coreutils-8.24.tar.xz
cd coreutils-8.24
./configure && make -j $(nproc)
dd
以root身份运行:
sudo su
cd 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
要仅查看文件大小(人类视角):
watch ls -sh /pathtofile/filename
该dd | pv | dd
黑社会让我的50GB的虚拟机副本采取800秒,如只使用DD反对260秒。至少有了这个管道,pv根本不知道输入文件有多大,因此它无法告诉您您走了多远,因此按以下方式进行操作没有任何缺点-并且您获得了不错的速度优势:
我会避免在任何较大的物体上使用PV,并且(如果使用Bash):
Control-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过程,那么这里有一个单行代码可以为您解决整个辣酱玉米饼馅;将所有内容放在一行上:
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
您当然可以编写脚本,也许将$ 1用作输入文件,将$ 2用作输出文件。这留给读者练习。请注意,您需要很少的睡眠才能杀死设备,否则杀死设备可能会在尚未准备好向dd发送信号时死亡。根据需要调整睡眠(甚至可以完全取消第二个睡眠)。
重击-FTW!:-)
while
循环。使用watch
。
sudo watch pkill dd
。然后dd
舒适地观看统计数据。
watch pkill -USR1 -x dd
。由于我也将其watch
用于其他类似的任务,因此这很自然。
http://linuxcommando.blogspot.com/2008/06/show-progress-during-dd-copy.html
基本上:
kill -USR1 < dd pid >
dd if=... of=... bs=4M status=progress oflag=dsync
oflag=dsync
将使您的写作保持同步,因此的信息status=progress
更加准确。但是,它可能会慢一些。
conv=fsync
效果更好
Ubuntu 16.04带有dd(coreutils)版本8.25。因此,该选项status=progress
为 Supported :-)
要使用它,只需status=progress
与dd
命令一起添加即可。
范例:
dd bs=4M if=/media/severus/tools-soft/OperatingSystems/ubuntu-16.04-desktop-amd64.iso of=/dev/null status=progress && sync
赋予状态为
1282846183 bytes (1.2 GiB, 1.1 GiB) copied, 14.03 s, 101.9 MB/s
我真的很喜欢ddrescue,它可以像dd一样工作,但是可以提供输出,并且不会出错,相反,它具有非常先进的算法,因此很难成功地进行复制...还有很多GUI
项目:https://www.gnu.org/software/ddrescue
我已经创建了bash包装器dd
,pv
用于显示进度。将其放入您的手机.bashrc
并dd
照常使用:
# dd if=/dev/vvg0/root of=/dev/vvg1/root bs=4M
2GB 0:00:17 [ 120MB/s] [===========================================================>] 100%
0+16384 records in
0+16384 records out
2147483648 bytes (2.1 GB) copied, 18.3353 s, 117 MB/s
资源:
dd()
{
local dd=$(which dd); [ "$dd" ] || {
echo "'dd' is not installed!" >&2
return 1
}
local pv=$(which pv); [ "$pv" ] || {
echo "'pv' is not installed!" >&2
"$dd" "$@"
return $?
}
local arg arg2 infile
local -a args
for arg in "$@"
do
arg2=${arg#if=}
if [ "$arg2" != "$arg" ]
then
infile=$arg2
else
args[${#args[@]}]=$arg
fi
done
"$pv" -tpreb "$infile" | "$dd" "${args[@]}"
}
#!/bin/bash
。在底部:tmp=":${PATH}:"; tmp=${tmp/:/usr/local/bin:/:}; tmp=${tmp%:}; PATH=${tmp#:}; dd "$@"
或者,您可能希望对dd
位置进行硬编码。然后使用local dd=/usr/bin/dd
。不要忘记添加可执行位:chmod +x /usr/local/dd
。
以防万一来自CentOS的人碰巧找到了这个线程...
'status = progress'选项适用于CentOS 7.5和7.6
@davidDavidson的上述答案表示该功能是Coreutils 8.24中新添加的。
GNU coreutils的版本8.24包含一个用于dd的补丁,其中引入了一个用于打印进度的参数。
可能是这种情况,但是CentOS可能不会遵循相同的版本控制方案。
CentOS 7.6.1810随附的Coreutils版本为:
coreutils-8.22-23.el7.x86_64 : A set of basic GNU tools commonly used in shell scripts
并且所安装的dd的版本是:
[root@hostname /]# dd --version
dd (coreutils) 8.22
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Paul Rubin, David MacKenzie, and Stuart Kemp.
这显示了版本8.22。
但是,我已经在CentOS 7.5和CentOS 7.6(都使用Coreutils的8.22版)上用dd测试了“ status = progress”,并且它可以正常工作。
我不知道为什么RedHat选择使用Coreutils的旧版本,但是功能确实存在于8.22中。
如上所述,至少使用GNU coreutils或busybox中的“ dd”,它将通过将进度信息打印到stderr来响应USR1信号。
我为dd写了一个小包装脚本,该脚本显示了一个不错的百分比完成指标,并尝试不以任何方式干扰dd的过程或工作方式。您可以在github上找到它:
http://github.com/delt01/dd_printpercent
不幸的是,此SIGUSR1技巧仅适用于GNU dd(来自coreutils软件包)或busybox的“ dd”模式,并且在编译时启用了该特定功能。它不适用于大多数BSD系统(包括FreeBSD和OS X)中包含的股票“ dd” ... :(
您可以使用观看任何coreutils程序的进度progress - Coreutils Progress Viewer
。
它可以监视:
cp mv dd tar tar rsync grep fgrep egrep cut sort md5sum sha1sum sha224sum sha256sum sha384sum sha512sum adb gzip gunzip bzip2 bunzip2 xz unxz lzma unlzma 7z 7za zcat bzcat lzcat split gpg
你可以看到手册页
您可以在命令运行时在单独的终端窗口中使用它,也可以使用dd命令启动它:
dd if=/dev/sda of=file.img & progress -mp $!
在此&
派生第一个命令并立即继续,而不是等待命令结束。
使用以下命令启动progress命令:-m
因此它等待直到受监视的进程结束,-p
因此它将监视给定的pid,$!
它是最后一个命令pid。
如果使用sudo发出dd,那么您也必须同样取得进展:
sudo dd if=/dev/sda of=file.img &
sudo progress -m
# with no -p, this will wait for all coreutil commands to finish
# but $! will give the sudo command's pid