Clonar partición completa o disco duro en un archivo disperso


35

Me gusta clonar una partición completa o un disco duro completo en un disco externo más grande, pero me gusta crear un archivo disperso. A menudo lo uso ddpara clonar, pero no admite archivos dispersos. Como solución, usé algo como:

cp --sparse=always <(dd if=/dev/sda1 bs=8M) /mount/external/backup/sda1.raw

Sin embargo, esto es un poco complicado para mi gusto y no me permite reanudar el proceso si lo aborto. Es curioso que exista una herramienta NTFS para esto ( ntfsclone), pero no existe tal herramienta para los sistemas de archivos nativos de Linux (EXT2-4).

¿Existe alguna herramienta mejor para esto, por ejemplo, una ddvariante con escaso soporte? No busco algún software patentado para copias de seguridad de disco, sino que simplemente quiero hacer una copia de clon escasa que pueda montar como dispositivo de bucle si es necesario.


77
+1 para uso creativo de cp, nunca se me ocurrió que podía copiar de forma dispersa una imagen de disco. Siempre los comprimía si necesitaba ahorrar espacio. Ahora, ¿por qué eso en una pregunta no es una respuesta?
Caleb

Respuestas:


21

Que desea dd_rescue.

dd_rescue -a -b 8M /dev/sda1 /mount/external/backup/sda1.raw

1
¡Excelente! El manual dice "Si el proceso de copia es interrumpido por el usuario, es posible continuar en cualquier posición más adelante". y "-a escritura de archivo spArse (predeterminado = no)". Exactamente lo que quiero! ¡Gracias!
Martin Scharrer

3
Al buscar en dd_rescuelínea, descubrí que también hay una herramienta diferente llamada ddrescue(sin el guión bajo) que se desarrolló de forma independiente dd_rescuepero parece hacer básicamente lo mismo. Solo menciono eso aquí como un FYI general.
Martin Scharrer

Sí, dd_rescuey ddrescueno son lo mismo. Teóricamente hacen el mismo trabajo, pero en general he tenido mejor suerte con el anterior / original dd_rescue.
Steven Pritchard

1
En caso de que alguien se pregunte, puede detener la copia en cualquier momento con Ctrl-C. Le mostrará su posición actual, y puede usar ese valor para reiniciar agregando -sy la posición al comando original. (Por lo que parece dd_rescue -a -b 8M -s 42000k /dev/sda1 /mount/external/backup/sda1.raw.)
Steven Pritchard

1
@ Steven Pritchard: No es necesario recordar la posición. Especifique un tercer nombre de archivo, que será el archivo de registro, y al reiniciar lo leerá y continuará donde lo dejó.
Tanith Rosenbaum

20

Solo para completar la llamada a ddrescue . La bandera --sparseo -Spermite que el destino se escriba escasamente:

$ ddrescue -S -b8M /dev/sda1 /mount/external/backup/sda1.raw

O con opción larga:

$ ddrescue --sparse --block-size 8M /dev/sda1 /mount/external/backup/sda1.raw

O si prefieres MiBs :

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw

Para permitir que el rescate se interrumpa y se reanude, también puede utilizar un archivo de registro:

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw ~/sda1.rescue.log

Tenga en cuenta que GNU ddrescuey dd_rescueson programas diferentes. Pero GNU ddrescueparece estar más extendido. Por ejemplo, ya está empaquetado con GRML .


¿Es necesario que haya algún tratamiento especial de la imagen al restaurar, puede proporcionar el comando utilizado para restaurar un ddrescue?
user12439

En teoría, el medio de almacenamiento que está utilizando para el rescate se supone que es más fiable, por lo que puede normalmente sólo tiene que utilizar dd para escribir en el disco de sustitución: dd if=sda1.raw of=/dev/sdb1. Sin embargo, para usar ddrescue para la restauración, simplemente cambie la fuente / destino que utilizó para el rescate a la nueva fuente / destino, preferiblemente con un nuevo archivo de registro. Si es posible (a menudo no), puede usar ddrescue para copiar datos directamente desde el disco fuente defectuoso a un disco de reemplazo.
zaTricky

