你如何监控dd的进度?

Jam*_*mes 765 monitoring dd

dd真是个奇迹。它允许您将一个硬盘驱动器复制到另一个硬盘驱动器,将一个硬盘驱动器完全归零等。但是一旦您启动一个dd命令,就没有任何东西可以告诉您它的进度。它只是停留在光标处,直到命令最终完成。那么如何监控dd的进度呢?

pho*_*bos 865

2016 年更新:如果您使用 GNU coreutils >= 8.24(Ubuntu Xenial 16.04 以上的默认版本),请参阅下面的方法 2 以获取显示进度的替代方法。


方法一:通过使用 pv

安装pv并将其放在仅输入/输出dd命令之间。

注意:当你已经开始时你不能使用它dd

包描述

pv- 管道查看器 - 是一种基于终端的工具,用于通过管道监控数据的进度。它可以插入到两个进程之间的任何正常管道中,以直观地指示数据通过的速度、花费的时间、距离完成的程度以及完成之前的估计时间。

安装

sudo apt-get install pv
Run Code Online (Sandbox Code Playgroud)

例子

dd if=/dev/urandom | pv | dd of=/dev/null
Run Code Online (Sandbox Code Playgroud)

输出

1,74MB 0:00:09 [ 198kB/s] [      <=>                               ]
Run Code Online (Sandbox Code Playgroud)

--size如果需要时间估计,可以使用 指定近似大小。


示例 假设从 /dev/sdb 复制 2GB 磁盘

命令没有pv将是:

sudo dd if=/dev/sdb of=DriveCopy1.dd bs=4096
Run Code Online (Sandbox Code Playgroud)

命令pv

sudo dd if=/dev/sdb | pv -s 2G | dd of=DriveCopy1.dd bs=4096
Run Code Online (Sandbox Code Playgroud)

输出:

440MB 0:00:38 [11.6MB/s] [======>                             ] 21% ETA 0:02:19
Run Code Online (Sandbox Code Playgroud)

其他用途

您当然可以pv直接使用将输出通过管道传输到 stdout:

pv /home/user/bigfile.iso | md5sum
Run Code Online (Sandbox Code Playgroud)

输出

50,2MB 0:00:06 [8,66MB/s] [=======>         ] 49% ETA 0:00:06
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,会pv自动识别尺寸。


方法 2:status添加到dd(GNU Coreutils 8.24+)的新选项

dd在 GNU Coreutils 8.24+(Ubuntu 16.04 及更高版本)中,有一个新status选项来显示进度:

例子

dd if=/dev/urandom of=/dev/null status=progress
Run Code Online (Sandbox Code Playgroud)

输出

