it-swarm-es.com

Usando DD para la clonación de disco

Ha habido una serie de preguntas con respecto a las herramientas de clonación de disco y dd se ha sugerido al menos una vez. Ya he considerado usar dd, principalmente porque es fácil de usar, y porque está disponible en casi 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 pueda leer usando dd?

187
falstro

dd es sin duda la mejor herramienta de clonación, creará una réplica 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.

165
Adam Gibbins

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

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

Puede restaurar su 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 ponga a cero todo el espacio restante sin usar, 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 ejecutar un proceso dd 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 los comandos dd BSD difieren en las señales que aceptan (OSX usa SIGINFO - puede presionar Ctrl+T para informar el estado).

119
David Hicks

[~ # ~] precaución [~ # ~] : dd'ing un sistema de archivos en vivo puede dañar los archivos. La razón es simple, no comprende la actividad del sistema de archivos que puede estar sucediendo 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 fatal para las bases de datos. Además, si arruinas los errores tipográficos if y de parámetros ¡Ay de ti! En la mayoría de los casos, rsync es una herramienta igualmente efectiva escrita después del advenimiento de multitarea , y proporcionará vistas consistentes de archivos individuales .

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

39
jldugger

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 complete los sectores faltantes con bytes nulos. Este suele ser el primer paso que tomo si intento recuperarme de un disco defectuoso o defectuoso: obtenga una copia antes de realizar cualquier intento de recuperación y luego realice la recuperación en el disco bueno (clonado). Dejo que la herramienta de recuperación se encargue de los sectores en blanco que no se pudieron 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 otro motivo, por ejemplo, si está escribiendo en una cinta).

26
TimB

Para clonar un disco, todo lo que realmente necesita hacer es especificar la entrada y 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 ejecutar como root), y que/dev/hdb no está montado (no desea copiar mientras se cambia el disco; también es aceptable montarlo como solo lectura). Una vez completado, image.img será un clon byte por byte de todo el disco.

Existen algunos inconvenientes para usar dd para clonar discos. Primero, dd copiará todo su disco, incluso el espacio vacío, y si se 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 cual puede ser frustrante porque la copia lleva mucho tiempo. En tercer lugar, si copia esta imagen en otras unidades (nuevamente, usando dd), deben ser tan grandes o más grandes que el disco original, sin embargo, no podrá usar ningún espacio adicional que pueda tener en el disco de destino hasta que Cambiar el tamaño de sus particiones.

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

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

pero aún está sujeto a las limitaciones anteriores con respecto al espacio libre.

En cuanto a los 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 tratar de copiar la información que pude 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 podía leer, lo que hizo 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 parece como si tuviera esa configuración), así que pasé bastante tiempo especificando manualmente salta y busca saltar las secciones ilegibles.

Pasé algún tiempo investigando soluciones a 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 problema error. En realidad, nunca he usado el programa, pero vale la pena considerarlo, especialmente si el disco desde el que está copiando es antiguo, lo que puede tener sectores defectuosos incluso si el sistema parece estar bien.

17
Kyle Cronin

Si la unidad fuente está dañada, tendrás 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 e intentando e intentando, potencialmente esperando mucho tiempo para que ocurran los tiempos de espera. dd_rescue hace cosas inteligentes como leer hasta un error, luego elegir un lugar más adelante en el disco y leer hacia atrás hasta el último error, y dd_rhelp es básicamente un dd_rescue gestor de sesiones: inicio y reanudación inteligente dd_rescue corre para hacerlo más rápido nuevamente.

El resultado final de dd_rhelp es el máximo de datos recuperados en un 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
Ben Williams

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

Ahora, una de las cosas interesantes aquí es que estás creando una secuencia de bytes ... y puedes hacer mucho con eso: comprimirlo, enviarlo a través de la red, fragmentarlo en bloques más pequeños, etc.

Por ejemplo:

dd if=/dev/sda | ssh [email protected] "cat > backup.img"

Pero más poderosamente:

dd if=/dev/sda | pv -c | gzip | ssh [email protected] "split -b 2048m -d - backup-`hostname -s`.img.gz"

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

Tenga en cuenta que, según el 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 o hacer la compresión en el lado remoto o habilitar la compresión de ssh.

7
retracile

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

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

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

