使用你的镜像取得进展
学习几种不同的方法来为你的 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
,然后创建一个 pv
和 dd
的三明治
$ sudo dd if=/some/file.iso bs=1M | pv | dd of=/dev/sdX
在这个命令中,我正在将我的 ISO 镜像到磁盘。请注意,第一个 dd
命令不仅列出了指定输入文件的 if
参数,我还为此端添加了 bs
参数。一般来说,你会希望将所有 dd
参数添加到第一个 dd
命令。
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
将在其运行时定期输出其进度!