¿Es posible montar una imagen dd comprimida gzip sobre la marcha?


66

Me gusta crear una copia de seguridad de la imagen por primera vez que estoy haciendo una copia de seguridad de un sistema. Después de esta primera vez, uso rsync para hacer copias de seguridad incrementales.

Mi copia de seguridad de imagen habitual es la siguiente:

Montar y poner a cero el espacio vacío:

dd if=/dev/zero of=temp.dd bs=1M

rm temp.dd

desmontar y dd el disco mientras lo comprime

dd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.ddimg.gz

para que el sistema vuelva a la normalidad, generalmente haré un

gunzip -c /mnt/sda1/hda.img.gz | dd of=/dev/hda conv=sync,noerror bs=64K

Esto es realmente sencillo y me permite guardar el 'disco completo' pero realmente solo ahorrar el espacio utilizado.

Aquí está el problema. Digamos que hago lo anterior pero no en un sistema limpio y no obtengo las copias de seguridad de rsync lo suficientemente pronto y hay archivos a los que quiero acceder que están en la imagen. Digamos que no tengo el espacio de almacenamiento para descomprimir y dd la imagen en una unidad, pero quiero montar la imagen para sacar archivos individuales de ella ... ¿Es esto posible?

Normalmente, uno no comprimiría la imagen dd, lo que le permitirá simplemente montar la imagen usando -o loop... pero este no es mi caso ...

¿Alguna sugerencia para montar el img comprimido sobre la marcha?

¿ Usaría AVFS para 'montar' el archivo gz y luego montar el dd.img interno (no lo creo ... pero necesitaría verificación ...)?


Deberías usar SquashFSpara este tipo de cosas. También elimina los archivos duplicados.
Avio

Parece que este tipo está haciendo lo que le preguntas: blogs.gnome.org/muelli/2012/10/…
Joshua

Secundo la sugerencia de Avio. Lo único que squashfs no archiva es acls. Archiva xattrs, atributos de selinux, etc. Si no usa acls, entonces squashfs es el camino a seguir en mi humilde opinión. Recientemente tuve que archivar "por si acaso" algunas unidades antiguas que ya se han migrado a un nuevo almacenamiento, y squashfs fue perfecto para el trabajo.
Kuba Ober

Respuestas:


66

Depende de si la imagen del disco es una imagen de disco completa o solo una partición.

Lavando la (s) partición (es)

Si el disco está en buenas condiciones de funcionamiento, obtendrá una mejor compresión si lava el espacio vacío del disco con ceros. Si el disco falla, omita este paso.

Si está creando imágenes de un disco completo, entonces querrá lavar cada una de las particiones en el disco.

PRECAUCIÓN: ¡ Tenga cuidado, desea establecer ofun archivo en la partición montada, NO LA PARTICIÓN MISMA!

mkdir image_source
sudo mount /dev/sda1 image_source
dd if=/dev/zero of=image_source/wash.tmp bs=4M
rm image_source/wash.tmp
sudo umount image_source

Hacer una imagen de partición

mkdir image
sudo dd if=/dev/sda1 of=image/sda1_backup.img bs=4M

¿Dónde sdaestá el nombre del dispositivo y 1el número de partición? Ajuste en consecuencia para su sistema si desea crear una imagen de un dispositivo o partición diferente.

Hacer una imagen de disco completa

mkdir image
sudo dd if=/dev/sda of=image/sda_backup.img bs=4M

¿Dónde sdaestá el nombre del dispositivo? Ajuste en consecuencia para su sistema si desea crear una imagen de un dispositivo diferente.

Compresión

Haga una imagen "squashfs" que contenga la imagen completa sin comprimir.

sudo apt-get install squashfs-tools
mksquashfs image squash.img

Compresión Streaming

Para evitar que un archivo temporal separado tenga el tamaño completo del disco, puede transmitirlo a una imagen de squashfs.

mkdir empty-dir
mksquashfs empty-dir squash.img -p 'sda_backup.img f 444 root root dd if=/dev/sda bs=4M'

Montaje de una imagen de partición comprimida

Primero monte la imagen de squashfs, luego monte la imagen de partición almacenada en la imagen de squashfs montada.

mkdir squash_mount
sudo mount squash.img squash_mount

Ahora que tiene la imagen comprimida montada, monte la imagen misma (que está dentro de la imagen de squashfs)

mkdir compressed_image
sudo mount squash_mount/sda1_backup.img compressed_image

Ahora su imagen está montada debajo compressed_image.

EDITAR: si simplemente desea restaurar la imagen del disco en una partición en este punto (en lugar de montarla para examinar / leer el contenido), solo ddla imagen en squash_mount/sda1_backup.imgel destino en lugar de hacerlo mount.

Montaje de una imagen de disco completo comprimido

Esto requiere que use un paquete llamado kpartx. kpartx le permite montar particiones individuales en una imagen de disco completa.

