问题描述
我设置了 dd
来将一个较小的系统 40.00GB 硬盘驱动器 (/dev/sda) 克隆到一个新的更大的 111.00GB 硬盘驱动器,它通过 USB 读取器 (dev/sdb) 连接,现在已经运行了两个小时。新硬盘驱动器上的活动计显示它正在做某事。但是CPU只有20%左右。这件事什么时候能完成?我应该 re-start 进程吗?
最佳方案
以后应该使用 pv
来获取运行进度条。
sudo apt-get install pv
安装 pv
后,假设您要将 20GB 驱动器 /dev/foo
克隆到另一个驱动器(20GB 或更大!), /dev/baz
:
sudo dd if=/dev/foo bs=4M | pv -s 20G | sudo dd of=/dev/baz bs=4M
需要注意的重要部分:bs=4M
参数将 dd 操作的块大小设置为 4MB,这大大提高了整个过程的速度。而 -s 20G
参数告诉 pv
这个操作预计有多大,所以它可以给你一个 ETA 以及当前速度。
我非常喜欢 pv
,它应该是非法的。
请注意,虽然这样做从左到右的顺序是直观、美观和整洁的,但如果您谈论的是真正快速的数据流,则传入和传出 STDOUT 的管道可能会导致性能损失。如果您正在考虑移动数百 MB/秒,以下语法会更快:
pv -s 20G < /dev/foo > /dev/baz
-s 20G
是可选的,如果您确实知道流有多大(或大约有多大),它允许 pv
为您提供完成时间的估计。如果没有这个,pv
将尝试找出数据集有多大(例如,它知道文件有多大),但如果不能(例如,使用块设备,而不是文件),它只会告诉你无需猜测事情将需要多长时间的传输速率。
次佳方案
您可以通过向它发送 SIGUSR1 信号来查看它已经走了多远,以便查看它复制了多少数据和传输速率:
kill -SIGUSR1 $(pidof dd)
对于复制活动,您会受到设备 I/O 速度的限制,因此 CPU 不应满载,因此不必担心。
第三种方案
正如其他答案中所建议的那样,我过去曾使用过 pv 以及 (ps and kill),但最近我一直在使用 dc3dd
而不是它产生相同的结果,同时在整个过程中提供进度报告。
您可以检查它是否已经安装:which dc3dd
如果没有,您可以使用 sudo apt-get install dc3dd
安装它
命令开关类似于 dd(用于克隆,尽管擦除更简单一些)。
在你的情况下,我会使用命令 dc3dd if=/dev/sda of=/dev/sdb
编辑:
来自 coreutils package 8.24+ 版本的 dd
的最新版本包含在 Ubuntu 16.04 及更高版本中,包括一个状态参数。通过将 status=progress
开关添加到 dd
命令行,您可以使用 dd
完成相同的结果。
示例:dd if=/dev/zero of=/dev/null count=1000 status=progress