我如何加速一个完整的磁盘 dd?

Kaz*_*lfe 73 partitioning hard-drive dd

我正在dd使用此命令在两个相同的驱动器上执行以下操作:

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

两个硬盘的型号完全相同,并且都有 1TB 的存储空间。/dev/sda 使用 4096 的块大小。/dev/sda是一个本地驱动器,/dev/sdb是一个远程 caddy。我也许可以使用以下协议:

  • USB2.0 HighSpeed(目前计划中)
  • 千兆网络克隆(真的不想尝试这个)
  • USB3.0(如果我找到其他驱动器)
  • eSATA(如果我找到/购买电缆)
  • SATA(如果我找到/购买电缆,一定会喜欢笔记本电脑的 CD 驱动器)

有没有办法运行这个驱动器副本,只需少于 96 小时?我愿意使用除dd.

我需要克隆以下分区(包括 UUID)

  • Fat32 EFI 分区 (*)
  • NTFS Windows 分区 (*)
  • HFS+ OSX 分区
  • EXT4 Ubuntu 分区 (*)
  • 交换分区 (*)

* 由 Clonezilla 支持


我尝试过 Clonezilla(而且速度要快得多),但它不支持 HFS+ 智能复制,而我需要它。也许最新版本支持这个?

当我制作第一个克隆时,我完成了除 HFS+ 之外的所有分区,并且进行得非常快。(总共不超过3小时)

Lui*_*ado 88

根据我的经验,我认为命令行中没有比dd. 调整bs参数可以提高速度,例如,我有 2 个硬盘,我知道它的读/写速度大于 100 MB/s,所以我这样做:

dd if=/dev/sda of=/dev/sdb bs=100M
Run Code Online (Sandbox Code Playgroud)

还有pv(需要先安装)检查两个驱动器上的最快速度,然后继续克隆。这当然必须从 root 完成:

pv < /dev/sda > /dev/sdb
Run Code Online (Sandbox Code Playgroud)

使用 PV 我得到了 156 MB/s

约的好处pv除了速度是它显示进度,当前速度,时间,因为它开始和ETA。关于 HFS+ 我不知道,我只是想在“速度”部分提供帮助。使用pv或 非常优化的bs参数,您可以在不到 7 小时的时间内完成 4 TB 驱动器(6 小时 50 分钟,当前速度为 150 MB/s)。

在此处输入图片说明

我对您使用的连接类型和我可用的其他连接类型进行了几次测试。我使用的是华硕 Z87 Pro 和英特尔 DZ68DP。这是我的结果,但首先我们需要知道许多传输速率(原始速度)的理论速度只是理论。进行实际测试后发现它们的速度在原始速度的 40% 到 80% 之间。此测试可能会根据使用的设备、连接类型、主板、连接电缆类型、文件系统类型等而变化。考虑到这一点,这就是我得到的(我只测试了设备的写入速度,读取速度通常更高):

Connected Device  -  Connection Type  -  Speed (Write Speed)
  USB 2.0                 USB 2.0              25 MB/s
  USB 3.0                 USB 2.0              35 MB/s
  USB 3.0                 USB 3.0              73 MB/s
  eSata                   eSata                80 MB/s
  Sata 2G HDD             Sata 2G              120 MB/s
  Sata 3G HDD             Sata 2G              140 MB/s
  Sata 3G HDD             Sata 3G              190 MB/s
  Sata 2G SDD             Sata 2G              170 MB/s
  Sata 3G SDD             Sata 2G              210 MB/s
  Sata 3G SDD             Sata 3G              550 MB/s 
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用 dd 来完成这项工作,但在链中插入 pv 来监控传输速率,如下所示:`dd if=/dev/sda1 | 光伏 | dd of=/dev/sdb1` (12认同)
  • 我总是在 `dd` 之间使用 `pv`。从来不知道它可以独立使用! (6认同)
  • `pv` 本身非常有效。 (4认同)
  • 发送 USR1 信号,以获取 dd 的进度。dd 的缺点是它复制可用空间。 (3认同)
  • 这是我第一次听说`pv`。太棒了,谢谢你的回答。 (2认同)
  • 为了监控 dd 的进度,在最近的版本中,可以使用 status=progress 。 (2认同)

Gil*_*il' 14

要批量复制分区,请使用cat代替dd。不久前我运行了基准测试,在两个磁盘之间复制一个大文件而不是一个分区(在同一个磁盘上,相对时间不同):

dd bs=64M    51.3
dd bs=1M     41.8
dd bs=4k     48.5
dd bs=512    48.9
cat          41.7
cp           45.3
Run Code Online (Sandbox Code Playgroud)

这个基准测试的结论是,块大小的选择很dd重要(但不是那么多),并且会cat自动找到进行快速复制的最佳方式:dd只会减慢你的速度。使用小块大小,dd浪费时间丢失微小的读取和写入。对于大块大小,一个磁盘保持空闲,而另一个磁盘正在读取或写入。当一个磁盘读取而另一个磁盘写入时,达到最佳速率。

要复制分区,使用cp -a. 这取决于有多少文件以及有多少文件系统是可用空间。复制文件的开销大致与文件数量成正比,但另一方面,复制可用空间会浪费时间。

USB2 的最大数据速率略低于 50 MB/s,传输 1TB 数据需要 6-7 小时。这假设硬盘的速度足以使 USB 总线饱和;我认为更快的 7200 rpm 驱动器可以做到,但 5900 rpm 可能没有那么快(也许它们用于线性写入?)。

如果任一磁盘并行使用,这会大大减慢复制速度,因为磁盘磁头需要四处移动。

  • @Oxwivi 是的,`cat ubuntu.iso &gt;/dev/usb` 完全等效。`dd` 没有什么魔力,它只是一个将输入复制到输出的工具。 (2认同)

小智 12

问题在于您的连接类型和块大小。为了获得最快的结果,您的块大小应该是您通常收到的最低写入速度的一半。这会给你一个安全的余量,但仍然允许大量;当然你也需要有足够的内存来保存数据。

USB 2.0 是每秒 12 兆位 (Mbps),USB 2.0 高速是 480 Mbps。这当然是原始速度;在一个字节中有 8 位和成帧开销的情况下,以 MB/s 为单位的可用速度通常是一个小数位。因此,例如 480 个原始数据,变为 48MB 可用。请记住,这是数学上最好的,在现实世界中它会低一点。对于 USB 2.0 高速连接,您应该期望大约 30-35 MB 的最大写入速度,前提是实际存储设备可以等于或超过连接速度。

  • 单元挑剔:USB2.0 高速为 480 Mbit/s = 60 MByte/s,原始速度。可用速度不是小数点后,而是原始速度的 80%。不过,经验法则“以 MByte/s 为单位的实际速度是以 Mbit/s 为单位的原始速度的 1/10”是有效的。 (7认同)

dan*_*der 7

我同意调整良好dd('pv') 或 'cat' 命令的原始速度很难被击败,但是如果副本有任何问题(坏扇区、电源故障、用户错误等),那么您必须开始超过。

我想推荐ddrescue - 一个具有 dd 所有速度的 FOSS 工具,但它可以解决磁盘错误,并在出现故障时在稍后恢复。