sudo apt-get install kpartx

Primero, monte su partición aplastada que contiene la imagen de disco completa

mkdir compressed_image
sudo mount squash.img compressed_image

Ahora necesita crear dispositivos para cada una de las particiones en la imagen de disco completa:

sudo kpartx -a compressed_image/sda_backup.img

Esto creará dispositivos para las particiones en la imagen de disco completa en /dev/mapper/loopNpPdonde N es el número asignado para el dispositivo de bucle invertido y P es el número de partición. Por ejemplo: /dev/mapper/loop0p1.

Ahora tiene una manera de montar las particiones individuales en la imagen de disco completa:

mkdir fulldisk_part1
sudo mount /dev/mapper/loop0p1 fulldisk_part1

toma interesante de este problema (squashfs en lugar de gzip). No estoy muy familiarizado con las herramientas de squashfs ... ¿puede canalizar la salida de dd para crear una partición de squash sobre la marcha como puede hacerlo con la partición gzip? ¿Cuál es la relación de compresión (gzip está bien / bien, especialmente dado el hecho de que estoy limpiando 'espacio vacío con ceros')?
g19fanatic

¿Cómo devolverías la imagen al disco duro?
g19fanatic

2
@ g19fanatic La imagen de disco sin comprimir está "dentro" de la imagen de squashfs. Montas la imagen de squashfs, luego dd la imagen dentro del disco de destino.
doug65536

@ g19fanatic La compresión fue excelente (muy similar a gzip en mi caso). mksquashfs también fue rápido, está paralelo. En mi 990x (6 núcleos) en realidad estaba limitado por la velocidad de escritura del disco de destino, alrededor de 100 MB / seg.
doug65536

3
@ g19fanatic Puede transmitir a squashfs usando las banderas -po -pfpara pasarle un pseudo-archivo. Un pseudo archivo se puede usar para cosas como hacer nodos de dispositivos que de otra manera no se pueden hacer sin root (útil para construir imágenes como parte de un proceso de construcción) o para transmitir la salida de algún comando a la imagen. Uno de los ejemplos dados en los documentos ( /usr/share/doc/squashfs-tools/examples/pseudo-file.exampleen Debian / Ubuntu) es input f 444 root root dd if=/dev/sda1 bs=1024 count=10copiar los primeros 10K de una imagen de disco en un archivo llamado "input" en la imagen de squashfs.
Brian Campbell

15

Si la imagen es de solo lectura, también puede usar nbdkit ( página de manual ) y su complemento xz (xz debería proporcionar una mejor compresión y tiempos de acceso aleatorio que gzip).

Crear la imagen de partición comprimida

dd if=/dev/sda1 bs=16M | xz -9 --block-size=16MiB - > sda1.img.xz

Una --block-sizeopción de 16 MiB debería proporcionar un buen rendimiento de acceso aleatorio.

Nota: puede usar programas de compresión xz alternativos como pixz que proporciona compresión paralela, solo asegúrese de que divide la salida en múltiples bloques pequeños, de lo contrario nbdkit tiene que descomprimir una gran cantidad de datos. Por ejemplo, a partir de septiembre de 2015, pxz no es compatible con esto.

Servir con nbdkit

nbdkit --no-fork --user nobody --group nobody -i 127.0.0.1 \
       xz file=sda1.img.xz

Conéctese al servidor NBD

nbd-client 127.0.0.1 10809 /dev/nbd0 -nofork

Montarlo solo lectura

mount -o ro /dev/nbd0 sda1

Cuando termine

umount /dev/nbd0
nbd-client -d /dev/nbd0

Detenga nbdkit presionando Ctrl+ C(o con kill ).


15

Tratar archivemount

root@srv1:/backup# archivemount windows-2003-S.gz /target/
Unrecognized archive format
root@srv1:/backup# archivemount -o formatraw windows-2003-S.gz /target/
Calculating uncompressed file size. Please wait.
root@srv1:/backup# ls /target/
data
root@srv1:/backup# file /target/data
/target/data: DOS/MBR boot sector; partition 1 : ID=0x7, start-CHS (0x0,1,1), end-CHS (0x3ff,254,63), startsector 63, 58717512 sectors, extended partition table (last)

archivemount es un sistema de archivos basado en FUSE para variantes de Unix, incluido Linux. Su propósito es montar archivos (es decir, tar, tar.gz, etc.) en un punto de montaje donde se pueda leer o escribir como con cualquier otro sistema de archivos. Esto hace que el acceso al contenido del archivo, que puede estar comprimido, sea transparente para otros programas, sin descomprimirlos.

http://linuxaria.com/howto/how-to-mounts-an-archive-for-access-as-a-file-system

Después de montar el archivo, puede usarlo como archivo normal. Tal vez obtenga una tabla de particiones, o convierta, monte la imagen con las herramientas qemu.

