Pregunta Usando DD para la clonación de discos


Ha habido una serie de preguntas con respecto a las herramientas de clonación de discos y dd Se ha sugerido al menos una vez. Ya he considerado usar dd yo mismo, principalmente porque es fácil de usar y está disponible en prácticamente todas las distribuciones de arranque de Linux.

¿Cuál es la mejor manera de usar? dd para clonar un disco? Hice una búsqueda rápida en Google, y el primer resultado fue un aparente intento fallido. ¿Hay algo que deba hacer después de usar dd, es decir, hay algo que no se puede leer usando dd?


176
2018-05-05 18:21


origen


Soy consciente de cómo funciona dd, mi pregunta fue más en la dirección de cualquier problema conocido relacionado con dd al clonar discos (como se describe en el enlace), tal vez esto no fue muy claro. Lo que contiene su respuesta y la suya no es "nunca tuve problemas con ella". Yo también voté por tu respuesta, ya que definitivamente presentaste algunos puntos interesantes (me gusta el que no tiene indicación de progreso). - falstro
Parece que tienes el Spolsky Bump: joelonsoftware.com/items/2009/05/29.html - Kyle Cronin
no vi esto aquí cuando le pregunté (y respondí) una pregunta similar en superusuario - superuser.com/questions/11453/… - warren
Es irónico que Joel haya vinculado la pregunta como un buen ejemplo de falla del servidor, aunque ninguna de las respuestas fue buena. No hubo una respuesta entre 25 (excluyendo comentarios) con el derecho dd opciones para omitir bloques defectuosos, lo que es esencial al clonar discos para la recuperación. Agregué una mejor respuesta, que puede clonar discos que tienen bloques defectuosos: dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror - Sam Watkins
Creo que dd restore podría "fallar" si se habla de sistemas de archivos dependientes de la geometría de la unidad y la restauración se realiza en discos duros no idénticos Experimenté algunas fallas en la restauración de dd, y creo que este fue el problema en mi caso. - Marco


Respuestas:


dd es sin duda la mejor herramienta de clonación, creará una réplica al 100% simplemente usando el siguiente comando. Nunca he tenido ningún problema con eso.

dd if=/dev/sda of=/dev/sdb bs=32M

Tenga en cuenta que al clonar cada byte, no debe usar esto en una unidad o partición que se esté utilizando. Especialmente las aplicaciones como las bases de datos no pueden hacer frente a esto muy bien y puede terminar con datos corruptos.


152
2018-05-05 18:31



Por supuesto, siempre que / dev / sdb sea al menos tan grande como / dev / sda ... - Eddie
agrega un "bs = 100M conv = notrunc" y es mucho más rápido en mi experiencia. - Tim Williscroft
ten mucho cuidado con las letras 'i' y 'o' ... - bandi
Nadie parece saber este truco ... dd es un programa de copia asimétrica, lo que significa que leerá primero, luego escribirá, luego volverá. Puede canalizar dd a sí mismo y forzarlo a realizar la copia simétricamente, de la siguiente manera: dd if=/dev/sda | dd of=/dev/sdb. En mis pruebas, ejecutar el comando sin la tubería me dio un rendimiento de ~ 112kb / s. Con la tubería, tengo ~ 235kb / s. Nunca he tenido problemas con este método. ¡Buena suerte! - Mistiry
@Mistiry, ese no es el significado de la palabra simétrica. - psusi


Para ahorrar espacio, puede comprimir los datos producidos por dd con gzip, por ejemplo:

dd if=/dev/hdb | gzip -c  > /image.img

Puedes restaurar tu disco con:

gunzip -c /image.img.gz | dd of=/dev/hdb

Para ahorrar aún más espacio, desfragmente la unidad / partición que desea clonar de antemano (si corresponde), luego elimine todo el espacio no utilizado restante, lo que facilita la compresión de gzip:

mkdir /mnt/hdb
mount /dev/hdb /mnt/hdb
dd if=/dev/zero of=/mnt/hdb/zero

Espere un poco, dd eventualmente fallará con un mensaje de "disco lleno", luego:

rm /mnt/hdb/zero
umount /mnt/hdb
dd if=/dev/hdb | gzip -c  > /image.img

Además, puede obtener un proceso dd ejecutándose en segundo plano para informar el estado enviándole una señal con el comando kill, por ejemplo:

dd if=/dev/hdb of=/image.img &
kill -SIGUSR1 1234

