dd 复制分区的速度比 gparted 慢很多。这是怎么回事?

dd 复制分区的速度比 gparted 慢很多。这是怎么回事?

我尝试将分区从 500GB 内部 M.2 SSD 复制到 M.2 2TB 驱动器周围的外部 USB3.x 外壳中。

我的第一次尝试使用了 A 到 C 电缆,命令如下:

dd if=/dev/nvme01p3 of=/dev/sda1 bs=1M

240GB 分区大约需要 6.5 小时。报告速度为 10MB/s。这似乎真的很慢。原来我连接的端口可能是 USB2,所以我使用了短 USB C 转 C 电缆,速度为 40MB/s,类似的分区大约需要 1.5 小时。

dd 应该是相当低级的,特别是如果所讨论的文件是分区的话。这不就是磁盘上的原始块吗?所以在另一个问题中,一些答案建议我在 gparted 中使用复制分区。无论如何都有错误,所以我尝试了它,当它达到我认为应该达到的速度时,我感到震惊,即超过 1GB/秒。4 分钟后,分区被重做了。

问题是,dd 怎么可能比 gparted 慢 40 倍?如果这个问题必须转移到 stackoverflow,我会这么做,但它处于软件和 Linux 之间的灰色地带。

答案1

dd应该是相当低级的,特别是如果所涉及的文件是分区。那不就是磁盘上的原始块吗?

没错,但原始块与使用过的块相同(被数据占用) 和未使用(空的/全零的/稀疏的/没有数据的文件系统,即文件)...因此,就而言dd,这些都是在磁盘原始磁盘块级别上一点一点地复制的,忽略它们的内容...即所有磁盘块的速度相同。

Gparted另一方面是一个文件系统感知实用程序...要知道这可能会如何影响分区(文件系统) 复制速度,尝试复制一个只有文件系统的空分区,即刚刚格式化并且没有存储在其上的文件...dd将复制每个单独的块,即好像文件系统已满,这可能需要很长时间,具体取决于源的大小以及两个磁盘的速度和它们之间的链接,而gparted另一方面只会在目标可用空间上重新创建空文件系统,这应该非常快,因为它只是用相同的大小和相同类型的文件系统格式化目标空间。

看起来,您的源分区/文件系统没有占用足够的文件/数据来强制gparted复制每个块的内容。

当源分区未满且具有大量可用空间时,文件系统感知实用程序将会更快,否则dd可能会更快或至少速度相同。

请参阅与此点最相关的扩展讨论使用 dd 将 500 Gig 从一台便携式设备复制到另一台便携式设备

答案2

'dd 的速度取决于块大小。

块大小/缓冲区大小/预读设置都会对顺序读取/写入产生影响。如果使用较小的块大小,驱动器每次访问时只会读取少量数据,然后再将其传递给下一个进程。

找到最佳点,dd就会像 gparted 一样快。

Gparted 将会有一个方法来确定这个最佳点。很有可能sudo blockdev --getsz /dev/{device}

相关内容