Vous pouvez utiliser la "substitution de processus" de bash avec la commande tee pour ce faire:
cat drive.image | tee >(dd of=/dev/sda) >(dd of=/dev/sdb) >(dd of=/dev/sdc) | dd of=/dev/sdd
ou pour plus de clarté (au détriment d'un peu d'efficacité), vous pouvez faire ddappeler le dernier de la même manière que les autres et envoyer la sortie standard de tee à / dev / null:
cat drive.image | tee >(dd of=/dev/sda) >(dd of=/dev/sdb) >(dd of=/dev/sdc) >(dd of=/dev/sdd) | /dev/null
et si vous l'avez installé, vous pouvez utiliser la visionneuse de tuyaux au lieu de catpour obtenir un indicateur de progression utile:
pv drive.image | tee >(dd of=/dev/sda) >(dd of=/dev/sdb) >(dd of=/dev/sdc) | dd of=/dev/sdd
Cela ne lit l'image source qu'une seule fois, de sorte que le lecteur source subit un choc de tête, ce qui sera probablement la raison pour laquelle vous voyez un ralentissement exponentiel lorsque vous essayez de copier l'image plusieurs fois par d'autres méthodes. En utilisant teecomme ci-dessus, les processus doivent s'exécuter à la vitesse du lecteur de destination le plus lent.
Si vous avez connecté les lecteurs de destination via USB, sachez qu'ils peuvent tous partager la bande passante du bus, de sorte que l'écriture de plusieurs en parallèle peut ne pas être plus rapide que leur écriture séquentielle car le bus USB devient le goulot d'étranglement et non les lecteurs source ou de destination.
Ce qui précède suppose que vous utilisez Linux ou similaire (cela devrait également fonctionner sur OSX bien que les noms de périphériques puissent être différents), si vous utilisez Windows ou autre chose, vous avez besoin d'une solution différente.
Éditer
L'imagerie sur le réseau a un problème similaire à l'imagerie de nombreux disques sur USB - le canal de transport devient le goulot d'étranglement au lieu des disques - à moins que le logiciel que vous utilisez ne prenne en charge une forme de transmission de diffusion ou de multidiffusion.
Pour la ddméthode, vous pourriez probablement enchaîner des processus netcat+ tee+ ddsur chaque machine comme ceci:
- Machine source
cat/ pv/ dds les données ncjusqu'à la machine de destination 1.
- La machine de destination 1
ncécoute les données de la machine source et les achemine, ce teequi les envoie à son tour dd(et donc au disque) et un autre ncprocessus qui les envoie à la machine de destination 2.
- La machine de destination 2
ncécoute les données de la machine de destination 1 et les achemine, ce teequi les envoie à son tour dd(et donc au disque) et un autre ncprocessus qui les envoie à la machine de destination 3.
- et ainsi de suite jusqu'à la dernière machine qui vient de
ncrécupérer les données de la machine précédente et de les envoyer sur le disque via dd.
De cette façon, vous utilisez potentiellement votre bande passante réseau complète en supposant que vous, votre commutateur et vos cartes réseau, avez tous négocié une liaison duplex intégral. Au lieu que la machine source envoie 10 copies des données (en supposant 10 machines de destination), chacune est donc limitée à 1/10 de la bande passante sortante, elle n'en envoie que 1. Chaque machine de destination prend une copie des données et les envoie encore. Vous devrez peut - être modifier les paramètres de taille de la mémoire tampon de pv, ncet ddde se rapprocher de la meilleure performance pratique.
Si vous pouvez trouver des logiciels qui prennent uniquement en charge la multidiffusion, ce serait beaucoup plus facile (et probablement un peu plus rapide)! Mais ce qui précède est le genre de solution hacky que je pourrais être assez stupide pour essayer ...
Modifier à nouveau
Une autre pensée. Si l'image du lecteur se comprime bien (ce qui sera le cas si de gros morceaux sont remplis de zéros), la bande passante sortante de la machine source n'a pas besoin d'être un problème même si elle est envoyée vers de nombreuses destinations à la fois. Compressez d'abord l'image, transmettez-la partout avec tee+ ncet décompressez sur les destinations (réseau-> nc-> décompresseur-> dd-> disque).