Я хотел бынаписать изображениена двух SD-картах одновременно. Я предполагаю как минимум два сценария одновременной записи:
- Можно ли записать изображение с помощью
tee
или подобного бифуркационного механизма? Можно ли выполнить команду cat или pv из двух разных оболочек BASH?
sudo sh -c 'pv sdcard.image >/dev/sdb' sudo sh -c 'pv sdcard.image >/dev/mmcblk0' sudo sh -c 'cat sdcard.image >/dev/sdb' sudo sh -c 'cat sdcard.image >/dev/mmcblk0'
Я могу предвидеть проблему в том, что если две цели могут быть записаны с разной скоростью, то может потребоваться снизить скорость записи, чтобы не перегружать более медленный писатель. Изображение большое: возможность записывать несколько целей является существенным преимуществом.
решение1
Можно ли написать изображение с помощью тройника или подобного разветвляющегося механизма?
sudo tee /dev/sdb /dev/mmcblk0 < sdcard.image > /dev/null
решение2
Можно ли выполнить команду cat из двух разных оболочек BASH?
Какая cat
команда?
Если вы просто хотите добиться того же результата, что и здесь:
sudo sh -c 'pv sdcard.image >/dev/sdb'
sudo sh -c 'pv sdcard.image >/dev/mmcblk0'
но почему бы просто не объединить команды одним нажатием Enter следующим образом?:
sudo sh -c 'pv sdcard.image /dev/sdb && pv sdcard.image /dev/mmcblk0'
Это потому, что вы не хотите читать файл дважды?
(при использовании &&
, вторая команда выполняется только в том случае, если первая команда выполнена успешно; если вы хотите выполнить вторую команду в любом случае, вы можете изменить &&
на ;
)
Чтобы прочитать файл из файловой системы только один раз, можно сделать следующее:
cat sdcard.image | tee /dev/sdb > /dev/mmcblk0
Здесь вы пользуетесь преимуществом tee
поведения по умолчанию: то, что tee
отправляется в файл, вы отправляете на одно из целевых устройств, указывая это устройство в качестве аргумента файла команды tee
, а то, что tee
отправляется настандартный вывод, вы перенаправляете его на другое целевое устройство.
Или, прочитав изображение дважды, но делаяоба пишут одновременно, впараллельный, с parallel
:
parallel 'cat sdcard.image >' ::: /dev/{sdb,mmcblk0}
Примечание: имейте в виду, что это parallel
, GNU parallel
а неmoreutils parallel
решение3
Это минимальный скрипт оболочки для параллельного копирования. Если возникнут какие-либо ошибки, они будут выведены в STDERR.
#!/bin/sh
echo "Image file ${1}"
echo "1st SD Card Path ${2}"
echo "2nd SD Card Path ${3}"
dd if=${1} of=${2}&
dd if=${1} of=${3}
Применениеsh script.sh image_file first_card_path second_card_path