使用你的镜像取得进展

作者: Kyle Rankin

学习几种不同的方法来为你的 dd 命令获取进度条。

dd 工具一直是 Linux(和 UNIX)命令行上的关键组件,历史悠久。如果一个命令行工具只有两个字母,你就知道它很重要,而 dd 就是一个例子。我特别喜欢它的一点是,它真正体现了尼尔·斯蒂芬森的《In the Beginning was the Command Line》中所描述的强大工具,但没有安全特性的感觉。dd 命令做的事情很简单:它从一个文件获取输入并将其输出到另一个文件,并且由于在 UNIX 中“一切皆文件”,这意味着 dd 不关心输出文件是你磁盘上的另一个文件、分区,甚至是你的活动硬盘,它都会愉快地覆盖它!正因为如此,dd 属于系统管理员工具的永恒类别,我在输入它之后会停顿五到十秒,检查命令,然后再按下 Enter 键。

不幸的是,dd 最近失宠了,一些发行版甚至会建议使用像 cp 这样的工具或图形工具来镜像驱动器。这主要是出于担心 dd 不会等待磁盘同步才退出,所以即使它认为它已完成写入,但这并不意味着所有数据都在输出文件上,特别是如果它通过像 USB 闪存存储这样的慢速 I/O。人们倾向于使用其他镜像工具的另一个原因是,传统上 dd 不会输出任何进度。你输入命令,然后如果镜像很大,你就只是等待,等待,再等待,想知道 dd 是否会完成。

但是,事实证明,有很多不同的方法可以从 dd 获取进度输出,所以我在这里介绍几种流行的方法,所有方法都基于以下将 ISO 文件镜像到磁盘的 dd 命令


$ sudo dd if=/some/file.iso of=/dev/sdX bs=1M

选项 1:使用 pv

像许多命令行工具一样,dd 可以接受来自管道的输入并输出到管道。这意味着如果你有一个可以测量管道上数据流动的工具,你可以将它夹在两个不同的 dd 命令之间,并获得实时进度输出。pv(管道查看器)命令行工具正是这样一个工具,因此一种方法是使用你的发行版的软件包工具安装 pv,然后创建一个 pvdd 的三明治


$ sudo dd if=/some/file.iso bs=1M | pv | dd of=/dev/sdX

在这个命令中,我正在将我的 ISO 镜像到磁盘。请注意,第一个 dd 命令不仅列出了指定输入文件的 if 参数,我还为此端添加了 bs 参数。一般来说,你会希望将所有 dd 参数添加到第一个 dd 命令。

选项 2:使用 kill

dd 命令在其手册页中隐藏着一个经常被遗忘的功能。如果你向正在运行的 dd 命令发送 kill -USR1 信号,它将输出其当前进度。因此,运行此示例中的初始 dd 命令,然后在不同的终端中,识别其进程 ID,以便你可以向其发送 USR1 信号


$ sudo kill -USR1 <pidofddcommand>

如果你不想单独识别 PID 命令,并想将所有这些放在一行中,你可以使用一些 shell 快捷方式


$ sudo kill -USR1 $(pgrep ^dd)

选项 3:使用 dd 的嵌入式进度条

很多人都不知道,相对最近,dd 添加了自己的实时进度选项!在很长一段时间里,我一直在使用 USR1 技巧,直到有人告诉我 dd 在 GNU coreutils 8.24 中添加了新的 status=progress 选项。所以现在,你只需要输入


$ sudo dd if=/some/file.iso of=/dev/sdX bs=1M status=progress

然后,dd 将在其运行时定期输出其进度!

Kyle Rankin 是 Linux Journal 的技术编辑和专栏作家,也是 Purism 的首席安全官。他是 Linux Hardening in Hostile Networks, DevOps Troubleshooting, The Official Ubuntu Server Book, Knoppix Hacks, Knoppix Pocket Reference, Linux Multimedia HacksUbuntu Hacks 的作者,也是许多其他 O'Reilly 书籍的贡献者。Rankin 经常在安全和开源软件方面发表演讲,包括 BsidesLV、O'Reilly Security Conference、OSCON、SCALE、CactusCon、Linux World Expo 和 Penguicon。你可以在 @kylerankin 上关注他。

加载 Disqus 评论