Verifique su sistema: el comando anterior es para Linux, OSX y BSD. Los comandos dd difieren en las señales que aceptan (OSX usa SIGINFO - puedes presionar Ctrl+T para informar el estado).


104
2018-05-06 22:47



¿Funciona también con "modernos" como BTRFS, NILFS, [lo que pueda soñar]? - Steve Schnepp
DD funciona en dispositivos de bloque, un nivel de abstracción más bajo que el sistema de archivos, por lo que debería, sí. Aunque en realidad no lo he intentado. Hmm, NILFS parece interesante, tendré que echarle un vistazo a eso. - David Hicks
+1 para el kill -SIGUSR1 %1, y el comando dd de OSX acepta felizmente SIGUSR1 ... ¡muy útil, gracias! - stuartc
+1 para Kill -SIGUSR1 1234 Estaba buscando eso. - hot2use
Deberia ser: dd if=/dev/hdb | gzip -c > /image.img.gz ? - Mike Causer


PRECAUCIÓN: dd'ing un sistema de archivos en vivo puede dañar archivos. La razón es simple, no comprende la actividad del sistema de archivos que puede estar ocurriendo y no intenta mitigarla. Si una escritura está parcialmente en curso, obtendrá una escritura parcial. Esto generalmente no es bueno para las cosas, y generalmente es fatal para las bases de datos. Además, si arruinas la tipografía propensa. Si y de Parámetros, ay de ti. En la mayoría de los casos, rsync Es una herramienta igualmente efectiva escrita después de la llegada de multitarea, y proporcionará vistas consistentes de archivos individuales.

Sin embargo, DD debe capturar con precisión el estado de bits de una unidad sin montar. Cargadores de arranque, volúmenes llvm, UUID de partición y etiquetas, etc. Solo asegúrese de tener una unidad capaz de reflejar el bit de la unidad de destino por bit.


37
2018-05-05 20:20



Sospecho que sync No es la respuesta a problemas de corrupción de archivos. ¿Qué sucede si un demonio o algo escribe más archivos después de la sync, durante el dd ¿operación? - Deleted
Es una buena idea desmontar la unidad primero (o volver a montarla como de solo lectura), pero no siempre es posible - Alex Bolotov
En cuyo caso, utiliza rsync y deje que el archivo maneje magic para obtener un archivo coherente y deje que la semántica Copiar en escritura maneje las escrituras entrantes. - jldugger
Me gustaría agregar que ejecutar dd en un sistema de archivos montado NO CORREGIRÁ los archivos en el sistema de archivos montado, pero lo que se quiere decir aquí es que la copia del sistema de archivos estará necesariamente en un buen estado. - 3molo
Utilizando rsync asegurará que el datos internos En el sistema de archivos de destino es consistente. Eso no lo hará asegúrese de que los datos de los archivos sean coherentes; para ello, deberá bloquear los archivos y cualquier programa que escriba en los archivos deberá respetar estos bloqueos. - Martin Geisler


Cuando use dd para clonar un disco que puede contener sectores defectuosos, use "conv = noerror, sync" para asegurarse de que no se detenga cuando encuentre un error, y rellene los sectores faltantes con bytes nulos. Este suele ser el primer paso que tomo si trato de recuperarme de un disco fallido o defectuoso: obtenga una copia antes de realizar cualquier intento de recuperación y luego realice la recuperación en el disco correcto (clonado). Lo dejo a la herramienta de recuperación para hacer frente a cualquier sector en blanco que no se pueda copiar.

Además, es posible que la velocidad de dd se vea afectada por la configuración de bs (tamaño de bloque). Por lo general, intento bs = 32768, pero es posible que desee probarlo en sus propios sistemas para ver qué funciona más rápido para usted. (Esto supone que no necesita usar un tamaño de bloque específico por otra razón, por ejemplo, si está escribiendo en una cinta).


26
2018-05-07 02:42



Si tienes un disco con sectores defectuosos, deberías usar 'ddrescue' en lugar de dd. Es mucho más eficiente y tiene muchas más posibilidades de recuperar más datos. (No lo confundas con dd_rescue, que no es tan bueno) - davr
no debe usar un tamaño de bloque grande si intenta omitir bloques defectuosos, o saltará demasiado. 4096 es lo suficientemente grande. - Sam Watkins


Para clonar un disco, todo lo que necesita hacer es especificar la entrada y la salida a dd:

dd if=/dev/hdb of=/image.img

Por supuesto, asegúrese de tener los permisos adecuados para leer directamente desde / dev / hdb (recomendaría ejecutarlo como root), y que / dev / hdb no está montado (no desea copiar mientras se cambia el disco; también se acepta el montaje como solo lectura). Una vez completado, image.img será un clon byte-by-byte de todo el disco.

Hay algunos inconvenientes en el uso de dd para clonar discos. Primero, dd copiará todo su disco, incluso el espacio vacío, y si lo hace en un disco grande puede resultar en un archivo de imagen extremadamente grande. En segundo lugar, dd no proporciona absolutamente ninguna indicación de progreso, lo que puede ser frustrante porque la copia lleva mucho tiempo. En tercer lugar, si copia esta imagen en otras unidades (de nuevo, utilizando dd), deben ser tan grandes o más grandes que el disco original, pero no podrá utilizar ningún espacio adicional que pueda tener en el disco de destino hasta que redimensiona tus particiones.

También puede hacer una copia directa de disco a disco:

dd if=/dev/hdb of=/dev/hdc

pero todavía estás sujeto a las limitaciones anteriores con respecto al espacio libre.

En lo que respecta a problemas o problemas, dd, en su mayor parte, hace un excelente trabajo. Sin embargo, hace un tiempo tenía un disco duro que estaba a punto de morir, así que usé dd para intentar copiar la información que podía antes de que muriera por completo. Luego se supo que dd no maneja muy bien los errores de lectura: había varios sectores en el disco que dd no pudo leer, lo que provocó que dd se rindiera y detuviera la copia. En ese momento no pude encontrar una manera de decirle a dd que continuara a pesar de encontrar un error de lectura (aunque aparece como si tuviera esa configuración), así que pasé bastante tiempo especificando manualmente saltar y tratar de saltar sobre las secciones ilegibles.

Pasé un tiempo buscando soluciones para este problema (después de haber completado la tarea) y encontré un programa llamado ddrescue, que, según el sitio, funciona como dd pero continúa leyendo incluso si encuentra un error. Nunca he usado el programa, pero vale la pena considerarlo, especialmente si el disco del que está copiando es antiguo, lo que puede tener sectores defectuosos incluso si el sistema parece estar bien.


17
2018-05-05 18:26



... dd no proporciona absolutamente ninguna indicación de progreso ... - bueno, esto no es cierto - hay una forma un tanto complicada de cómo mostrar el progreso - debe averiguar el proceso pid dd ('ps -a | grep dd') y luego enviar la señal USR1 a este proceso - 'kill -USR1 < dd_pid_here> '(sin <>) que obliga a dd a mostrar información de progreso. - Michal Bernhard
"varios sectores en el disco que dd no pudo leer": creo que conv=sync,noerror ayudaría. - Gauthier
los conv=sync,noerror las opciones son esenciales, permiten que dd salte los bloques defectuosos y los ponga en cero en la imagen para que las cosas se alineen correctamente. Atrezzo a las pocas personas que comentaron algo sobre eso. - Sam Watkins
ÑU ddrescue proporciona un indicador de progreso sin opciones especiales, y puede detener la copia y reanudarla donde la dejó. - endolith
Una forma menos complicada de progresar con dd es agregar la opción status=progress - James


Si la unidad de origen está dañada, tendrá más suerte usando dd_rhelp con dd_rescue (mi preferencia personal) o GNU ddrescue.

La razón detrás de esto es que, en los errores de lectura, dd sigue intentando y probando e intentando, posiblemente esperando durante mucho tiempo para que se produzcan tiempos de espera. dd_rescue hace cosas inteligentes como leer hasta un error, luego elegir un lugar más en el disco y leer hacia atrás hasta el último error, y dd_rhelp es básicamente un dd_rescuegestor de sesiones - iniciar y reanudar inteligentemente dd_rescue corre para hacerlo más rápido de nuevo.

El resultado final de dd_rhelp Es el máximo de datos recuperados en el tiempo mínimo. Si te vas dd_rhelp corriendo, al final hace exactamente el mismo trabajo que dd al mismo tiempo. Sin embargo, si dd encontró errores de lectura en el byte 100 de su disco de 100 Gb, tendría que esperar mucho tiempo para recuperar los otros 9,999,900 bytes *, mientras que dd_rhelp+dd_rescue Recuperaría la mayor parte de los datos mucho más rápido.


