dd: tulis ke banyak disk?

16

Saya memiliki 2 format yang sama persis, ukuran yang sama dan kartu SD merek yang sama. Saya ingin ddgambar ke /dev/disk2dan /dev/disk3pada saat yang sama.
Kodesemu

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

Bagaimana Anda bisa dddari satu input ke banyak output SD?

Léo Léopold Hertz 준영
sumber
Apa tujuannya di sini? Performa? Jika ya ingat data yang Anda baca akan di-cache. Jadi, tanggal 2 akan Anda data dari bcache Anda alih-alih membaca (tentu saja Anda memerlukan beberapa RAM gratis).
KWubbufetowicz
2
Tes sederhana saya dengan GNU coreutils dd ... of=one of=twotidak menghasilkan dua output. Mungkin perlu dua ddperintah. Saya tidak melihat kata-kata dalam posix untuk dd untuk memungkinkan beberapa of.
Jeff Schaller
@ Kwubbufetowicz Saya memiliki RAM 8GB. Kemungkinan untuk mendapatkan 32GB. Kecepatan adalah tujuan saya karena saya punya 5 SD.
Léo Léopold Hertz 준영

Jawaban:

20
  1. Meminjam dari jawaban don_crissti menggunakan tee, tetapi tanpa ddatau bash isme:

    sudo tee /dev/disk2 /dev/disk3 > /dev/disk4 < masi.img
    
  2. Menggunakan peedari paket moreutils Debian :

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

    Dengan bash,, kshatau zsh, yang dapat disingkat menjadi:

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

    Atau bahkan, (jika tidak perlu ddfungsi berguna):

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

    peeberguna; jika diperlukan satu dapat mencakup, (dalam setiap argumen dikutip), ddopsi berbeda yang berbeda , dan bahkan pipa dan filter lainnya, yang dirancang secara individual untuk setiap perangkat output.

Dengan metode apa pun, jumlah disk keluaran dapat diperpanjang tanpa batas.

agc
sumber
1
Menggunakan dd untuk ini tidak perlu. Banyak orang percaya itu perlu karena penggunaannya, khusus untuk menyalin ke atau dari gambar disk, adalah "fosil" dalam tutorial yang ditulis kembali di tahun 90-an dan disalin oleh orang-orang yang tidak tahu mengapa. Itu digunakan saat itu untuk mengatasi kesalahan dalam cp.
Random832
@ Random832 Ini perlu karena lebih stabil daripada cp. Coba banyak format dan ukuran alokasi yang berbeda. Saya belum menemukan cukup stabil cpuntuk pekerjaan itu. Tolong, koreksi saya sebagai jawaban di sini jika Anda dapat berdebat bagaimana cpcukup stabil.
Léo Léopold Hertz 준영
@Masi Jarang diperlukan untuk secara eksplisit memilih format (apa yang Anda maksud dengan "format") dan ukuran alokasi (maksud Anda ukuran blok?) Untuk tujuan umum menulis gambar disk ke disk atau membaca disk ke dalam gambar disk. Alasan dd menjadi umum digunakan untuk tujuan ini adalah karena bug di cp (GNU cp di Linux khusus) di awal 90-an yang menyebabkannya melewatkan blok penyalinan yang semuanya nol-byte.
Random832
7
Bug di cptahun 90-an? dd20 tahun lebih tua dari itu. Alasan utama untuk menggunakan ddadalah bahwa banyak perangkat, terutama tape drive, perlu dibaca / ditulis dalam ukuran blok tetap, itulah sebabnya ddmemiliki bs, ibsdan obsparameter, dan itu adalah satu-satunya program yang dapat memastikan ukuran blok yang benar.
Guntram Blohm mendukung Monica
1
@Gilles, di sini tee memang lebih disukai daripada kencing , (tapi dcfldd adalah yang terbaik). Meski demikian, kencing tetap bermanfaat; satu dapat, jika diperlukan, termasuk, (dalam setiap argumen dikutip), opsi 'dd' tambahan, dan bahkan pipa dan filter lainnya, yang dirancang secara individual untuk setiap perangkat output.
agc
20

Anda dapat mencoba ini versi yang disempurnakan dan dapat menghasilkan banyak file atau disk secara bersamaan:dcfldd
gnu dd

dcfldd if=masi.img of=/dev/disk2 of=/dev/disk3 of=/dev/disk4
don_crissti
sumber
Bisakah Anda menjelaskan perintah pertama Anda? Mengapa pipa hanya sebelum yang terakhir dd? Bagaimana lokasi pipa berubah dengan empat dd?
Léo Léopold Hertz 준영
3
dcflddadalah yang tercepat, mungkin itu harus menjadi pilihan pertama.
AGC
3

Ini juga dimungkinkan dengan teedan process substitution:

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

chevallier
sumber
Bisakah Anda menjelaskan proses pengganti? Bagaimana jawaban Anda berbeda dari jawaban AGC?
Léo Léopold Hertz 준영
yeah sure: process substitutiondigunakan ketika Anda perlu mem-pipe stdout dari satu perintah ke banyak perintah. Menggunakan pipa sederhana akan membuat Anda hanya melakukan satu perintah. Jawaban saya mencapai hasil yang sama dengan AGC, tetapi dengan cara yang berbeda :) Saya juga tidak pernah menggunakan peesebelumnya, karena saya memiliki teeperintah pada sistem saya.
chevallier