Existen algunos inconvenientes al usar dd para clonar discos. Primero, dd copiará todo su disco, incluso el espacio vacío, y si se 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 (nuevamente, usando dd), deben ser tan grandes o más grandes que el disco original, sin embargo, no podrá usar ningún espacio adicional que pueda tener en el disco de destino hasta que Cambiar el tamaño de sus particiones.

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

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

pero aún está sujeto a las limitaciones anteriores con respecto al espacio libre.

El primer inconveniente puede resolverse comprimiendo los datos mientras realiza la copia. Por ejemplo:

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

El segundo inconveniente se puede resolver utilizando la herramienta pipeview (pv). 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 forma de superar el tercer inconveniente.

Además, puede acelerar el tiempo de copia diciéndole a dd que trabaje con grandes cantidades de datos. Por ejemplo:

dd if=/dev/hdb of=hdb.img bs=1024
6
James Sumners

Otra cosa agradable que puede hacer con dd y los discos de rescate es copiar datos a través de la red:

remote_machine$ nc -l -p 12345

local_machine$ dd if=/dev/sda | nc remote_machine 12345

Puede pegar gzip en ambas canalizaciones si la red no es local. Para progresar, use pv. Para hacer que netcat de local_machine salga después de que se haya copiado, puede agregar -w 5 o algo.

5
user5692

Tenga en cuenta que dd hace un copia exacta, incluido todo el espacio en blanco.

Eso significa:

  1. La segunda unidad debe ser al menos tan grande como la primera
  2. Si la segunda unidad es más grande, se desperdiciará espacio adicional (el sistema de archivos puede expandirse)
  3. Si la unidad de origen no está llena, dd perderá mucho tiempo copiando espacio en blanco.
  4. Puede copiar la unidad completa o una sola partición de esta manera.
  5. Si se trata de una unidad de arranque, estoy bastante seguro de que necesita instalar el gestor de arranque después de usar dd

Espero que sea útil

4
Brent
dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror

Esto copiará el disco y saltará bloques con errores, lo cual es muy importante.

Estas son las opciones básicas y esenciales para usar dd para clonar o rescatar un disco.

No quería publicar otra respuesta, pero no había buenas respuestas con las opciones esenciales "conv = sync, noerror" entre las 25 ya publicadas.

4
Sam Watkins

Podrías probar algo como esto

 dd if =/dev/sda2 of =/dev/sdb2 bs = 4096 conv = sync, noerror 

para omitir todos los errores y tener un clon exacto de una partición o disco duro

3
hirol

Otra gran característica es copiar MBR, tablas de particiones y registros de arranque.

Sólo

dd if=/dev/sda of=parttable bs=512 count=1

y la otra dirección cuando lo estás escribiendo. Pulir con fdisk después.

Te sientes mucho más seguro cuando tienes una copia de seguridad de tu tabla de particiones.

Además, hace que la migración a otro disco duro (mientras cambia la estructura de la partición) sea una alegría.

3
alamar

Para futuras referencias, puede ser interesante consultar ddrescue . Me ha salvado el día un par de veces.

3
Anders Hansson

Este es un truco barato, pero es una forma rápida y sucia de monitorear su proceso DD.

Ejecute su comando dd. Abra un nuevo Shell y haga un ps awx para encontrar el PID de su proceso dd. Ahora en el nuevo Shell tipo watch -n 10 kill -USR1 {pid de su proceso DD}

Esto no hará nada en la ventana de salida del reloj, pero de nuevo en el DD Shell original, DD comenzará a generar informes de estado cada 10 segundos. Puede cambiar el -n 10 en el comando de vigilancia a cualquier otro marco de tiempo, por supuesto.

Taquión

3
Tachyon

La mayor parte de la información se describió en recetas insertadas anteriores, pero no se describió toda.

En Linux, puede clonar el disco duro o la partición mediante el comando dd. Atención, cuando cometas un error, perderás todos tus datos.

Al principio, el destino no debe estar en uso, en segundo lugar, la fuente no debe usarse o volverse a montar en modo de solo lectura. De lo contrario, la copia se dañará. Si es imposible volver a montar, haga una unidad de arranque (hdd/ssd/pendrive) en cualquier distribución en vivo de Linux. Preprecio knoppix, pero esta es tu elección. Si es posible, puede iniciar o cambiar el nivel del sistema a 1, para el modo de usuario único, o puede reiniciar directamente el sistema en modo de usuario único, depende de la distribución. Si va a clonar solo una partición, esta partición debe desmontarse o volverse a montar en RO:

