dd: записувати на кілька дисків?


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-й dd ви отримаєте дані з свого bcache замість читання (звичайно, вам потрібна безкоштовна оперативна пам’ять).
KWubbufetowicz

2
Мій спрощений тест з GNU coreutils dd ... of=one of=twoне дав двох результатів. Може знадобитися дві ddкоманди. Я не бачу формулювання в позі для dd, щоб дозволити кілька of.
Джефф Шаллер

@KWubbufetowicz У мене є 8 Гб оперативної пам’яті. Можливо отримати 32 ГБ. Швидкість - це моя мета, оскільки у мене є 5 SD.
Лео Леопольд Герц 준영

Відповіді:


20
  1. Запозичення з don_crissti відповіді «и з допомогою tee, але без ddабо Баш ізмів:

    sudo tee /dev/disk2 /dev/disk3 > /dev/disk4 < masi.img
    
  2. Використання пакета moreutilspee 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-х роках і скопійованих людьми, які не знали, чому. Тоді воно використовувалося для вирішення проблеми в кп.
Випадково832

@ Random832 Це необхідно, тому що він більш стабільний, ніж cp. Спробуйте багато форматів та різних розмірів розподілу. Я не знайшов достатньо стабільного cpдля роботи. Будь ласка, виправте мене як відповідь тут, якщо ви можете аргументувати, наскільки cpце досить стабільно.
Лео Леопольд Герц 준영

@Masi Рідко потрібно чітко вибрати формат (що ви навіть маєте на увазі під "форматом") та розмір розподілу (ви маєте на увазі розмір блоку?) Для загальної мети запису зображення диска на диск чи читання диска на зображення диска. Причина, яку розпочали часто використовувати для цієї мети, була помилка в cp (GNU cp для Linux) на початку 90-х, що призвело до пропускання копіюючих блоків, які були нульовими байтами.
Випадково832

7
Помилка в cp90-х? ddна 20 років старший за це. Основна причина для використання в ddтому , що багато пристроїв, особливо стрічкові накопичувачів, необхідних для зчитування / запису в фіксованих розмірах блоків, тому ddмає bs,ibs і obsпараметри, і це була єдиною програма , яка могла б забезпечити правильні розміри блоків.
Guntram Blohm підтримує Моніку

1
@Gilles, тут трійник дійсно краще попісяти , (але dcfldd краще). Все-таки мочиться корисно; можна, якщо потрібно, включати (у кожному аргументованому аргументі) додаткові параметри 'dd' та навіть інші труби та фільтри, індивідуально підібрані під кожен вихідний пристрій.
agc

21

Ви можете спробувати Це вдосконалена версія, і вона може одночасно виводити на кілька файлів або дисків:dcfldd
gnu dd

dcfldd if=masi.img of=/dev/disk2 of=/dev/disk3 of=/dev/disk4

Чи можете ви пояснити свою першу команду. Чому труба лише до останнього dd? Як місце розташування труби змінюється чотирма dd?
Лео Леопольд Герц 준영

3
dcflddнайшвидший, можливо, це повинен бути перший вибір.
agc

Я виявив, що це значно швидше, ніж інші методи трубопроводів.
Дякую

3

Також це можливо з teeі process substitution:

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


Чи можете ви пояснити замінник процесу? Чим ваша відповідь відрізняється від відповіді?
Лео Леопольд Герц 준영

так, впевнено: process substitutionвикористовується, коли вам потрібно передати stdout однієї команди до декількох команд. Використання простої труби дозволить вам передати лише одну команду. Моя відповідь - це досягнення такого ж результату, як і agc, але по-іншому :) Також я ніколи peeраніше не використовував , як я маю teeкоманду в своїй системі.
Шевальє
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.