Necesito copiar un disco a otro. Intenté con el comando a continuación y me lleva casi un día copiar 1 TB de disco en federo.
dd if=/dev/sda of=/dev/sdb
He intentado lo mismo en un sistema Unix (HP-UX) con el siguiente comando y se completa en unas pocas horas
dd if=/dev/sda of=/dev/rdsk
¿Cuál es la alternativa que podría usar para copiar de disco a disco tan rápido?
cp /dev/sda /dev/sdb
o (pv /dev/sda > /dev/sdb
para obtener una barra de progreso) sería mucho más rápido. ¿Por qué usaríasdd
aquí?dd
solo sería útil con cosas comoconv=sync,noerror
manejar discos con errores, pero incluso entonces tendría más sentido usar cosas comoddrescue
(ver tambiénpv
la-E
opción).cat
puede ser aún más rápido, pero la diferencia no es tan dramática (tal vez más grande para dispositivo a dispositivo que archivo a archivo como en mi experimento).dd
trampa # 1Respuestas:
dd
tiene muchas opciones (extrañas), vea dd (1) .Debe indicar explícitamente el tamaño del búfer, así que intente
IIRC, el tamaño predeterminado del búfer es de solo 512 bytes. El comando anterior lo establece en 16 megabytes. Podría probar algo más pequeño (p
bs=1M
. Ej. ), Pero debería usar más que el predeterminado (especialmente en hardware de disco reciente con sectores de 4Kbytes, es decir, Formato avanzado ). Ingenuamente recomiendo una potencia de dos, que es al menos un megabyte.Con el tamaño predeterminado del búfer de 512 bytes, supongo (pero podría estar muy equivocado) que el hardware requiere que el núcleo transfiera 4K por cada bloque de 512 bytes.
Al respecto
rdsk
, las páginas de manual de sd (4) dicen:El aumento del tamaño del búfer de dd le dará más rendimiento para las operaciones de lectura y escritura. Ahora todos los discos tienen memoria intermedia de lectura / escritura de hardware. Pero si aumenta el tamaño del búfer de dd más que el búfer de hardware, su rendimiento disminuirá porque dd leerá desde el primer disco al búfer cuando el segundo disco haya escrito todo desde su propio búfer de hardware. Necesita establecer la
bs
opción del comando dd cada vez que un valor diferente para diferentes dispositivos.fuente
cat
igual de bien (para la transferencia de sistema de archivos a sistema de archivos, el bloqueo directo a bloque puede tener diferentes características de rendimiento). Sin embargo, la diferencia no fue dramática en ningún caso./dev/rdiskX
como objetivo cuando se realizadd
.status=progress
eso imprimirá todo el progreso de la operación.Años atrás en Unix-land
dd
era la forma requerida de copiar un dispositivo de bloque. Eso se ha llevado a cabo como conocimiento de culto de carga, aunque (al menos en sistemas basados en Linux)cat
es casi siempre más rápido quedd
.Sin embargo, incluso en la historia, un tamaño de bloque decente ayudó a reducir la cantidad de llamadas (lentas) del sistema, dado que cada llamada del sistema activaba una operación de E / S. El tamaño de bloque predeterminado es 512 bytes (un sector de disco). Recolectar múltiples bloques de disco juntos en una sola lectura fue, y es, también aceptable. Este ejemplo utiliza un tamaño de bloque de 32 MB:
Sin embargo, en los sistemas actuales basados en Linux, los discos se pueden copiar de manera más eficiente con un simple
cat
(Como se señaló en los comentarios sobre su pregunta,
pv
puede sustituirsecat
y le dará una indicación del progreso y el rendimiento).fuente
En general,
dd
se puede evitar a favor de algunas alternativas. Hay varias buenas razones para usar GNU en suddrescue
lugar. En Ubuntu, puedes instalarlo con:y simplemente fácil
ddrescue
de usar. Tenga en cuenta que a diferencia del nombre del paquete, el ejecutable no tiene la inicialg
.Usarlo es tan simple como:
El archivo de registro (llamado lo que elija) le permite pausar / detener y reiniciar, sin rehacer el trabajo anterior, lo cual es útil cuando se realizan clones grandes o la recuperación de discos. Por defecto, muestra el progreso, la velocidad de copia actual, la velocidad de copia promedio y el número de bloques defectuosos encontrados.
Utiliza valores predeterminados razonables para el tamaño de bloque, por lo que la velocidad de copia siempre es tan rápida como el dispositivo puede manejar, al menos en mi experiencia (he clonado muchos cientos de unidades con él, todos los tamaños y tipos).
Muchas veces, las unidades que comienzan a fallar tienen problemas de velocidad, como parches ocasionales de lentitud, baja velocidad promedio, pausas largas repentinas (sectores defectuosos) o reinicios completos (errores graves de la superficie).
ddrescue
puede ayudarlo a identificar todo lo anterior y reiniciar su clon (siempre que haya especificado un archivo de registro) incluso si su unidad se está reiniciando.fuente
Muy buena pregunta. La interfaz en bruto se implementa en algunos sistemas Unix (tru64, hpux, solaris) pero no en Linux. La interfaz sin formato hace que la transferencia sea más rápida porque se omite la E / S de Unix. La interfaz de bloque (
/dev/dsk
o/dev/disk
) es más lenta porque usa el sistema de E / S de Unix. Para acelerardd
(gnu dd can) usebs=30M
obs=20M
dependiendo de su hw. La respuesta corta es: NO, no está implementado, al menos hasta donde yo sé. Estoy usando Linux desde los viejos tiempos de la versión 2.2 del kernel y nunca lo he vistordsk
usado en Unix.fuente