umount /mountpoint_or_device

o

remount -o,ro /mountpoint_or_device

Si desea clonar todo el disco duro, debe desmontar o volver a montar todas las particiones.

Debe identificar el dispositivo de origen y el de destino. mire el dmesg, aquí se almacena toda la información necesaria sobre el dispositivo, con el proveedor, etc. Alternativamente, la identificación puede basarse en el tamaño del dispositivo, si es diferente. A continuación, el destino debe ser igual o mayor que la fuente. debe calcular la fuente, por ejemplo: fdisk -l/dev/sda, excepto la geometría de partición (puede haber GPT), obtendrá: 1. tamaño de disco total con GB y bytes 2. geometría histórica y número de sector total, información muy importante 3. tamaño de bloque en bytes, generalmente es 512.

por ejemplo:

# fdisk -l /dev/sda

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000f1d1e

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    40136703    20067328   83  Linux
/dev/sda2        40138750    41940991      901121    5  Extended
/dev/sda5        40138752    41940991      901120   82  Linux swap /     Solaris

a continuación, intentemos un divisor mayor que 512, tenemos 41943040 sectores físicos:

41943040/256 = 163840, muy bien, podemos hacer copias masivas de 256 sectores. podemos más? intentemos: 41943040/1024 = 40960, creo que esto es suficiente, seleccionaremos este. Vamos a contar el tamaño del grupo de sectores: 512 (tamaño de sector) * 1024 = 524288 bytes eq 512K. Entonces podemos usar el parámetro bs = 512K o menos, pero dividir esto entre 2 ^ x. Para los discos duros modernos con gran caché interna, esto es bastante práctico. para unidades más antiguas con caché mucho más pequeña, un valor de 32K o menos es suficiente.

Luego, después de la preparación, podemos hacer una copia: dd if =/dev/source_devide of =/dev/destination_device bs = 32K y se realizará la copia. Preste atención, cualquier error sobrescribirá sus datos importantes. En el destino, todo se sobrescribirá.

Si intenta rescatar datos en un disco de origen dañado, utilice mejor el tamaño del sector nativo, generalmente esto es 512 bytes, y agregue la opción conv = notrunc. de lo contrario, los huecos en la fuente que caen los sectores defectuosos se unirán al cambio de sector en el destino. Esto dañará la copia con pocas posibilidades de reparación. entonces el comando será:

dd if=/dev/source of=/dev/destination bs=512 conv=notrunc  

y espere mucho tiempo cuando la unidad y el sistema se den por vencidos y caminen sector por sector hasta el final.

dd es una herramienta útil para mover la partición a un nuevo lugar. Simplemente cree una partición, haga dd a una nueva partición (esto puede ser más grande, mucho más grande), y si es posible, expanda el sistema de archivos copiados para llenar toda la nueva partición, ext3/ext4/xfs/zfs/btrfs tienen esta facilidad. Finalmente debe cambiar/etc/fstab, luego desmontar/montar si es posible, o reiniciar el sistema.

Por supuesto, puedes clonar cualquier tipo de partición. El comando dd no analiza el tipo de sistema de archivos, no hace nada con su estructura. entonces este comando puede usarse para clonar NTFS u otros tipos de partición.

Hay algún truco. Cuando no configuró el parámetro, dd pondrá la salida en su stdout. entonces puede hacer una copia sin procesar comprimida del disco o partición, por ejemplo:

dd if=/dev/sda bs=512 | gzip >/any/place/computerOne_sda.gz

Por supuesto, esto debe hacerse sin conexión. puedes restaurar esto:

zcat /any/place/computerOne_sda.gz| dd of=/dev/sda bs=512   

, esta copia de seguridad sobrescribirá todo el disco duro sda y se perderán todos los datos actuales. También puede hacer esto con la partición de Windows NTFS y el disco duro utilizado por este. Por supuesto, puede usar otro comando de compresión, según su elección.

2
Znik

Cómo copiar usando dd (en este caso a una máquina remota, pero el mismo principio se aplica a una copia local) que muestra el progreso.

