Usando DD para clonar discos

182

Ha habido una serie de preguntas con respecto a las herramientas de clonación de disco y ddse ha sugerido al menos una vez. Ya he considerado ddusarme, 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 ddpara 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 dd?

falstro
fuente
Soy consciente de cómo funciona dd, mi pregunta estaba más en la dirección de cualquier problema conocido relacionado con dd cuando clonaba discos (como se describe en el enlace), tal vez esto no estaba muy claro. Lo que su respuesta contiene y la tuya no es "Nunca he tenido ningún problema con ella". También voté tu respuesta, ya que definitivamente presentaste algunos puntos interesantes (me gusta el que indica que no hay progreso).
falstro
1
Parece que tienes el Spolsky Bump: joelonsoftware.com/items/2009/05/29.html
Kyle Cronin
no vi esto aquí cuando pregunté (y respondí) una pregunta similar sobre superusuario - superuser.com/questions/11453/…
warren
3
Es irónico que Joel se vinculó a 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 las ddopciones correctas para omitir bloques defectuosos, lo cual 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 del disco y la restauración se realiza en discos duros no idénticos. Experimenté algunas fallas en dd restore, y creo que este fue el problema en mi caso.
Marco

Respuestas:

160

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.

Adam Gibbins
fuente
12
Por supuesto, siempre y cuando / dev / sdb sea al menos tan grande como / dev / sda ...
Eddie
22
agregue un "bs = 100M conv = notrunc" y es mucho más rápido en mi experiencia.
Tim Williscroft
127
solo tenga mucho cuidado con las letras 'i' y 'o' ... ''
dijo
17
Nadie parece saber este truco ... dd es un programa de copia asimétrica, lo que significa que primero leerá, luego escribirá y luego regresará. Puede dd tubería a sí mismo y obligarlo a realizar la copia simétrica, como esto: 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, obtuve ~ 235kb / s. Nunca he tenido ningún problema con este método. ¡Buena suerte!
Mistiry
13
@Mistiry, ese no es el significado de la palabra simétrica.
psusi
113

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 de 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 BSD. Los comandos dd difieren en las señales que aceptan (OSX usa SIGINFO: puede presionar Ctrl+ Tpara informar el estado).

David Hicks
fuente
2
¿Esto también funciona con fs "modernos" como BTRFS, NILFS, [lo que sea que puedas soñar]?
Steve Schnepp
DD funciona en dispositivos de bloque, un nivel de abstracción inferior al sistema de archivos, por lo que debería, sí. Sin embargo, no lo he probado. Hmm, NILFS parece interesante, tendré que echarle un vistazo.
David Hicks
44
+1 para el kill -SIGUSR1 %1, y el comando dd OSX acepta felizmente SIGUSR1 ... super útil, ¡gracias!
stuartc
1
+1 porque Kill -SIGUSR1 1234estaba buscando eso.
hot2use
2
¿Debería ser dd if=/dev/hdb | gzip -c > /image.img.gz:?
Mike Causer
37

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. Por otra parte, si la cagas el error tipográfico propensas si y de los parámetros, ¡ay de vosotros. En la mayoría de los casos, rsync es una herramienta igualmente efectiva escrita después del advenimiento de la 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.

jldugger
fuente
77
Sospecho que esa syncno es la respuesta a los problemas de corrupción de archivos. ¿Qué sucede si un demonio o algo escribe más archivos después de sync, durante la ddoperación?
Borrado el
55
Es una buena idea desmontar la unidad primero (o volver a montarla como solo lectura), pero no siempre es posible
Alex Bolotov el
1
En ese caso, use rsync y deje que haga magia de manejo de archivos para obtener un archivo consistente y deje que la semántica Copiar en escritura maneje las escrituras entrantes.
jldugger
44
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 conocido.
3molo
1
El uso rsyncgarantizará que los datos internos en el sistema de archivos de destino sean consistentes. Que no va a asegurar que los datos en los archivos es consistente - de hacer eso, usted tendría que bloquear los archivos y los programas que se escriben en los archivos tendría que respetar estos bloqueos.
Martin Geisler
26

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).

TimB
fuente
13
Si tiene un disco con sectores defectuosos, realmente debería 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
3
no debe usar un tamaño de bloque grande si intenta omitir bloques defectuosos, o se saltará demasiado. 4096 es lo suficientemente grande.
Sam Watkins el
17

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 (recomiendo que se ejecute como root) y que / dev / hdb no esté montado (no desea copiar mientras el disco está ser cambiado - montaje como solo lectura también es aceptable). 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. 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 (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 que tiene esa configuración), así que pasé bastante tiempo especificando manualmente omitir y tratar de saltar el secciones ilegibles.

Pasé un 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 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.

