我尝试将分区从 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 to C电缆,得到了40MB/s,类似的分区大约需要1.5小时。
dd 应该是相当低的级别,特别是当有问题的文件是分区时。这不就是磁盘上的原始块吗?因此,在另一个问题中,一些答案建议我在 gparted 中使用复制分区。无论如何,还是有错误,所以我尝试了一下,当它达到我认为应该的速度(超过 1GB/秒)时,我感到很震惊。4分钟后,分区重做。
问题是,dd 怎么可能比 gparted 慢 40 倍呢?如果这个问题必须转移到 stackoverflow,我会这么做,但它处于软件和 Linux 之间的灰色地带。
'dd 的速度取决于块的大小。
块大小/缓冲区大小/预读设置都会对顺序读/写产生影响。如果您使用较小的块大小,则驱动器每次访问只会读取少量数据,然后再将其传递到下一个进程。
找到最佳位置,
dd
就会像 gparted 一样快。Gparted 将有一种方法来确定最佳位置。大概吧
sudo blockdev --getsz /dev/{device}
。确实如此,但原始块对于已使用(被数据占用)和未使用(空/全零/稀疏/没有数据即文件的文件系统)来说是相同的...因此,就所
dd
关心的而言,这些被复制到原始磁盘上磁盘块级别一点一点地忽略它们的内容......即所有磁盘块的速度相同。Gparted
另一方面是一个文件系统感知实用程序...要了解这可能如何影响分区(文件系统)复制速度,请尝试复制仅包含文件系统的空分区,即刚刚格式化且上面没有存储文件...dd
将复制每个单独的分区块,即就好像文件系统充满了文件,这可能需要很长时间,具体取决于源的大小、两个磁盘的速度以及它们之间的链接,而另一方面,只会在目标上重新创建空文件gparted
系统空间,并且速度应该非常快,因为它只是用相同的大小和相同类型的文件系统格式化目标空间。看起来,您的源分区/文件系统没有占用足够的文件/数据来强制
gparted
复制每个块的内容。当源分区未满并且有大量可用空间时,文件系统感知实用程序会更快,而在其他情况
dd
下可能会更快或至少具有相同的速度。请参阅使用 dd 将 500 Gig 从一台便携式设备复制到另一台便携式设备时主要相关的扩展讨论