dd: zapisywać na wiele dysków?

16

Mam 2 dokładnie takie same sformatowane, ten sam rozmiar i tę samą markę SD. Chciałbym ddzobrazować /dev/disk2i /dev/disk3jednocześnie.
Pseudo kod

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

Jak możesz ddprzejść od jednego wejścia do wielu wyjściowych SD?

Léo Léopold Hertz 준영
źródło
Jaki jest tu cel? Występ? Jeśli tak, pamiętaj, że dane, które odczytasz, zostaną zapisane w pamięci podręcznej. Więc 2. dd będzie dane z pamięci podręcznej zamiast odczytu (oczywiście potrzebujesz trochę wolnej pamięci RAM).
KWubbufetowicz
2
Mój uproszczony test z GNU coreutils dd ... of=one of=twonie dał dwóch wyników. Może wymagać dwóch ddpoleceń. Nie widzę sformułowania w posixie dla dd, aby pozwolić na wielokrotność of.
Jeff Schaller
@KWubbufetowicz Mam 8 GB pamięci RAM. Możliwe do uzyskania 32 GB. Szybkość jest moim celem, ponieważ mam 5 SD.
Léo Léopold Hertz

Odpowiedzi:

20
  1. Pożyczanie od don_crissti odpowiedź „s użyciu tee, ale bez ddlub bash izmów:

    sudo tee /dev/disk2 /dev/disk3 > /dev/disk4 < masi.img
    
  2. Korzystanie peez pakietu moreutils Debiana :

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

    Z bash, kshlub zsh, które można w skrócie:

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

    Lub nawet (jeśli nie ma potrzeby używania ddprzydatnych funkcji):

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

    peejest użyteczny; w razie potrzeby można dołączyć (w ramach każdego cytowanego argumentu) dodatkowe odrębne ddopcje, a nawet inne potoki i filtry, indywidualnie dopasowane do każdego urządzenia wyjściowego.

Każdą metodą można zwiększyć liczbę dysków wyjściowych na czas nieokreślony.

agc
źródło
1
Użycie do tego celu dd nie jest konieczne. Wiele osób uważa, że ​​jest to konieczne, ponieważ jego użycie, specyficzne dla kopiowania do lub z obrazów dysku, jest „skamieniałe” w tutorialach napisanych w latach 90. i skopiowane przez ludzi, którzy nie wiedzieli dlaczego. Był wtedy używany do obejścia usterki w CP.
Random832
@ Random832 Jest to konieczne, ponieważ jest bardziej stabilny niż cp. Wypróbuj wiele formatów i różnych rozmiarów alokacji. Nie znalazłem wystarczającej stabilności cpdo pracy. Proszę, popraw mnie tutaj jako odpowiedź, jeśli możesz argumentować, czy cpjest wystarczająco stabilny.
Léo Léopold Hertz
@Masi Rzadko konieczne jest jawne wybranie formatu (co rozumiesz przez „format”) i rozmiaru alokacji (masz na myśli rozmiar bloku?) Do wspólnego celu zapisywania obrazu dysku na dysku lub wczytywania dysku do obraz dysku. Powodem, dla którego dd stał się powszechnie używany do tego celu, był błąd w cp (szczególnie GNU cp w Linuksie) na początku lat 90., który spowodował, że pomijał kopiowanie bloków, które miały zero bajtów.
Random832
7
Błąd w cplatach 90.? ddjest o 20 lat starszy. Głównym powodem korzystania ddbyło to, że wiele urządzeń, zwłaszcza napędów taśmowych, musiały być odczytane / zapisane w ustalonych rozmiarów bloków, dlatego ddma bs, ibsa obsparametry, i był to jedyny program, który mógłby zapewnić poprawne rozmiary bloku.
Guntram Blohm wspiera Monikę
1
@Gilles, tutaj koszulka jest rzeczywiście lepsza niż siusiu (ale dcfldd jest najlepszy). Mimo to siusiu jest przydatne; w razie potrzeby można dołączyć (w ramach każdego cytowanego argumentu), dodatkowe opcje „dd”, a nawet inne potoki i filtry, indywidualnie dostosowane do każdego urządzenia wyjściowego.
agc
21

Możesz spróbować Jest to ulepszona wersja, która może wyświetlać dane do wielu plików lub dysków jednocześnie:dcfldd
gnu dd

dcfldd if=masi.img of=/dev/disk2 of=/dev/disk3 of=/dev/disk4
don_crissti
źródło
Czy potrafisz wyjaśnić swoje pierwsze polecenie? Dlaczego rury tylko przed ostatnim dd? Jak zmienia się lokalizacja rury z czterema dd?
Léo Léopold Hertz
3
dcflddjest najszybszy, może powinien to być pierwszy wybór.
agc
Odkryłem, że jest to znacznie szybsze niż w przypadku innych metod instalacji rurowej.
Dziękuję
3

Również jest to możliwe teei process substitution:

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

chevallier
źródło
Czy możesz wyjaśnić proces zastępujący? Czym różni się twoja odpowiedź od agc?
Léo Léopold Hertz -
tak, pewnie: process substitutionjest używany, gdy trzeba potokować stdout jednego polecenia do wielu poleceń. Użycie prostej potoku pozwoli Ci potokować tylko do jednego polecenia. Moja odpowiedź jest taka sama, jak w przypadku agc, ale w inny sposób :) Również nigdy peewcześniej nie użyłem , ponieważ mam teepolecenie w moim systemie.
chevallier