¿Cómo montar una imagen de disco comprimido?

12

Si hago una imagen de disco y la comprimo con gzip / xz / etc, ¿hay alguna forma de montarla directamente sin descomprimirla primero?

Digamos que he usado

sudo dd if=/dev/sdc1 | gzip -9 > image1.dd.gz

¿Cómo puedo montar la imagen original, sin crear primero una copia sin comprimir?

O he usado

sudo dd if=/dev/sdc | gzip -9 > wholedisk.dd.gz

y el disco tiene múltiples particiones, ¿eso lo haría más difícil?

Con una imagen descomprimida de un disco completo, el uso de kpartxversiones más recientes o losetupcon su -Pbandera debería crear un bucle para cada partición.

Pero, ¿hay alguna forma de montar / configurar / leer la imagen comprimida?

Si no funciona para gzip / xz, ¿hay algún método de compresión para el que funcione?


Nota sobre Q duplicada

El duplicado sugerido actualmente

NO UTILIZA COMPRESIÓN , Y NO ES UN DUPLICADO .

mount no montará una imagen comprimida por sí misma.

Xen2050
fuente
Puedo decirte que definitivamente es posible. Pero no puedo decirte cómo atm porque las instrucciones están en 2 discos duros externos y en este momento no tengo acceso a ninguno pero quiero hacerle saber que funciona. Volveré con una respuesta cuando tenga una (y nadie más publicó una hasta entonces).
UTF-8
1
@ UTF-8 Eso es alentador, gracias. Para su información, el objetivo original es hacer una copia de seguridad más pequeña de una unidad / partición que está casi vacía o tiene muchos datos fácilmente comprimibles, y poder leerla sin escribir MUCHOS datos adicionales o necesitar una tonelada de espacio libre para extraerla
Xen2050
Ver también major.io/2010/12/14/…
Panther
2
@ bodhi.zazen Perdón? Tal vez debería aclarar, mount no descomprime automáticamente las imágenes, por lo que esta Q no es un duplicado de askubuntu.com/questions/69363 (tal vez me perdí el chiste, espero que descomprimir no sea la única respuesta :)
Xen2050

Respuestas:

10

Puede usar squashfspara comprimir imágenes de disco y luego montarlas.

Crea la imagen de disco

Si aún no tiene una imagen de disco, úsela ddpara crear una:

dd if=/dev/sda1 of=/tmp/sda1.img bs=4M

Comprime la imagen con squashfs

Instalar squashfs:

apt-get install squashfs-tools

Comprime la imagen:

mksquashfs /tmp/sda1.img /tmp/sda1.squash.img

O transmita la compresión (no necesita un archivo dd temporal)

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

Felicitaciones a terminator14 en UbuntuForums.org . Definiciones / Explicaciones:

  • empty-dir- "fuente" dir. Básicamente en nuestro caso, solo un directorio vacío para satisfacer el formato arg de entrada de mksquashfs
  • squash.img - el destino y el nombre del archivo squashfs de salida
  • sda_backup.img - el nombre de la copia de seguridad dd DENTRO del archivo squashfs
  • f - especifica que sda_backup.img es un archivo normal (a diferencia de un directorio, dispositivo de bloque o dispositivo char)
  • 444 - permisos del archivo sda_backup.img dentro de la imagen squashfs
  • root root- UID y GID para el archivo sda_backup.img dentro de la imagen de squashfs. Se puede especificar por números decimales o por nombre
  • dd if=/dev/sda bs=4M - el comando dd utilizado para leer el dispositivo que queremos respaldar

Monta la imagen

Primero monte la squashfsimagen:

mkdir /mnt/squash
mount /tmp/sda1.squash.img /mnt/squash

Esto presentará la imagen de disco sin comprimir para que la monte:

mkdir /mnt/sda1
mount /mnt/squash/sda1.img /mnt/sda1

O si se trata de una imagen de unidad completa (particionada) que puede usar losetuppara adjuntar la imagen dd a un dispositivo de bucle (posiblemente opcional) y luego kpartx -ao partprobepara buscar y separar las particiones en dispositivos separados, o incluso vgscan/ vgchange -aysi hay LVM.

Eborbob
fuente
2
Agregué información sobre squashfs sobre la marcha, para evitar la necesidad de un archivo dd plano temporal. Gran respuesta con squashfs, simplemente no es compatible con los formatos xz / gz más amigables para las tuberías
Xen2050
¿Funcionaría de alguna manera con una imagen de disco completa que también contiene múltiples particiones?
friederbluemle
Vea aquí el disco completo: unix.stackexchange.com/questions/31669/…
HackerBoss
Dependiendo del tipo de sistema de archivos, el montaje puede requerir las siguientes ro,noloadopciones:mount -o ro,noload /mnt/squash/sda1.img /mnt/sda1
HackerBoss
7

