Linux: dd命令速度慢 加快dd命令备份的速度 bs 参数的选择 / 显示查看dd命令进度
您应该明确声明缓冲区大小
因此请尝试
dd if=/dev/sda of=/dev/sdb bs=16M
IIRC,默认缓冲区大小仅为512字节。上面的命令将其设置为16兆字节。您可以尝试使用较小的值(例如bs=1M
),但应使用比默认值更多的值(尤其是在扇区为4KB的最新磁盘硬件上)。
dd缓冲区大小的增加将为您提供更多的读写操作性能。现在所有磁盘都具有硬件读/写缓冲区。但是,如果您增加dd的缓冲区大小超过硬件缓冲区,则其性能将下降,因为当第二个磁盘都已从其自己的硬件缓冲区写入所有数据时,dd将从第一个磁盘读取到另一个磁盘。
"dd"命令是 Linux 系统中用于进行块级别的复制、转换和备份的工具。它可以将数据从一个设备复制到另一个设备,也可以对数据进行转换和处理。在使用 dd 命令进行复制时,很重要的一点是要注意 bs 参数的选择。
什么是 bs 参数?
bs 是 dd 命令的一个参数,用于指定块大小(block size)。块是计算机系统中数据处理的基本单位,通常是 512 字节或更大的固定大小。在 dd 命令中,bs 参数指定了每个输入或输出块的大小。默认情况下,dd 命令使用的块大小为 512 字节。
为什么要注意 bs 参数的选择?
在进行 dd 命令的复制操作时,选择合适的 bs 参数可以提高复制速度和效率。不同的 bs 值对复制速度和效率的影响不同,如果选择不当,可能会导致复制速度变慢或者占用过多的系统资源。因此,在使用 dd 命令进行复制时,需要根据实际情况选择合适的 bs 参数。
如何选择合适的 bs 参数?
选择合适的 bs 参数需要考虑多个因素,包括源设备、目标设备、数据块大小、文件系统等。下面是一些参考建议:
- 对于较小的文件,可以选择较小的块大小,如 512 字节或 1KB,这样可以提高复制速度。
- 对于较大的文件,可以选择较大的块大小,如 4KB 或 8KB,这样可以减少 I/O 操作的次数,提高复制效率。
- 对于使用 USB 设备进行复制的情况,可以选择较小的块大小,因为 USB 设备通常具有较慢的传输速度。
- 对于使用网络设备进行复制的情况,可以选择较大的块大小,以利用网络带宽。
需要注意的是,在选择 bs 参数时,需要同时考虑源设备和目标设备的块大小。如果源设备和目标设备的块大小不同,可以选择一个介于两者之间的块大小,以达到最佳效果。
总结
在使用 dd 命令进行复制时,选择合适的 bs 参数可以提高复制速度和效率。需要根据实际情况选择合适的块大小,同时需要考虑源设备和目标设备的块大小。选择合适的 bs 参数可以让dd 命令更好地利用系统资源,从而提高复制效率,减少复制时间。同时,选择不当的 bs 参数可能会导致复制速度变慢,甚至出现复制失败的情况。因此,选择合适的 bs 参数对于 dd 命令的正确使用非常重要。
最后,附上一个例子,演示如何使用 dd 命令进行硬盘备份,并选择合适的 bs 参数。我们假设要备份 /dev/sda 这个硬盘到 /dev/sdb,并选择块大小为 4KB。
1、首先使用 fdisk 命令查看硬盘分区情况:
$ sudo fdisk -l /dev/sda
2、然后使用 dd 命令进行备份:
$ sudo dd if=/dev/sda of=/dev/sdb bs=4K
3、dd 命令执行完成后,使用 sync 命令将缓存中的数据写入硬盘:
$ sudo sync
注意,在执行 dd 命令进行硬盘备份时,需要谨慎操作,避免误操作导致数据丢失。建议在备份前先对硬盘进行备份,以避免不可预料的情况发生。
综上所述,选择合适的 bs 参数是 dd 命令正确使用的重要一环,需要根据实际情况进行选择,以提高复制效率和减少复制时间。
查看dd命令进度
dd唯一的不足是没有显示操作进度,不过也不是没有办法,下面介绍几个查看写入进度的方法。
status选项查看进度
如果你使用的是GNU版本的dd,并且coreutils版本高于8.24,那么可以使用status选项。例如:
sudo dd if=/dev/sda of=/dev/zero status=progress
上面命令在Mac OS X上执行会出错,因为OS X使用的是BSD版本的命令行,不是GUN。你可以在Mac OS X上安装gun coreutils,或使用下面介绍的pv命令。
pv命令
sudo pv -tpreb /dev/sda | dd of=/dev/zero
sudo pv -tpreb /dev/sda | dd of=/dev/zero bs=4096 conv=notrunc,noerror
使用pv配合dialog还可以显示进度条对话框:
(sudo pv -n /dev/sda | dd of=/dev/zero) 2>&1 | dialog --gauge "dd process bar" 10 70 0

使用pkill打印进度
重新打开一个Shell,然后执行如下命令即可每5秒输出一次进度信息
watch -n 5 pkill -USR1 -x dd