462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s
Run Code Online (Sandbox Code Playgroud)

  • pv bigfile.iso | dd of=/dev/yourdevice (87认同)
  • 速度仅供参考。在我的带有三星 840 PRO SSD 的计算机上进行测试:`dd if=/dev/urandom | 光伏 | of=/dev/sdb` 提供 ~18MB/s 写入,`dd if=/dev/zero | 光伏 | of=/dev/sdb` 提供 ~80MB/s,而普通的老式 `dd if=/dev/zero of=/dev/sdb` 提供 ~550MB/s(接近 SSD 最大写入速度)。全部带有`bs=4096000`。 (21认同)
  • 注意“dd”的参数在前半部分(管道的输入部分)是合适的:`dd if=/dev/zero bs=1M count=35000 | 光伏 | dd of=VirtualDisk.raw`。 (20认同)
  • 使用`pv &lt; /dev/sda &gt; /dev/sdb` 似乎获得了更好的速度([来源](http://askubuntu.com/questions/523037/how-would-i-speed-up-a-full-磁盘-dd)) (11认同)
  • `pv bigfile.iso | dd of=VirtualDisk.raw bs=1M count=35000` 有效,已验证。@SopalajodeArrierez,参数可以在第二个dd中给出。 (7认同)
  • @phoibos,当`kill -USR1` 工作时,为什么要打扰`pv`?(见詹姆斯的回答) (3认同)
  • `dd if=foo | 的缓慢 光伏 | dd of=bar` vs `pv &lt;foo &gt;bar` 可能是由于所有数据的复制:数据从设备 `foo` 读取到第一个 `dd` 的内存空间,然后从那里复制到 ` pv` 的内存空间使用 64K(至少在 Linux 上)管道缓冲区,然后使用另一个 64K 缓冲区再次复制到第二个 `dd` 的内存空间,最后写入设备 `bar` (3认同)
  • 我们可以做`pv bigfile.iso | dd of=VirtualDisk.raw bs=1M count=35000`? (2认同)
  • 我已经做了一些测试,“pv”方法比带有 5 秒“SIGUSR1”的直接“dd”慢大约 40%。 (2认同)
  • @phoibos:`status=progress` 是一个巨大而方便的节省时间。无需安装 pv 即可获得更多进展。我很高兴!:) 很遗憾我不能对你的回答点赞两次。 (2认同)

Jam*_*mes 532

来自HowTo:监控 dd 的进度

您可以dd通过使用kill命令向进程发送信号来监视它运行后的进度,而无需停止它。

启动后dd,打开另一个终端,然后输入任一

sudo kill -USR1 $(pgrep ^dd$)
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用的是 BSD 或 OS X:

sudo kill -INFO $(pgrep ^dd$)
Run Code Online (Sandbox Code Playgroud)

这将在dd终端窗口中显示进度,而不会停止进程(通过打印到其 stderr 流)。例如:

# dd if=/dev/urandom of=rando bs=1024 count=1048576
335822+0 records in
335821+0 records out
343880704 bytes (344 MB, 328 MiB) copied, 6.85661 s, 50.2 MB/s
Run Code Online (Sandbox Code Playgroud)

如果您想获得dd进度的定期更新,请输入:

watch -n5 'sudo kill -USR1 $(pgrep ^dd$)'
Run Code Online (Sandbox Code Playgroud)

watchdd每 -n 秒(-n5= 5 秒)探测该进程并报告而不停止它。

注意上面命令中正确的单引号。

  • @Speakus 您必须在 BSD 系统(如 OSX)上使用 `kill -INFO $(pgrep ^dd$)`。 (32认同)
  • 我喜欢这个是因为我担心 `pv` 会减慢传输速度,正如 TeddHansen 所展示的那样。另外,我敢打赌很多人都在谷歌上搜索这个,因为他们_已经_开始了`dd`操作;) (29认同)
  • 注意!这种方式中断 dd 在 OSX 下工作。 (25认同)
  • `sudo pkill -usr1 dd` 更容易记住,工作得很好(至少在 Ubuntu 14.04 上),而且打字更少。 (24认同)
  • 这有效,但有一些评论。首先,我不确定您为什么要转义反引号(如果是针对 SO 编辑器,那么您做错了)。其次,我建议使用 ^dd$,以防万一其他东西以前缀 dd 运行。最后,您不需要 sudo 来发送 USR1 信号。否则,很好的答案,+1。 (23认同)
  • @gsingh2011 有关为什么使用 sudo 以及每个命令按原样放置的说明,请阅读它来自的文章(链接在答案顶部) (3认同)
  • 只是`killall -USR1 dd`怎么样? (3认同)
  • 无需在 OSX 上发送 INFO:只需按 Ctrl-T。 (3认同)

小智 115

一些方便的示例用法,pv与其他答案相比,打字次数更少或进步更多:

首先,您需要pv使用以下命令安装:

sudo apt-get install pv
Run Code Online (Sandbox Code Playgroud)

那么一些例子是:

pv -n /dev/urandom | dd of=/dev/null
pv -tpreb source.iso | dd of=/dev/BLABLA bs=4096 conv=notrunc,noerror
Run Code Online (Sandbox Code Playgroud)

注意:第一个示例比输入少 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
Run Code Online (Sandbox Code Playgroud)

截屏

来源:http : //www.cyberciti.biz/faq/linux-unix-dd-command-show-progress-while-coping/

也用于存档我自己。

  • *喜欢*`对话框`示例。_宁静现在_! (8认同)
  • 您还需要使用命令“apt-get install dialog”安装“dialog” (3认同)
  • 适用于 Mac 的“brew install pv dialog”。这位先生计算也很有风格。太棒了。 (2认同)

dav*_*son 73

为了完整起见:

版本8.24的的GNU的coreutils包括用于DD引入参数来打印进度的贴剂。

引入此更改的提交有以下评论:

dd:新的状态=进度级别以定期打印统计信息

许多发行版,包括Ubuntu 16.04.2 LTS 都使用这个版本。

  • 凉爽的!我喜欢这个功能。而教 dd 打印进度输出只花了大约 30 年的时间。:-) (2认同)
  • 终于解脱了!我将立即将此参数添加到 dd shell 别名中。 (2认同)

小智 71

使用Ctrl+ Shift+ T,同时dd在运行,它会输出的进度(以字节为单位):

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)
Run Code Online (Sandbox Code Playgroud)

  • 很棒的方式。它适用于 OSX,但不适用于 ubuntu 14.04 (15认同)
  • 在 Kubuntu Trusty 上对我不起作用。可能冲突的键绑定? (6认同)
  • 这在 Ubuntu 上不起作用。Ctrl-T/Ctrl-Shift-T 只将 `^T` 输出到终端(除了许多终端应用程序会拦截 Ctrl-Shift-T 并打开一个新选项卡)。OSX/BSD 上的许多搜索者可能会欣赏这个答案,但应该明确指出它不适用于 Ubuntu(或一般的 GNU/LInux?) (4认同)
  • 你应该能够在像 OS X 这样的 BSD 上使用 kill -INFO (3认同)

