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 dd
appeler 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 cat
pour 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 tee
comme 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 dd
méthode, vous pourriez probablement enchaîner des processus netcat
+ tee
+ dd
sur chaque machine comme ceci:
- Machine source
cat
/ pv
/ dd
s les données nc
jusqu'à la machine de destination 1.
- La machine de destination 1
nc
écoute les données de la machine source et les achemine, ce tee
qui les envoie à son tour dd
(et donc au disque) et un autre nc
processus 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 tee
qui les envoie à son tour dd
(et donc au disque) et un autre nc
processus qui les envoie à la machine de destination 3.
- et ainsi de suite jusqu'à la dernière machine qui vient de
nc
ré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
, nc
et dd
de 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
+ nc
et décompressez sur les destinations (réseau-> nc
-> décompresseur-> dd
-> disque).