11
2018-05-31 02:12



Alguna ayuda para elegir entre dd_rescue y ddrescue: askubuntu.com/a/211579/50450 - Johann


El disco de origen no debe tener ningún sistema de archivos montado. Como usuario capaz de leer el dispositivo de bloque (funciona la raíz), ejecute 'dd if = / dev / sda ....'

Ahora, una de las mejores cosas aquí es que está creando un flujo de bytes ... y puede hacer mucho con eso: comprímalo, envíelo a través de la red, divídalo en pequeños blobs, etc.

Por ejemplo:

dd if=/dev/sda | ssh user@backupserver "cat > backup.img"

Pero con más fuerza:

dd if=/dev/sda | pv -c | gzip | ssh user@backupserver "split -b 2048m -d - backup-`hostname -s`.img.gz"

Lo anterior copia una imagen comprimida del disco duro de origen a un sistema remoto, donde lo almacena en fragmentos 2G numerados con el nombre del host de origen y le mantiene actualizado sobre el progreso.

Tenga en cuenta que, dependiendo del tamaño del disco, la velocidad de la CPU en el origen, la velocidad de la CPU en el destino, la velocidad de la red, etc. Es posible que desee omitir la compresión, hacer la compresión en el lado remoto o habilitar la compresión de ssh.


7
2018-05-29 19:23



¡Hacer +1 a través de gzip puede ahorrar mucho tiempo y ancho de banda! - M. Dudley
También debo tener en cuenta que agregar 'bs = 1M' al comando dd generalmente mejorará considerablemente la velocidad. - retracile


Para clonar un disco, todo lo que necesita hacer es especificar la entrada y la salida para dd:

dd if=/dev/hdb of=hdb.img

Por supuesto, asegúrese de tener los permisos adecuados para leer directamente de /dev/hdb (Recomiendo correr como root), y eso /dev/hdb no está montado (no desea copiar mientras se cambia el disco). Una vez completado, hdb.img será un clon de byte por byte de todo el disco.

Hay algunos inconvenientes de usar dd para clonar discos. Primero, dd copiará todo el disco, incluso el espacio vacío, y si lo hace en un disco grande puede resultar en un archivo de imagen extremadamente grande. Segundo, dd no proporciona absolutamente ninguna indicación de progreso, lo que puede ser frustrante porque la copia lleva mucho tiempo. En tercer lugar, si copia esta imagen en otras unidades (de nuevo, utilizando dd), deben ser tan grandes o más grandes que el disco original, pero no podrá utilizar ningún espacio adicional que pueda tener en el disco de destino hasta que redimensiona tus particiones.

También puede hacer una copia directa de disco a disco:

dd if=/dev/hdb of=/dev/hdc

pero todavía estás sujeto a las limitaciones anteriores con respecto al espacio libre.

El primer inconveniente se puede resolver mediante la compresión de los datos a medida que realiza la copia. Por ejemplo:

dd if=/dev/hdb | gzip -9 > hdb.img.gz

El segundo inconveniente se puede resolver utilizando la vista de canalización (pv) herramienta. Por ejemplo:

dd if=/dev/hdb | (pv -s `fdisk -l /dev/hdb | grep -o '[0-9]*\{1\} MB' | awk '{print $1}'`m) | cat > hdb.img

No conozco ninguna manera de superar el tercer inconveniente.

Además, puede acelerar el tiempo de copia diciendo dd para trabajar con grandes trozos de datos. Por ejemplo:

dd if=/dev/hdb of=hdb.img bs=1024

6
2018-05-29 22:03



Ya dijiste la forma de superar el tercer inconveniente ... cambiar el tamaño de las particiones. En general, la ampliación de una partición es una operación segura y rápida (en lugar de encogerse o moverse, lo cual es lento y más peligroso ya que está moviendo datos). - davr
gzipping no funcionará con un disco que se haya utilizado durante algún tiempo, ya que se llenará con datos actuales o eliminados. gzip solo funcionará si el espacio vacío está en cero, lo cual es solo el caso con un disco nuevo. - Tozz
@Tozz: puede mejorar la compresibilidad de una imagen del sistema de archivos llenando el sistema de archivos con un archivo lleno de 0, sincronizándolo con el disco y eliminándolo. dd if=/dev/zero bs=1M of=/balloon; sync; rm /balloon  (Módulo de inteligencia extra en la capa del sistema de archivos.) - retracile