The*_*ano 37

最好是使用http://dcfldd.sourceforge.net/很容易通过 apt-get 安装

  • 可能是因为它的名字。 (33认同)
  • 为什么 dcfldd 不为人所知,这对我来说完全是个谜。 (5认同)
  • 感谢指向 dcfldd 的指针,它与 dd 非常兼容,但有一些不错的新功能。我特别喜欢标准的进步。 (3认同)

use*_*963 30

本机进度状态已添加到 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)
Run Code Online (Sandbox Code Playgroud)

dd以 root 身份运行:

sudo su
cd src
./dd if=/dev/sdc of=/dev/sda conv=noerror status=progress
Run Code Online (Sandbox Code Playgroud)

您将看到:字节、秒和速度(字节/秒)。

要检查 的版本dd

本国的:

dd --version
Run Code Online (Sandbox Code Playgroud)

新的:

cd coreutils-8.24/src
./dd --version
Run Code Online (Sandbox Code Playgroud)


fab*_*or4 19

如果你已经启动了 dd,并且你正在写一个文件,比如在创建一个 pendrive 的副本到磁盘时,你可以使用 watch 命令不断观察输出文件的大小,以查看变化并估计完成情况。

watch ls -l /pathtofile/filename
Run Code Online (Sandbox Code Playgroud)

仅查看文件大小(人类视角):

watch ls -sh /pathtofile/filename
Run Code Online (Sandbox Code Playgroud)

  • 很有用,但如果您将 dd 输出通过管道传输到文件以外的其他内容(例如,在将其写入磁盘之前进行 gzip 处理),则这不一定有效。 (3认同)

Mik*_*e S 13

dd | pv | dd黑社会让我的50GB的VM复制需要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
Run Code Online (Sandbox Code Playgroud)

你完成了。

编辑:愚蠢的系统管理员!自动化你的生活,不要工作!如果我有一个很长的 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
Run Code Online (Sandbox Code Playgroud)

当然,您可以编写脚本,也许将 $1 设为输入文件,将 $2 设为输出文件。这留给读者作为练习。请注意,在杀死之前您需要一点睡眠,否则杀死可能会在它尚未准备好时尝试向 dd 发送信号而死亡。根据需要调整您的睡眠(甚至可能完全取消第二次睡眠)。

Bash-FTW!:-)


hna*_*rat 12

http://linuxcommando.blogspot.com/2008/06/show-progress-during-dd-copy.html

基本上:

kill -USR1 < dd pid >
Run Code Online (Sandbox Code Playgroud)

  • “pkill -USR1 dd”是我所知道的最简单的版本(无论如何,只要您只运行一个 dd 实例)。在我的系统上,我需要 sudo:“sudo pkill -USR1 dd”。输入 dd 命令后即可使用,并且无需安装任何新内容。 (2认同)

Sev*_*Tux 10

在 Ubuntu 16.04 上

Ubuntu 16.04 附带 dd (coreutils) 版本8.25。因此,选项status=progress 支持:-)

要使用它,只需添加status=progress您的dd命令。

例子 :

dd bs=4M if=/media/severus/tools-soft/OperatingSystems/ubuntu-16.04-desktop-amd64.iso of=/dev/null status=progress && sync
Run Code Online (Sandbox Code Playgroud)

给出状态为

1282846183 bytes (1.2 GiB, 1.1 GiB) copied, 14.03 s, 101.9 MB/s
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


小智 8

最简单的是:

 dd if=... of=... bs=4M status=progress oflag=dsync
Run Code Online (Sandbox Code Playgroud)

oflag=dsync将使您的写作保持同步,因此信息status=progress更准确。不过可能会慢一些。


MUY*_*ium 7

使用选项status=progress获取传输过程中的进度。

此外,conv=fsync还会显示 I/O 错误。

例子:

sudo dd if=mydistrib.iso of=/dev/sdb status=progress conv=fsync
Run Code Online (Sandbox Code Playgroud)


Kos*_*tyn 6

这迫使 dd 每 2 秒提供一次统计数据,这是 watch 的默认值:

watch killall -USR1 dd
Run Code Online (Sandbox Code Playgroud)

要将每 2 秒更改为每 5 秒,请添加 -n 5 选项,如下所示:

watch -n 5 killall -USR1 dd
Run Code Online (Sandbox Code Playgroud)


Sup*_*Mau 5

我真的很喜欢 ddrescue,它的工作原理与 dd 一样,但会提供输出并且不会因错误而失败,相反,它有一个非常先进的算法,并且非常努力地尝试成功复制...还有很多 GUI

项目: https: //www.gnu.org/software/ddrescue

维基百科: https: //en.wikipedia.org/wiki/Ddrescue

在此输入图像描述