Você pode usar a "substituição de processo" do bash junto com o comando tee para fazer isso:
cat drive.image | tee >(dd of=/dev/sda) >(dd of=/dev/sdb) >(dd of=/dev/sdc) | dd of=/dev/sdd
ou para maior clareza (às custas de um pouco de eficiência) você pode fazer com que o último dd
seja chamado da mesma forma que os outros e enviar o stdout do tee para / dev / null:
cat drive.image | tee >(dd of=/dev/sda) >(dd of=/dev/sdb) >(dd of=/dev/sdc) >(dd of=/dev/sdd) | /dev/null
e se você tiver instalado, poderá usar visualizador de canais em vez de cat
para obter um progresso útil indicador:
pv drive.image | tee >(dd of=/dev/sda) >(dd of=/dev/sdb) >(dd of=/dev/sdc) | dd of=/dev/sdd
Isso lê a imagem de origem apenas uma vez, portanto a unidade de origem sofre uma sobrecarga de cabeças que provavelmente será o motivo pelo qual você vê uma redução exponencial ao tentar copiar a imagem várias vezes por outros métodos. Usando tee
como acima, os processos devem ser executados na velocidade da unidade de destino mais lenta.
Se as unidades de destino estiverem conectadas via USB, esteja ciente de que elas podem estar compartilhando a largura de banda do barramento, portanto, escrever várias em paralelo pode não ser mais rápido do que gravá-las sequencialmente, pois o barramento USB se torna o gargalo e não a origem ou destino drives.
O acima pressupõe que você está usando Linux ou similar (deve funcionar no OSX também, embora os nomes dos dispositivos possam ser diferentes), se você estiver usando o Windows ou outra coisa, então você precisa de uma solução diferente.
Editar
A criação de imagens na rede tem um problema semelhante à geração de imagens de muitas unidades em USB - o canal de transporte se torna o gargalo em vez das unidades - a menos que o software usado ofereça suporte a alguma forma de transmissão de difusão ou multicast.
Para o método dd
, você poderia provavelmente processar netcat
+ tee
+ dd
da cadeia em cada máquina assim:
- Máquina de origem
cat
/pv
/dd
s os dados através denc
para a máquina de destino 1. - A máquina de destino 1 tem
nc
ouvindo os dados da máquina de origem e canalizandotee
, que por sua vez está enviando paradd
(e assim para o disco) e outronc
processo que envia para a máquina de destino 2. - A máquina de destino 2 tem
nc
escutando os dados da máquina de destino 1 e canalizandotee
, que por sua vez está enviando paradd
(e assim para o disco) e outro processonc
que envia para a máquina de destino 3. - e assim por diante até a última máquina que tem apenas
nc
pegando os dados da máquina anterior e enviando-os para o disco viadd
.
Dessa forma, você está usando potencialmente toda a sua largura de banda, supondo que todas as suas placas de rede e switch tenham negociado um link full-duplex. Em vez de a máquina de origem enviar 10 cópias dos dados (assumindo 10 máquinas de destino), cada um está limitado a 1/10 da largura de banda de saída que está enviando apenas 1. Cada máquina de destino está recebendo uma cópia dos dados e enviando-a novamente. Talvez seja necessário ajustar as configurações de tamanho de buffer de pv
, nc
e dd
para se aproximar do melhor desempenho prático.
Se você puder encontrar algum software que suporte apenas multicast, isso seria muito mais fácil (e provavelmente um pouco mais rápido)! Mas o acima é o tipo de solução hacky eu poderia ser tolo o suficiente para tentar ...
Editar novamente
Outro pensamento. Se a imagem da unidade for bem compactada (o que acontecerá se grandes partes dela estiverem cheias de zeros), a largura de banda de saída da máquina de origem não precisará ser um problema, mesmo se for enviada para vários destinos de uma só vez. Basta comprimir a imagem primeiro, transmiti-la para todos os lugares usando tee
+ nc
e descomprimir nos destinos (rede- > nc
- > descompressor- > dd
- > disco).