玩命加载中 . . .

查看dd进度


概述

dd是一个神奇的命令,可以将硬盘驱动器复制到另一个硬盘驱动器,完全归零硬盘驱动器等。但是,一旦启动 dd 命令,就没法显示它的进度,只是坐在光标处,直到命令最终完成。那么如何监控dd的进展呢?本文以ubuntu环境为例进行阐述。

查看dd进度

新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

使用kill获取进度

dd if=/dev/zero of=/tmp/zero.img bs=10M count=100000

想要查看上面的dd命令的执行进度,可以使用下面几种方法:

比如:每5秒输出dd的进度

方法一:

watch -n 5 pkill -USR1 ^dd$

方法二:

watch -n 5 killall -USR1 dd

方法三:

while killall -USR1 dd; do sleep 5; done

方法四:

while (ps auxww |grep " dd " |grep -v grep |awk '{print $2}' |while read pid; do kill -USR1 $pid; done) ; do sleep 5; done

方法五:

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

上面这个命令,糅合了具体的dd命令,然后kill它来显示进度

pv显示进度

题外话:

pv不仅仅有显示进度的功能,还有结合dd来限制dd读写速度, e.g:

pv --rate-limit 2M -q -cN source < /dev/zero |dd of=off_file bs=1M count=1024 iflag=fullblock

非本文要阐述的内容,有兴趣的可以man pv查看使用手册。

如果没有pv,执行下列命令进行安装

apt-get install pv

创建bash包装器,使用pv来显示进度

在.bashrc中增加包装器,将下面内容放入.bashrc文件

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[@]}"
}

source一下.bashrc

之后再来使用dd命令,就可以看到进度了~

直接命令行用pv显示进度

示例:

dd if=/dev/urandom | pv | dd of=/dev/null

输出:

44.2MB 0:00:04 [11.4MB/s] [ <=> ]

如果想要时间估算,可以使用 --size 指定近似大小:

dd if=/dev/urandom | pv -s 2G| dd of=/dev/null

示例:

写一个文件,并显示进度:

pv -cN source < /dev/zero | dd of=1g bs=100k count=10240

输出如下:

root@host245:~/tmp# pv -cN source < /dev/zero | dd of=1g bs=100k count=10240
   source:  960MB 0:00:01 [ 627MB/s] [         <=>                                                                                                                                                                                                                           ]
7680+2560 records in
7680+2560 records out
1006632960 bytes (1.0 GB) copied, 4.18198 s, 241 MB/s
root@host245:~/tmp# 

使用pv配合dialog还可以显示进度条对话框:

需要事先安装dialog

apt-get install dialog

(pv -n /dev/sda | dd of=/dev/zero bs=128M) 2>&1 | dialog --gauge "dd process bar" 10 70 0

示例:

克隆磁盘驱动器:

(pv -n /dev/sda | dd of=/dev/sdh bs=128M conv=notrunc,noerror) 2>&1 | dialog --gauge "Running dd command (cloning), please wait..." 10 70 0


文章作者: Gavin Wang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Gavin Wang !
  目录