дд: записать на несколько дисков?

16

У меня есть 2 абсолютно одинаковые отформатированные, одинакового размера и SD-карты той же марки. Я хотел бы, чтобы ddизображение /dev/disk2и /dev/disk3одновременно.
ПСЕВДОКОД

sudo dd bs=1m if=/Users/masi/2016-05-10-raspbian-jessie.img of={/dev/disk2,/dev/disk3}

Как вы можете ddс одного входа на много выходных SD?

Лео Леопольд Герц 준영
источник
Какова цель здесь? Производительность? Если да, помните, что прочитанные вами данные будут кэшированы. Таким образом, 2-й дд будет вам данные из вашего bcache вместо чтения (конечно, вам нужно немного свободной оперативной памяти).
KWubbufetowicz
2
Мой упрощенный тест с GNU coreutils dd ... of=one of=twoне дал двух выходных данных. Может понадобиться две ddкоманды. Я не вижу формулировки в posix для dd, чтобы учесть несколько of.
Джефф Шаллер
@ KWubbufetowicz У меня 8 ГБ ОЗУ. Можно получить 32 ГБ. Скорость - моя цель, потому что у меня 5 SD.
Лео Леопольд Герц 준영

Ответы:

20
  1. Заимствование из ответа don_crissti с использованием tee, но без ddили bash isms:

    sudo tee /dev/disk2 /dev/disk3 > /dev/disk4 < masi.img
    
  2. Использование peeиз пакета moreutils Debian :

    sudo dd if=masi.img | \
      pee "dd of=/dev/disk2"  "dd of=/dev/disk3"  "dd of=/dev/disk4"
    

    С bash, kshили zsh, что может быть сокращено до:

    sudo dd if=masi.img | pee "dd of=/dev/disk"{2..4}
    

    Или даже (если нет необходимости в ddполезных функциях):

    sudo pee "dd of=/dev/disk"{2..4} < masi.img
    

    peeявляется полезным; если требуется, один может включать (в пределах каждого аргумента в кавычках) дополнительные отличные ddопции и даже другие каналы и фильтры, индивидуально настроенные для каждого устройства вывода.

В любом случае количество выходных дисков может быть увеличено до бесконечности.

АРУ
источник
1
Использование dd для этого не обязательно. Многие люди считают, что это необходимо, потому что его использование, специфичное для копирования на или с образов дисков, «окаменело» в руководствах, написанных еще в 90-х годах и скопированных людьми, которые не знали, почему. Тогда он использовался для обхода проблем в cp.
Random832
@ Random832 Это необходимо, потому что это более стабильно, чем cp. Попробуйте много форматов и разных размеров размещения. Я не нашел достаточно стабильной cpдля работы. Пожалуйста, поправьте меня как ответ здесь, если вы можете аргументировать, насколько cpдостаточно стабильно.
Лео Леопольд Герц 준영
@Masi Редко необходимо явно выбирать формат (что вы даже подразумеваете под «формат») и размер выделения (вы имеете в виду размер блока?) Для общей цели записи образа диска на диск или чтения диска в образ диска. Причиной, по которой dd стал широко использоваться для этой цели, была ошибка cp (в частности, GNU cp для Linux) в начале 90-х, из-за которой он пропускал копирование блоков с нулевыми байтами.
Random832
7
Ошибка в cp90-х? ddна 20 лет старше этого. Основная причина использования в ddтом , что многие устройства, особенно ленточные накопители, необходимые для чтения / записи в фиксированных размеров блоков, поэтому ddимеет bs, ibsи obsпараметры, и это была единственная программа , которая могла бы обеспечить правильные размеры блоков.
Гунтрам Блом поддерживает Монику
1
@ Жиль, здесь tee действительно предпочтительнее, чем моча (но dcfldd лучше). Тем не менее, моча полезна; при необходимости можно включить (в каждом указанном аргументе) дополнительные параметры 'dd' и даже другие каналы и фильтры, индивидуально настроенные для каждого устройства вывода.
АРУ
21

Вы можете попробовать Это расширенная версия и может одновременно выводить на несколько файлов или дисков:dcfldd
gnu dd

dcfldd if=masi.img of=/dev/disk2 of=/dev/disk3 of=/dev/disk4
don_crissti
источник
Можете ли вы объяснить свою первую команду. Почему труба только до последнего dd? Как меняется расположение трубы с четырьмя dd?
Лео Леопольд Герц 준영
3
dcflddэто самый быстрый, может быть, это должно быть первым выбором.
АРУ
Я обнаружил, что это значительно быстрее, чем другие методы трубопровода.
Спасибо,
3

Также это возможно с teeи process substitution:

dd if=/dev/sda | tee >(dd of=/dev/sdb) >(dd of=/dev/sdc) | dd of=/dev/sdd

Шевалье
источник
Можете ли вы объяснить процесс замены? Чем ваш ответ отличается от ответа АГК?
Лео Леопольд Герц 준영
да, конечно: process substitutionиспользуется, когда вам нужно передать стандартный вывод одной команды нескольким командам. Использование простого канала позволит вам передать только одну команду. Мой ответ заключается в достижении того же результата, что и у agc, но по-другому :) Также я никогда не использовал peeраньше, так как у меня есть teeкоманда в моей системе.
chevallier