我想先将具有大量数据(50 – 70 GB)的外部 USB 硬盘(ext2 分区)的映像创建到内部 IDE/SATA 磁盘,然后以最快的方式同时将该映像文件恢复到多个 USB 硬盘。
是否有任何可用的应用程序或脚本或任何建议?
Windows 也很好,我可以使用 IFS 安装这些驱动器。
答案1
您可以使用tee
输出到多个文件,并bash
使用过程替换将内容重定向到dd
可直接写入块设备的文件。
要复制以/dev/sda
在文件中制作其图像:
dd if=/dev/sda of=./drive.image
并将该图像复制到多个驱动器:
cat drive.image | tee >(dd of=/dev/sda) >(dd of=/dev/sdb) >(dd of=/dev/sdc) | dd of=/dev/sdd
请注意,最后一项是管道而不是重定向,因为 tee 也会将其输入发送到标准输出。如果您想在命令行上保持所有重定向相同,您可以将其发送到 /dev/null,但这显然效率较低,因为您运行了一个额外的进程并通过管道将所有信息的额外副本发送给它,然后将其丢弃:
cat drive.image | tee >(dd of=/dev/sda) >(dd of=/dev/sdb) >(dd of=/dev/sdc) >(dd of=/dev/sdd) | dd of=/dev/null
尽管与许多 USB 驱动器上的整体操作相比,其性能影响可能很小。
您还可以将一个驱动器直接复制到许多其他驱动器,跳过映像文件,但如果您以后想要制作更多副本(或者由于端口数量有限,现在想要制作比一次可以完成的更多副本),则使用映像文件会更有效率:
cat /dev/sda | tee >(dd of=/dev/sdb) >(dd of=/dev/sdc) >(dd of=/dev/sdd) | dd of=/dev/sde
您可能还想替换cat
为pv
(如果您尚未安装它,您会在大多数标准存储库中找到它,否则您可以从中获取它这里并自行编译)以在复制操作进行时显示进度条,如下所示:
pv drive.image | tee >(dd of=/dev/sda) >(dd of=/dev/sdb) >(dd of=/dev/sdc) >(dd of=/dev/sdd) | dd of=/dev/null
需要注意的一点是: 根据您的 USB 驱动器的连接方式以及它们单独写入数据的速度,您可能会发现这仅比单独复制到每个驱动器快一点。USB 总线或集线器上的带宽由与其相连的设备共享,因此,除非您有多个 USB 控制器,否则这将成为多驱动器运行时的主要瓶颈(当然,除非每个驱动器的写入速度都很慢,就像许多基于闪存的 USB 棒一样)。一些主板实际上有多个 USB 控制器,因此即使没有额外的控制器,也可能不是所有端口都共享同一条总线,但如果您通过集线器运行它们,它们将确实所有这些都共享相同的 I/O 带宽。
话虽如此,即使由于总线争用导致进程在挂钟时间方面没有加快多少或根本没有加快,您仍然可以享受在单个命令中执行该操作的优势(如果使用 ,则使用单个进度条pv
)。