Linux dd 命令显示带有状态的进度复制栏
教程详细信息 | |
---|---|
难度等级 | 中间的 |
Root 权限 | 是的 |
要求 | Linux 终端 |
类别 | 磁盘空间分析器 |
操作系统兼容性 | Alma • Alpine • Arch • BSD • CentOS • Debian • Fedora • Linux • macOS • Mint • openSUSE • Pop!_OS • RHEL • Rocky • Stream • SUSE • Ubuntu |
预计阅读时间 | 4 分钟 |
Linux dd 命令显示带有状态的进度复制栏
警告!如果执行不当,这些示例可能会导致您的计算机崩溃并导致数据丢失。示例或作者对数据丢失不承担任何责任。
您需要使用 coreutils 版本 8.24 或更高版本的 gnu dd 命令才能使用以下选项。使用 dd 命令显示进度复制条的语法如下:
让我们传递进度选项以使用 GNU dd 命令查看定期传输统计信息:
# dd if=/path/to/input of=/path/to/output status=progress
# dd if=/dev/sda of=/dev/sdb bs=1024k status=progress
Gif.01:Linux 监控 dd 命令的进度
你如何监控 dd 的进度?
这是另一个示例。首先,使用grep 命令和 hwinfo 命令找出您的 USB 设备名称:
$ grep -Ff <(hwinfo --disk --short) <(hwinfo --usb --short)
输出:
disk: /dev/sdc SanDisk Ultra
您还可以尝试df 命令或 mount 命令来识别 Linux 下已挂载的 USB 笔和硬盘。例如:
接下来,在 Linux 下卸载设备:
最后,将 iso 映像写入名为 /dev/sdc 的 USB 设备并监控 dd 的进度:示例输出:
$ df -hT
$ mount
$ sudo umount /dev/sdc
$ sudo dd if=openSUSE-Leap-15.1-DVD-x86_64.iso of=/dev/sdc bs=4M status=progress
2684354560 bytes (2.7 GB, 2.5 GiB) copied, 1 s, 2.7 GB/s 967+1 records in 967+1 records out 4056940544 bytes (4.1 GB, 3.8 GiB) copied, 361.614 s, 11.2 MB/s
dd status=LEVEL 选项
除了选项之外status=progress,您还可以传递以下两个选项来微调 dd 命令输出:
- status=noxfer:抑制最终传输统计信息。它将隐藏传输统计信息作为状态输出的最后一行。
- status=none:除了错误消息之外,不要打印状态输出。
使用 pv 命令监视 dd 命令的进度并查看状态
另一个选项是使用 pv 命令,它允许您查看数据通过管道的进度。您需要按照此处所述安装 pv 命令。安装后,键入以下命令查看状态栏。请注意,如果标准输入不是文件并且选项中没有指定大小-s,则进度条无法指示传输距离完成还有多远,因此它只会左右移动以指示数据正在移动。它还将显示平均 MB/s 速率。将 /dev/sda 复制到 /dev/sdb:
# pv -tpreb /dev/sda | dd of=/dev/sdb bs=64M
或
# pv -tpreb /dev/sda | dd of=/dev/sdb bs=4096 conv=notrunc,noerror
图 01:pv 和 dd 的作用
$ (pv -n /dev/sda | dd of=/dev/sdb bs=128M conv=notrunc,noerror) 2>&1 \
| dialog --gauge "Running dd command (cloning), please wait..." 10 70 0
图 02:使用 pv 和 dialog 命令显示正在进行的 dd 命令的状态
示例:仅使用 coreutils 版本 8.24 或更高版本的 gnu dd 命令
以下是我的 Apple Mac OS X/MacOS 的另一个示例:
$ sudo gdd if=ZeroShell-3.6.0-USB.img of=/dev/disk5 bs=1024k status=progress
图 03:GNU dd 显示进度
如何在 Linux 上监控 dd 的进度?
如果您使用的是旧版本的 dd或无法安装 pv 命令,请尝试以下简单的单行 bash shell while 循环/命令:
## 1. first start dd as usual ## sudo dd if=/dev/sdc of=/tmp/demo.img bs=4M ## 2. Open another terminal or tab ## ## 3. find pid of dd command ## pidof dd ### <--- say pid is 21145 ps aux | grep -w dd ## 4. Run bash/sh while loop as follows ## while sudo kill -USR1 21145 ; do sleep 10 ; done ## 5. Switch back to terminal where dd was started ##
结论
dd 命令非常棒,有多种方法可以使用 dd 显示进度指示器。您学习了如何使用 dd 命令的内置status=progress选项来监控 dd 的进度。另一个选项是使用 pv 工具。最后,您学习了如何在不使用 pv 或 status=progress 选项的情况下在 Linux 中显示 dd 进度。有关在本地工作站上使用 man 命令的更多信息,请参阅 GNU dd 手册页文档:
$ man dd
$ man pv