Answers:
您可以结合使用bash的“进程替换”和tee命令来执行此操作:
cat drive.image | tee >(dd of=/dev/sda) >(dd of=/dev/sdb) >(dd of=/dev/sdc) | dd of=/dev/sdd
或者为了清楚起见(以牺牲一点效率为代价),您可以使最后dd
一个与其他人相同,然后将tee的stdout发送到/ dev / null:
cat drive.image | tee >(dd of=/dev/sda) >(dd of=/dev/sdb) >(dd of=/dev/sdc) >(dd of=/dev/sdd) | /dev/null
如果已安装,则可以使用管道查看器代替cat
获取有用的进度指示器:
pv drive.image | tee >(dd of=/dev/sda) >(dd of=/dev/sdb) >(dd of=/dev/sdc) | dd of=/dev/sdd
这只会读取一次源映像,因此源驱动器确实会发生磁头抖动,这很可能就是为什么当您尝试通过其他方法多次复制映像时看到指数下降的原因。使用tee
上述方法,进程应以最慢的目标驱动器的速度运行。
如果您的目标驱动器是通过USB连接的,请注意它们可能都共享总线带宽,因此并行写入许多驱动器可能不会比顺序写入它们快,因为USB总线成为瓶颈,而不是源驱动器或目标驱动器。
以上假设您使用的是Linux或类似操作系统(尽管设备名称可能有所不同,但它也应在OSX上运行),如果您使用Windows或其他操作系统,则需要使用其他解决方案。
通过网络进行映像与通过USB对许多驱动器进行映像存在类似的问题-传输通道而不是驱动器成为瓶颈-除非您使用的软件支持某种形式的广播或多播传输。
对于dd
方法,你大概可以菊花链netcat
+ tee
+ dd
,像这样每台机器上的进程:
cat
/ pv
/ dd
至S的数据nc
到目的地机器1。nc
侦听了源计算机中的数据,并对其进行管道传输,然后将数据通过管道tee
依次发送到dd
(然后发送到磁盘),并将另一个nc
进程发送到目标计算机2。nc
侦听了来自目标机器1的数据,并对其进行了管道传输,然后将数据通过管道tee
依次发送到dd
(然后发送到磁盘),并将另一个nc
进程发送给目标机器3。nc
从前一台计算机中提取数据并将其通过传送到磁盘的计算机dd
。这样,假设您的交换机和网卡都已协商了全双工链路,则可能会使用全部网络带宽。而不是由源计算机发送10个数据副本(假设有10个目标计算机),因此每个设备都限于发送带宽的1/10,而仅发送1。每个目标计算机都将数据的一个副本发送出去。再次。您可能需要调整的缓冲区大小设置pv
,nc
并dd
接近最佳的实际性能。
如果您找到了一些仅支持多播的软件,那将容易得多(并且可能快一点)!但是以上是我可能很愚蠢的尝试尝试的那种棘手的解决方案...
另一个想法。如果驱动器映像压缩良好(如果其中很大一部分充满零,它将很好压缩),即使一次发送到许多目的地,源计算机的传出带宽也不会成为问题。只需先压缩图像,然后使用tee
+ 将其传输到任何地方nc
,然后在目标位置(网络nc
->->解压缩器dd
->->磁盘)解压缩。
在Google上建议的第一个答案(在Linux系统上)dd if=/dev/sdb of=- | tee >(dd of=/dev/sdc) >(dd of=/dev/sdd) >(dd of=/dev/sde)
:,其中/ dev / sdb是要克隆的硬盘驱动器,/ dev / sdc,/ dev / sdb和/ dev / sde是要克隆到的驱动器(您可以根据需要添加更多此类内容,只需复制粘贴即可)。LiveCD应该做到这一点,并记住要小心您的驱动器号!
of=-
吗?-
Just会为我创建一个输出文件,而不是输出到stdout。这可以通过仅保留of
选项来解决。
我所知道的是,有一些东西叫做硬盘复制器。这些是特殊的设备,可以同时将HD复制(复制)到多个驱动器。也许这篇文章对您有所帮助。
由于尚无人提及,因此我将提及Clonezilla及其服务器版。(不幸的是,它似乎没有直接链接,但是您可以在网站的左侧导航菜单中找到“服务器版” ...)
我对Clonezilla Live Edition感到很幸运,但是还没有尝试使用Server Edition。虽然看起来很漂亮。
如果您使用的是Mac OS X,则它是内置的。您将在计算机上从开始多播asr会话开始提供图像。从客户端启动到启动磁盘,打开终端,然后连接到asr多播流。自由。
我在网上找到了2个与此相关的有用链接。一个使用dd而不带cat的磁盘进行复制:
dd if=/dev/sdb | tee >(dd of=/dev/sdc) | tee >(dd of=/dev/sdj) | dd of=/dev/sdh
http://joshhead.wordpress.com/2011/08/04/multiple-output-files-with-dd-utility
另一个链接进一步扩展了该链接,以显示进度表:
dd if=/dev/sdb | pv -s $(blockdev --getsize64 /dev/sdb) | tee >(dd of=/dev/sdc) | tee >(dd of=/dev/sdj) | dd of=/dev/sdh
http://www.commandlinefu.com/commands/view/6177/dd-with-progress-bar-and-statistics
我想扩展一下大卫的答案
pv drive.image | tee >(dd of=/dev/sda) >(dd of=/dev/sdb) >(dd of=/dev/sdc) | dd of=/dev/sdd
该drive.image
实际上是另一种设备,像/dev/sde
其次,通过dd
适当的bs
设置,命令将使幅度更快地工作。我曾经bs=64k
看到复制40 Gig分区的速度提高了6倍,从1小时到10分钟。
因此,最终命令将如下所示:
pv drive.image | tee >(dd bs=64k of=/dev/sda) >(dd bs=64k of=/dev/sdb) >(dd bs=64k of=/dev/sdc) | dd bs=64k of=/dev/sdd
如果您的源是驱动器而不是文件,它将看起来像这样:
pv /dev/sde | tee >(dd bs=64k of=/dev/sda) >(dd bs=64k of=/dev/sdb) >(dd bs=64k of=/dev/sdc) | dd bs=64k of=/dev/sdd