Kyle Cronin
fuente
77
... dd no proporciona absolutamente ninguna indicación de progreso ... - bueno, esto no es cierto - hay una manera un poco complicada de cómo mostrar el progreso - tienes que encontrar el proceso pid del dd ('ps -a | grep dd') y luego envíe 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
44
"varios sectores en el disco que dd no pudo leer": creo que eso conv=sync,noerrorayudaría.
Gauthier
2
Las conv=sync,noerroropciones son esenciales, permiten que dd omita los bloques defectuosos y los ponga a cero en la imagen para que las cosas estén alineadas correctamente. Apoyos para las pocas personas que comentaron algo al respecto.
Sam Watkins el
1
GNU ddrescueproporciona un indicador de progreso sin ninguna opción especial, y puede detener la copia y reanudar donde la dejó.
endolito
2
Una forma menos complicada de progresar con dd es agregar la opciónstatus=progress
James
11

Si la unidad de origen se daña en absoluto, usted tendrá más suerte usando dd_rhelpcon dd_rescue(mi preferencia personal) o GNU ddrescue.

La razón detrás de esto es que, en los errores de lectura, ddsigue intentando y tratando y probando, potencialmente esperando mucho tiempo para que ocurran los tiempos de espera. dd_rescuehace 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_rhelpes básicamente un dd_rescueadministrador de sesión: comienza y reanuda las dd_rescueejecuciones de manera inteligente para hacerlo más rápido nuevamente.

El resultado final de dd_rhelpes el máximo de datos recuperados en un tiempo mínimo. Si deja de dd_rhelpcorrer, al final hace exactamente el mismo trabajo que ddal mismo tiempo. Sin embargo, si ddencuentra 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_rescuerecuperaría la mayor parte de los datos mucho más rápido.

Ben Williams
fuente
1
Ayuda para elegir entre dd_rescue y ddrescue: askubuntu.com/a/211579/50450
Johann
7

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 user@backupserver "cat > backup.img"

Pero más poderosamente:

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 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, dependiendo del tamaño del disco, la velocidad de la CPU en la fuente, la velocidad de la CPU en el destino, la velocidad de la red, etc.

retroceder
fuente
¡Hacer +1 en 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á enormemente la velocidad.
retroceder
6

Para clonar un disco, todo lo que realmente 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 /dev/hdb(recomiendo que se ejecute como root), y que /dev/hdbno esté montado (no desea copiar mientras se cambia el disco). Una vez completado, hdb.imgserá un clon byte por byte de todo el disco.

Hay algunos inconvenientes para usar ddpara clonar discos. Primero, ddcopiará 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, no ddproporciona 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 pvherramienta pipeview ( ). 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 ddque trabaje con grandes cantidades de datos. Por ejemplo:

dd if=/dev/hdb of=hdb.img bs=1024
James Sumners
fuente
1
Ya le dijo a la manera de superar el tercer inconveniente ... cambiar el tamaño de las particiones. Ampliar una partición es generalmente una operación segura y rápida (en lugar de reducir o mover, lo que es lento y más peligroso ya que está moviendo datos).
davr
gzipping no funcionará con un disco que se haya usado durante algún tiempo, ya que se rellenará con datos actuales o eliminados. gzip solo funcionará si el espacio vacío se pone a cero, que es solo el caso con un disco nuevo.
Tozz
3
@Tozz: puede mejorar la compresibilidad de una imagen del sistema de archivos llenando el sistema de archivos con un archivo lleno de ceros, sincronizándolo con el disco y luego eliminándolo. dd if=/dev/zero bs=1M of=/balloon; sync; rm /balloon (Inteligencia de módulo adicional en la capa de sistema de archivos.)
retracile
5

Otra cosa buena 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 el progreso, use pv. Para hacer que netcat de local_machine salga después de que haya terminado de copiar, puede agregar -w 5o algo.

usuario5692
fuente
99
Esto no es muy correcto. El comando 'remote_machine' falta algo, como > disk_backup.imgo |dd of=/dev/sdb, o algo más, dependiendo de lo que quiere hacer. Supongo que no quieres volcar una imagen de disco en stdout.
davr
1
Y agregue gzip en ambos extremos para minimizar aún más los datos enviados.
3molo
4

Tenga en cuenta que dd realiza una 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 se puede ampliar)
  3. Si la unidad de origen no está llena, dd perderá mucho tiempo copiando espacio en blanco.
  4. Puede copiar toda la unidad 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

Brent
fuente
8
Si está clonando todo el disco duro, también está clonando el cargador de arranque.
Cristian Ciupitu
bueno, solo un poco, pero ¿no podrías usar gparted para resistir la partición / disco que se está copiando a lo que sea que se use y luego soltar dd? Suponiendo que es una imagen única, debería mitigar este problema.
bbqchickenrobot
3

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

Anders Hansson
fuente
3

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 fdiskdespué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.

