Un hack de la vieja escuela, haciendo uso de dd y
tee se puede de una manera muy simple clonar en varios
dispositivos al mismo tiempo, la desventaja es que por lo general
los distintos puertos USB comparten el mismo BUS y por ello puede
ser más lento copiar más de 1 a la vez, pero bueno, sirve para un
proceso desatendido.
Primero, un test, de que efectivamente funcione:
ls / | pv | tee >(dd of=a) >(dd of=b) | (dd of=c)
ls / listamos el contenido de la raíz
| pv agregamos un pipe view para tener un indicador de
progreso| tee esto nos permite redireccionar a la salida estándar y al
mismo tiempo enviar la salida a un archivo.>(dd of=a) enviamos la salida al archivo a>(dd of=b) enviamos la salida al archivo b>| (dd of=c) última salida al archivo c
El resultado es el siguiente:
160B 0:00:00 [3,37kB/s] [ <=> ]
0+1 registros leídos
0+1 registros escritos
160 bytes (160 B) copiados, 0,0398646 s, 4,0 kB/s
0+1 registros leídos
0+1 registros escritos
160 bytes (160 B) copiados, 0,0434177 s, 3,7 kB/s
0+1 registros leídos
0+1 registros escritos
160 bytes (160 B) copiados, 0,0465925 s, 3,4 kB/s
Se visualizan el total de bytes copiados 160 y la tasa de
transferencia en cada caso: 4,0, 3,7 y 3.4 kB/s.
Comprobamos que los 3 archivos estén completos y sean idénticos:
ls -lh a b c
-rw-rw-r-- 1 osiris osiris 160 ago 12 12:46 a
-rw-rw-r-- 1 osiris osiris 160 ago 12 12:46 b
-rw-rw-r-- 1 osiris osiris 160 ago 12 12:46 c
md5sum a b c
0f422c457d50131124ba323a23f76f7e a
0f422c457d50131124ba323a23f76f7e b
0f422c457d50131124ba323a23f76f7e c
Luego generamos un pendrive con el contenido a copiar, en nuestro
caso, el mismo ocupa solo 1.4G de los 7.4 disponibles:
fdisk -l | grep sdc1
/dev/sdc1 7,4G 1,4G 6,0G 20% /mnt/sdc
La utilidad pv simplemente va contando los bytes que pasan,
pero si indicamos el tamaño total a copiar, nos proporciona un
ETA que ayuda bastante a tener una idea real de cuanto
tardará el proceso de copia. Para esto es necesario indicar la
cantidad de bytes, esto lo podemos obtener usando fdisk:
B=$(fdisk -l /dev/sdc | grep sdc | head -1 | awk '{print $5}')
Entonces leemos el contenido del pendrive y creamos una imagen en
disco, desde la cual copiaremos el resto de los pendrives.
dd if=/dev/sdc bs=1M | pv -s $B | dd of=pendrive.raw
La copia dura unos 9 minutos, en total se copian los 8GB a una
tasa de transferencia de 14,3 MB/s
7,46GB 0:09:19 [13,7MB/s] [===============>] 100%
15646720+0 registros leídos
15646720+0 registros escritos
8011120640 bytes (8,0 GB) copiados, 559,49 s, 14,3 MB/s
Ahora partimos desde la imagen pendrive.raw y clonamos los
dispositivos /dev/sdc y /dev/sdd usando lo siguiente:
time dd if=pendrive.raw | tee >(dd of=/dev/sdc) | (dd of=/dev/sdd)
El resultado, no fue favorable en términos de tiempos, 38 minutos
para clonar 2 pendrives! Esto varía de máquina en máquina, es
cuestión de probar con diferentes puertos y usando un hub USB
(algo que no hicimos).
time dd if=pendrive.raw | tee >(dd of=/dev/sdc) | (dd of=/dev/sdd)
15646720+0 registros leídos
15646720+0 registros escritos
8011120640 bytes (8,0 GB) copiados, 2313,62 s, 3,5 MB/s
15646720+0 registros leídos
15646720+0 registros escritos
8011120640 bytes (8,0 GB) copiados, 2321,35 s, 3,5 MB/s
15646720+0 registros leídos
15646720+0 registros escritos
8011120640 bytes (8,0 GB) copiados, 2326,16 s, 3,4 MB/s
real38m46.174s
user0m57.744s
sys6m4.339s