Funciona almacenando el pid a través del descriptor de archivo 3 en/tmp/pid, que luego se utiliza para los asesinatos posteriores con la señal USR1. Una arruga fue filtrar la salida del progreso en stderr a solo una línea mediante el filtrado de stderr a través de una subshell.

(dd bs=1M if=$lv-snapshot & echo $! >&3 ) 3>/tmp/pid  2> >(grep 'copied' 1>&2) | gzip --fast | ssh $DEST "gzip -d | dd bs=1M of=$lv" &
# Need this sleep to give the above time to run
sleep 1
PID=$(</tmp/pid)

while kill -0 $PID; do
  kill -USR1 $PID
  sleep 5
done
2
Edward Groenendaal

dd proporciona información de progreso, bueno, la mayoría de las versiones en Linux. He visto algunos que no pero no recuerdan el sabor de Unix.

La página de manual dice: Enviar una señal USR1 a un proceso "dd" en ejecución hace que imprima las estadísticas de E/S con un error estándar y luego reanude la copia.

Yo uso esta función regularmente.

2
Steven

Alguien tuvo que decir esto: pruebe Clonezilla (http: // clonezilla.org/)

¿Qué sacas? Para copiar solo partes usadas del sistema de archivos. Clonezilla utiliza dd, grub, sfdisk, parted, partimage, ntfsclone y/o partclone. Dependiendo de las opciones que elija.

Se puede encontrar documentación decente en: http: // clonezilla.org/clonezilla-live/doc/

2
Roflo

Puede crear un archivo de imagen comprimido de la partición (o disco) sobre la marcha usando bzip2 o gzip en lugar de dd. Esto es bueno para almacenar imágenes en medios extraíbles:

bzip2 -c /dev/sdaX >imagefile.bz2
or
gzip -c /dev/sdaX >imagefile.gz

Si el disco se ha usado mucho antes, puede mejorar la compresión al llenar todo el espacio no utilizado con ceros antes de la imagen:

mkdir /mnt/mymountpoint
mount /dev/sdaX /mnt/mymountpoint
cat /dev/zero >/mnt/mymountpoint/dummyfile.bin
(Wait for it to end with a "disk full" error)
rm /mnt/mymountpoint/dummyfile.bin
umount /mnt/mymountpoint

Para restaurar la imagen en otro disco, todo lo que tiene que hacer es:

bzcat imagefile.bz2 >/dev/sdbY
or
zcat imagefile.gz >/dev/sdbY
1
JCCyC

Una cosa que debe tener en cuenta al hacer un disco lleno es que al hacerlo sobrescribirá el registro de arranque maestro del disco receptor. Contiene la tabla de particiones y otra información vital. Si el nuevo disco no es el mismo que el anterior, esto puede crear todo tipo de tablas. Copiar sobre particiones es generalmente más seguro (y las particiones de intercambio no tienen que copiarse)

0
Paul de Vrieze

He estado fuera de la función de administrador durante muchos años, pero sé que 'dd' está a la altura. Usé esta técnica regularmente a fines de los 80 en computadoras Sun Sparc y 386i. Tuve un pedido de un cliente en más de 30 sistemas 386i ejecutando CAD software que se distribuyó en múltiples cintas QIC.

Instalamos en la primera computadora, configuramos la aplicación, ejecutamos el sys-unconfig de SunOS, colocamos la unidad en una caja de zapatos con una dirección SCSI diferente y luego procedimos a 'dd' a las otras 30 unidades.

0
pbrooks100

Solo una advertencia para principiantes que debe decirse: al menos con algunas versiones, bs = X significa que la memoria al tamaño de X se asignará literalmente. bs = 2GB en un sistema con 1GB de RAM y un intercambio insuficiente HARÁ que sucedan cosas malas.

0
rackandboneman

Por alguna razón, dd falla al crear imágenes de CD con pistas de audio. Necesita usar cdrdao o algo similar para obtener un archivo de imagen + TOC.

0
Matt

Para volúmenes NTFS, prefiero usar ntfsclone . Es parte del paquete ntfsprogs .

0
Ed Brannin

Como otros han mencionado anteriormente, una de las trampas con la clonación de un sistema de archivos montado es la corrupción potencial de datos. Obviamente, esto no se aplicará a los clones de la unidad completa, pero si está utilizando LVM, puede tomar una instantánea del volumen lógico y dd de la instantánea para obtener una imagen consistente.

0
Ophidian