alamar
fuente
3

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 tipo de shell watch -n 10 kill -USR1 {pid de tu proceso DD}

Esto no hará nada en la ventana de salida del reloj, pero de nuevo en el shell DD 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


fuente
OS X no tiene watchdisponible y -USR1mata a dd. Sin embargo, el siguiente comando funciona: while [ true ]; do killall -INFO dd; sleep 30; done
Adam Franco
No creo que esto sea muy práctico para un novato, puede que se les sirva mejor con el pvcomando.
Robbie Mckennie
Descubrí que también puedes enviar un SIGINFO usando CTRL-T en dd. Es más fácil que el bucle while y el CD OSX 10.6 que tengo no tiene killall. Aprendí esto de en.wikipedia.org/wiki/Unix_signal#Sending_signals
Citizen Kepler
3
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.

Sam Watkins
fuente
1
En realidad se mencionó antes, en una respuesta y al menos dos comentarios.
Michael Hampton
1
@Michael, la respuesta que vinculó no contiene un comando de ejemplo completo y tiene otras fallas: no es una buena idea usar un tamaño de bloque grande, conv=sync,noerrorya que omitirá demasiados datos para cada bloque defectuoso. Estas opciones son esenciales para la "clonación de recuperación", y no es bueno tener que buscar los comentarios. La respuesta más popular es adecuada si los discos no tienen bloques defectuosos, por ejemplo, para clonar un disco prístino, pero no para la recuperación.
Sam Watkins el
@Michael el ejemplo que di es un comando que he usado varias veces para la recuperación profesional de discos. Si bien hay otras herramientas que podrían hacer un trabajo un poco mejor, el ejemplo que di es mejor para la clonación de recuperación de disco que cualquier otro ddejemplo aquí, a la vez que es adecuado para clonar un disco libre de errores. Por lo tanto, considero que mi respuesta es la mejor aquí sobre cómo "usar DD para la clonación de disco". No agregué información sobre el monitoreo del progreso, la compresión, etc., porque quería mantenerlo simple y centrarme en proporcionar una respuesta breve que comprenda los conceptos básicos.
Sam Watkins el
3

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

Sam Watkins
fuente
Debe ser conv = sync, noerror Se necesita la opción de sincronización o de lo contrario los bloques con errores se eliminarán en lugar de copiarse como ceros.
Sam Watkins el
2

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 a un error estándar y luego reanude la copia.

Yo uso esta característica regularmente.

Steven
fuente
Si bien es útil, dudo de su practicidad para un principiante.
Robbie Mckennie
2

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/


fuente
Encontré la documentación un poco peligrosa, y clonar una unidad PATA de Linux en una unidad SATA no me dejó con algo que pudiera arrancar (todavía). Pero mucho más rápido que el mismo resultado que dd, y funcionó muy bien para las actualizaciones de mi unidad portátil.
jbdavid
2

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
Edward Groenendaal
fuente
No es realmente relevante para la pregunta, pero es un truco de shell ordenado que usa un sub-shell y descriptores de archivo altos (más altos que stderr) para transmitir datos, +1
falstro
Me refería a esta página para diferentes opciones de dd cuando clonaba discos, por lo que parecía un lugar adecuado en ese momento para poner el resultado final de lo que usé para la clonación, especialmente porque pensé que era bastante ordenado :)
Edward Groenendaal
2

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 clona 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 total del disco wigh 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.

Znik
fuente
1

Puede crear un archivo de imagen comprimido de la partición (o disco) sobre la marcha usando bzip2o en gziplugar 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
JCCyC
fuente
Votaron por el truco para llenar el espacio restante con ceros. ¡Inteligente!
Confusión
¡Esto, lo necesitaba! La tarjeta SD se usaba anteriormente para la captura de video y estaba llena de basura, la compresión no ayudó en absoluto.
Cody Smith
0

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.

Mate
fuente
0

Una nota sobre la velocidad: en mi experiencia, dd es el doble de rápido si especifica bs = 1024 en lugar del valor predeterminado bs = 512. El uso de un tamaño de bloque aún mayor no proporciona una aceleración notable sobre bs = 1024.


fuente
44
los clústeres de disco son generalmente alrededor de 4k ahora, por lo que usar 4096 es probablemente una buena opción, e incluso 8192 si desea leer 2 clústeres a la vez. Sin embargo, no vaya demasiado grande, ya que se encuentra con problemas de memoria fragmentados
usuario 4767
0

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)

Paul de Vrieze
fuente
0

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 finales de los 80 en computadoras Sun Sparc y 386i. Tuve un pedido de un cliente en más de 30 sistemas 386i con software CAD que se distribuyó en múltiples cintas QIC.

Instalamos en la primera computadora, configuramos la aplicación, ejecutamos 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.

pbrooks100
fuente
0

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.

Ofidiana
fuente
0

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

rackandboneman
fuente