dd: escribir en múltiples discos?

16

Tengo 2 tarjetas SD exactamente formateadas, del mismo tamaño y de la misma marca. Quisiera ddimagen para /dev/disk2y para /dev/disk3, al mismo tiempo.
Pseudocódigo

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

¿Cómo puedes ddpasar de una entrada a muchas SD de salida?

Léo Léopold Hertz 준영
fuente
¿Cuál es el objetivo aquí? ¿Actuación? En caso afirmativo, recuerde que los datos que lea se almacenarán en caché. Entonces, el segundo dd le proporcionará datos de su bcache en lugar de leer (por supuesto, necesita algo de RAM libre).
KWubbufetowicz
2
Mi prueba simplista con GNU coreutils dd ... of=one of=twono produjo dos salidas. Puede necesitar dos ddcomandos. No veo la redacción en posix para dd para permitir múltiples of's.
Jeff Schaller
@KWubbufetowicz Tengo 8GB de RAM. Posible obtener 32 GB. La velocidad es mi objetivo porque tengo 5 SD.
Léo Léopold Hertz 준영

Respuestas:

20
  1. Los préstamos de don_crissti respuesta 's usando tee, pero sin ddo fiesta ismos:

    sudo tee /dev/disk2 /dev/disk3 > /dev/disk4 < masi.img
    
  2. Usando peeel paquete moreutils de Debian :

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

    Con bash, ksho zsh, que se puede abreviar para:

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

    O incluso, (si no hay necesidad de ddlas funciones útiles):

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

    peees útil; si es necesario, uno puede incluir, (dentro de cada argumento citado), ddopciones distintas adicionales e incluso otras tuberías y filtros, adaptados individualmente a cada dispositivo de salida.

Con cualquiera de los métodos, el número de discos de salida se puede extender indefinidamente.

agc
fuente
1
Usar dd para esto no es necesario. Mucha gente cree que es necesario porque su uso, específico para copiar hacia o desde imágenes de disco, está "fosilizado" en tutoriales escritos en los años 90 y copiados por personas que no sabían por qué. Fue utilizado en aquel entonces para solucionar un problema técnico en cp.
Random832
@ Random832 Es necesario porque es más estable que cp. Pruebe muchos formatos y diferentes tamaños de asignación. No he encontrado suficiente estable cppara el trabajo. Por favor, corríjame como respuesta aquí si puede argumentar cómo cpes lo suficientemente estable.
Léo Léopold Hertz 준영
@ Masi Raramente es necesario seleccionar explícitamente un formato (¿qué quiere decir con "formato") y el tamaño de asignación (¿se refiere al tamaño de bloque?) Con el propósito común de escribir una imagen de disco en un disco o leer un disco en Una imagen de disco. La razón por la que dd se usó comúnmente para este propósito fue debido a un error en cp (GNU cp en Linux específicamente) a principios de los 90 que hizo que omitiera los bloques de copia que eran todos de cero bytes.
Random832
77
¿Insecto en cplos años 90? ddes 20 años mayor que eso. La principal razón para usar ddfue que muchos dispositivos, en especial las unidades de cinta, necesarios para leer / escribir en tamaños de bloques fijos, por lo que ddtiene bs, ibsy obsparámetros, y fue el único programa que podría asegurar tamaños de bloques correctos.
Guntram Blohm apoya a Monica
1
@Gilles, aquí la camiseta es preferible a orinar , (pero dcfldd es lo mejor). Aún así, orinar es útil; uno puede, si es necesario, incluir, (dentro de cada argumento citado), opciones 'dd' adicionales, e incluso otras tuberías y filtros, adaptados individualmente a cada dispositivo de salida.
agc
20

Puede probar Es una versión mejorada de y puede generar múltiples archivos o discos al mismo tiempo:dcfldd
gnu dd

dcfldd if=masi.img of=/dev/disk2 of=/dev/disk3 of=/dev/disk4
don_crissti
fuente
¿Puedes explicar tu primer comando? ¿Por qué tubería solo antes de la última dd? ¿Cómo cambia la ubicación de la tubería con cuatro dd?
Léo Léopold Hertz 준영
3
dcflddes el más rápido, tal vez esa debería ser la primera opción.
agc
3

También esto es posible con teey process substitution:

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

chevallier
fuente
¿Puedes explicar el proceso sustituto? ¿Cómo es tu respuesta diferente de la de agc?
Léo Léopold Hertz 준영
Sí, claro: process substitutionse usa cuando necesita canalizar la salida estándar de un comando a varios comandos. El uso de una tubería simple le permitirá canalizar a un solo comando. Mi respuesta está logrando el mismo resultado que agc, pero de una manera diferente :) Además, nunca lo usé peeantes, ya que tengo el teecomando en mi sistema.
chevallier