Squashfs útil para arrancar desde la imagen, pero muy complejo para la copia de seguridad.


¡Perfecto! Esta es la solución más fácil y elegante hasta ahora. Me pregunto por qué no hay votos aquí.
TranslucentCloud

Creo que es porque si monta un archivo como disk.img.gz en una carpeta con archivemount, digamos / mnt /, obtendría un solo archivo /mnt/disk.img, que luego tendrá que montar en otro lugar. En cambio, la pregunta quiere algo capaz de desenvolver ambos en un solo paso (y archivemount parece capaz de hacerlo en .tar.gz, pero no en imágenes en bruto comprimidas).
p91paul

2
Esta respuesta también es muy interesante. Creo que los squashfs reciben más amor porque tienen más conciencia. Reconocí el nombre al instante, pero nunca he oído hablar de archivemount. ¡También tendré que intentarlo!
g19fanatic

2
archivemount no permite montar una imagen creada por comandodd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.ddimg.gz
Sergei

3
De acuerdo: al momento de escribir, archivemount admite archivos tar que están comprimidos, pero no archivos comprimidos.
mwfearnley

10

Esta respuesta complementa la respuesta de Cristian Ciupitu . Si utiliza la compresión xz con un tamaño de bloque razonable, puede acceder a la imagen del disco utilizando guestfish u otras herramientas libguestfs como esta:

nbdkit xz file=disk.img.xz --run 'guestfish --format=raw -a $nbd -i'

8

Realmente no. Realmente no puede buscar un bloque específico en el archivo comprimido sin descomprimir todo primero, lo que dificulta el uso de la imagen comprimida como un dispositivo de bloque.

Puede usar algo como dumpy restore(o tar, realmente), todos los cuales usan un formato de transmisión ... para que pueda acceder a archivos individuales escaneando de manera efectiva a través de la secuencia sin comprimir. Significa que si el archivo que desea está al final del archivo comprimido, puede tener que esperar mucho tiempo, pero no requiere que descomprima todo en el disco.

El uso tarpara copias de seguridad puede parecer un poco anticuado, pero obtienes mucha flexibilidad.


1
El problema radica en el hecho de que ni siquiera sé si el archivo de interés está realmente en esta copia de seguridad comprimida ... ¿Conoces un explorador de archivos que recorra toda la imagen .gz'd, mantén el archivo / dir estructura en la memoria, proporciona una vista simple de la estructura y le permite 'seleccionar' archivos (ahora que sabe dónde existen) para extraer? Es una especificación muy específica ... pero podría ver toneladas de usos para algo como esto ... si existe.
g19fanatic

1
Si no es así, ¿podría indicarme algunas instrucciones sobre cómo extraer la estructura de la imagen gz'd? Podría crear un programa de este tipo (programa para ganarse la vida ...) pero soy ciego sobre el tema de descomprimir datos de imágenes y los detalles de diferentes sistemas de archivos.
g19fanatic

Sospecho que construir tu propia herramienta será un proyecto más grande de lo que realmente quieres emprender. Sin embargo ... suponiendo que tenga un sistema de archivos ext [234], sugeriría el paquete e2fsprogs , o tal vez algo como fuse-ext2 . Ambos proporcionan herramientas de espacio de usuario para interactuar con los sistemas de archivos ext [234].
larsks

También tenga en cuenta que lo que tiene no parece ser una imagen del sistema de archivos, es una imagen de disco completa, lo que significa que primero tendrá que analizar la tabla de particiones y localizar la partición adecuada.
larsks

Escribí mal la pregunta anterior y lo solucionaré. Normalmente hago una imagen dd basada en particiones y guardo una copia de la tabla de particiones. Solía ​​hacer copias de disco completas, pero odiaba tener que montar con opciones para llegar a la ubicación adecuada.
g19fanatic

3

Otra adición a la respuesta de Cristian Ciupitu :

Si utiliza nbdkitpara montar una imagen de disco completa (frente a una imagen de partición), es posible que deba especificar el tamaño de bloque (tamaño de sector del disco) cuando se conecta al servidor NBD, ya que el valor predeterminado es 1024bytes. Para usar 512bytes en su lugar:

nbd-client 127.0.0.1 /dev/nbd0 -b 512 -n

Después de eso, el disco aparecerá como /dev/nbd0, y debería poder ver la tabla de particiones usando fdisk -l. Sin embargo, las particiones aún no se pueden montar: use kpartx(de la respuesta de doug65536 ) para crear dispositivos para las particiones, por ejemplo:

kpartx -arv /dev/nbd0

Finalmente, aparecerán las particiones /dev/mapper/y puede montarlas como de costumbre. Asegúrese de usar el modo de solo lectura ( -o ro), ya que el complemento xz solo admite lecturas:

mount -o ro /dev/mapper/nbd0p3 /mnt
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.