3

Se ofreció un parche en 2007 para proporcionar compatibilidad con archivos dispersos en GNU dd, pero parece que no se convirtió en coreutils (al menos no a partir de 8.4). Dudo que dd haya cambiado demasiado desde entonces, el parche podría aplicarse a la versión actual sin mucho trabajo.

También estoy realmente impresionado por el uso creativo de cpen su pregunta, y me puso en el camino de usarlo para lograr la reanudación (aquí reanudando desde ~ 80M en la fuente):

cp --sparse=always \
  <(dd if=/dev/sda1 bs=8M skip=10) /dev/stdout \
  | dd bs=8M seek=10 of=/mount/external/backup/sda1.raw

Editar: rasca eso. El segundo dd, por supuesto, sería buscar la posición incorrecta en el archivo de salida, ya que no tiene la misma longitud que la entrada.


1
Como es el caso con la respuesta de bhinesley, sería mejor registrar el progreso de dd para una reanudación precisa. Si tuviera que utilizar este enfoque tanto para la primera ejecución como para los currículums, y registrar ambos dd paralelos de forma independiente, entonces podría saber qué tan lejos en la salida buscar. Si tengo tiempo, intentaré resolver esto.
Eli Heady

2
Gracias por el enlace al parche. Estaba empezando a pensar en programar algo así por mí mismo :-) Los archivos dispersos no se pueden filtrar, por lo que su código no funcionará.
Martin Scharrer

Sí, lo descubrí yo mismo. Bueno, fue divertido encontrar nuevos usos locos de cp¡gracias!
Eli Heady

1
dd commit en 2012: git.savannah.gnu.org/cgit/coreutils.git/commit/… "dd: agrega soporte para la opción conv = sparse" ("(iwrite): Convierte una escritura de un bloque NUL en una búsqueda si se solicita. ")
osgx

1

Solo agrego mis 2 centavos. Otra forma de crear un archivo disperso desde un disco sin formato es con qemu-img usando algo como:

qemu-img convert -f raw /dev/sda /tmp/sda.raw

Puede usar esto en una sola partición también. Además, tiene la opción de convertir el disco / partición sin formato a cualquier otro formato que admita qemu-img (QCOW2, VHD [x], vmdk, etc.)


1

Otra opción es rsync . Por ejemplo:

rsync -SP --copy-devices /dev/sda1 /mount/external/backup/sda1.raw

Explicación:

  • -S/ --sparsepara omitir bloques dispersos en escritura
  • -P/ --partial --progresspara mostrar el progreso y mantener archivos parcialmente transferidos
  • --copy-devices copiar el contenido del dispositivo

Puede agregar --appendpara reanudar una copia interrumpida (o --append-verifypara confirmar la suma de verificación sobre coincidencias de datos nuevas y antiguas).

Editar : Acabo de darme cuenta de que copy-devices.diff está bajo consideración y puede no estar presente en muchos sistemas (aunque está incluido en Fedora , Ubuntu , Debian y otros)


0

Nota: esto no funciona por las razones descritas en los comentarios, lo dejo aquí como referencia.

Monitoree las estadísticas de dd usando kill -USR1:

$ cp --sparse=always <(dd if=/dev/urandom bs=8M) \
    /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

Reanude usando skip / seek:

$ i_bytes= # get from the last dd statistic
$ o_bytes=`du -b /mount/external/backup/sda1.raw | cut -f 1`   
$ cp --sparse=always <(dd if=/dev/urandom bs=8M skip=$i_bytes \
    seek=$o_bytes) /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

Sin $ i_bytes sería más difícil reanudar. Probablemente sea más fácil registrar las estadísticas de dd en un archivo en caso de que la máquina falle o lo que sea.


El segundo cpsimplemente sobrescribirá el archivo existente, ¿no? Conozco las skipy otras opciones de dd. El problema es la cpparte.
Martin Scharrer

Hm, sí, tienes razón.
bhinesley


0

Por qué no simplemente:

cp --sparse=always /dev/sda1 /mount/external/backup/sda1.raw
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.