Pude conseguir que un servidor NBD "sirviera" una versión sin comprimir de un archivo .gz o .xz. No estoy seguro de si tiene que leer todo el archivo comprimido con mucha frecuencia (solo probado hasta ahora con archivos pequeños en RAM), pero al menos funciona sin tener que extraer una copia completa sin comprimir.

Visualización de una imagen dd comprimida gz / xz "sobre la marcha"

  1. Instalar nbdkit y cliente

    apt install nbdkit nbd-client
    
  2. Crear un archivo de estilo "dd" de demostración: un archivo vacío de 50M con un sistema de archivos ext y comprimirlo (Opcional solo para pruebas)

    fallocate -l 50M 50m
    mkfs.ext3 -v 50m
    

    Luego comprima con gzip o xz

    gzip -vk9 50m
    xz -v9k 50m
    

    Nota: Una xzopción de --block-size=16MiBdebería proporcionar un mejor rendimiento de acceso aleatorio, pero a expensas de una menor compresión (¿tal vez 1%?). Consulte la descripción del complemento xz de nbdkit .

  3. Ejecutar servidor en imagen COMPRIMIDA

    nbdkit -v --no-fork -i 127.0.0.1 /usr/lib/i386-linux-gnu/nbdkit/plugins/nbdkit-gzip-plugin.so file=~/Downloads/50m.gz
    

    o para xz

    nbdkit -v --no-fork -i 127.0.0.1 /usr/lib/i386-linux-gnu/nbdkit/plugins/nbdkit-xz-plugin.so file=~/Downloads/50m.xz
    

    El --no-forkle dice al servidor "No se bifurque en el fondo", por lo que ver posibles mensajes de error y matarlo con CTRL-C es un poco más fácil.

    -v puede / mostrará demasiados mensajes de estado, especialmente al leer.

  4. Ejecutar cliente (en otra terminal / ventana)

    sudo nbd-client -nofork 127.0.0.1 10809 /dev/nbd0
    

    El -noforkes similar a la -no-forkanterior, pero podría no matar al cliente con CTRL-C, kill <pid>o sudo kill <pid>. Finalizar el servidor con CTRL-C detuvo tanto el servidor como el cliente.

  5. Observe que /dev/nbd0ahora es idéntico a la imagen NO COMPRIMIDA

    $ sudo diff -s /dev/nbd0 ~/Downloads/50m
    Files /dev/nbd0 and /home/user/Downloads/50m are identical
    

    /dev/nbd0ahora puede usarse como la imagen sin comprimir; montada, de lectura / copiar con dd, o uso kpartx, partprobe, vgscan/ vgchange, etc!

Gracias a Cristian Ciupitu en Unix y Linux , aunque tomó un poco más de tiempo encontrar el complemento y poner todo en marcha.

Xen2050
fuente
En Fedora 31 nbdkit -v --no-fork -i 127.0.0.1 --filter=xz file ~/Downloads/50m.xzfuncionó muy bien con el mismo comando de cliente
EkriirkE
En Ubuntu 16.04 LTS xenial nbdkit 1.1.11 utiliza el protocolo NBD de edad, que se diferencia del nuevo protocolo NBD, utilizado en nbd-client 3.13, pero ca utilizar la versión NBD-cliente antes de 3.10, por ejemplo nbd-client 3.8 from Ubuntu precise 12.04 old LTS[uso versiones antiguas sólo a nivel local para la seguridad!]
user1742529
0

Aquí está mi forma de hacerlo, no sé el equivalente de consola de esto, sin embargo,

  • Comprime la carpeta en una iso. ingrese la descripción de la imagen aquí
  • Monta el .isoarchivo con Disk Image Mounter. ingrese la descripción de la imagen aquí
  • Tada abro el iso comprimido sin desempacarlo. ingrese la descripción de la imagen aquí
holazee
fuente
44
¿Este método realmente comprime los datos? Parece que usa una imagen iso9660 simple (¿a través de un rodillo de archivos?), Que no usa compresión. Lo probé en un archivo de 100 MB de todos los ceros ( dd if=/dev/zeroy el rodillo de archivos) y en realidad agrega 362k de datos (sobrecarga iso, supongo). Gracias, sin embargo, la idea está en el camino correcto
Xen2050
Lo siento, pero no tengo idea de las tecnologías de compresión, pero si intentas con cualquier otro formato de compresión, apuesto a que también puedes enumerarlo con file-roller, pero si quieres leer ese archivo, debes extraer solo ese archivo específico.
hellozee