Вы можете использовать "замену процесса" в bash вместе с командой tee, чтобы сделать это:
cat drive.image | tee >(dd of=/dev/sda) >(dd of=/dev/sdb) >(dd of=/dev/sdc) | dd of=/dev/sdd
или для ясности (за счет небольшой эффективности) вы можете сделать так, чтобы последний dd
вызывался так же, как и другие, и отправлять стандартный вывод 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
и если он у вас установлен, вы можете использовать pipe viewer вместо 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
передает данные через nc
на конечный компьютер 1.
- На целевой машине 1
nc
прослушивает данные с исходной машины и передает их через tee
который, в свою очередь, отправляет их на dd
(и так на диск), и другой процесс nc
который отправляет на целевую машину 2.
- Машина-получатель 2 имеет
nc
прослушивает данные с машины-получателя 1 и передает их через tee
который, в свою очередь, отправляет их на dd
(и так на диск), и другой процесс nc
который отправляет на машину-получатель 3.
- и так далее до тех пор, пока последний компьютер, на котором только что установлен
nc
заберет данные с предыдущего компьютера и отправит их на диск через dd
.
Таким образом, вы потенциально используете полную пропускную способность сети, предполагая, что ваш коммутатор и сетевые карты согласовали полнодуплексную связь. Вместо того, чтобы исходная машина отправляла 10 копий данных (при условии, что 10 конечных машин), каждая из которых ограничена 1/10 от исходящей полосы пропускания, она отправляет только 1. Каждый конечный компьютер берет одну копию данных и отправляет ее снова. Возможно, вам придется настроить параметры размера буфера pv
, nc
и dd
чтобы приблизиться к наилучшей практической производительности.
Если вы найдете какое-нибудь программное обеспечение, которое поддерживает многоадресную рассылку, это будет намного проще (и, возможно, немного быстрее)! Но вышеупомянутое является своего рода хакерским решением, которое я мог бы быть достаточно глупым, чтобы попробовать ...
Редактировать снова
Еще одна мысль. Если образ диска хорошо сжимается (что будет, если большие его части заполнены нулями), исходящая пропускная способность исходного компьютера не должна быть проблемой, даже если отправка сразу нескольким адресатам. Просто сначала сожмите изображение, передайте его везде, используя tee
+nc
, и распакуйте в местах назначения (network-> nc
-> depressor-> dd
-> disk).