Como montar uma imagem de disco compactada?

12

Se eu criar uma imagem de disco e compactá- la com gzip / xz / etc, existe uma maneira de montá-la diretamente sem primeiro descompactá-la?

Digamos que eu usei

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

como montar a imagem original, sem antes criar uma cópia não compactada?

Ou eu usei

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

e o disco possui várias partições, isso dificultaria ainda mais?

Com uma imagem descompactada de um disco inteiro, o uso de kpartxversões mais recentes losetupdo -Pflag com ele deve criar um loop para cada partição.

Mas existe uma maneira de montar / losetup / ler a imagem compactada?

Se não funcionar para o gzip / xz, existe algum método de compressão para o qual funcionaria?


Nota sobre Q duplicado

A duplicata atualmente sugerida

NÃO USE COMPRESSÃO E NÃO É DUPLICADO .

mount não montará uma imagem compactada por si só.

Xen2050
fonte
Eu posso lhe dizer que definitivamente é possível. Mas não posso lhe dizer como atm, porque as instruções estão em 2 discos rígidos externos e agora não tenho acesso a nenhum, mas quero que você saiba que funciona. Voltarei com uma resposta quando tiver uma (e mais ninguém postou uma até então).
UTF-8/
1
@ UTF-8 Isso é encorajador, obrigado. Para sua informação, o objetivo original é fazer um backup menor de uma unidade / partição que esteja quase vazia ou com muitos dados facilmente compactáveis ​​e possa lê-los sem escrever muitos dados extras ou precisar de muito espaço livre para extraí-los
Xen2050 12/12
Veja também major.io/2010/12/14/…
Panther
2
@ bodhi.zazen Pardon? Talvez eu deva esclarecer, o mount não descompacta automaticamente as imagens, portanto, este Q não é uma duplicata do askubuntu.com/questions/69363 (talvez eu tenha perdido a piada, espero que a descompactação não seja a única resposta :)
Xen2050:

Respostas:

10

Você pode usar squashfspara compactar imagens de disco e montá-las.

Crie a imagem do disco

Se você ainda não tem uma imagem de disco, use-a ddpara criar uma:

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

Comprima a imagem com squashfs

Instalar squashfs:

apt-get install squashfs-tools

Comprima a imagem:

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

Ou Transmita a compactação (não precisa de um arquivo dd temporário)

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

Elogios ao terminator14 no UbuntuForums.org . Definições / Explicações:

  • empty-dir- dir "fonte". Basicamente, no nosso caso, apenas um diretório vazio para satisfazer o formato arg de entrada do mksquashfs
  • squash.img - o destino e o nome do arquivo do arquivo squashfs de saída
  • sda_backup.img - o nome do backup dd DENTRO do arquivo squashfs
  • f - especifica que sda_backup.img é um arquivo regular (em oposição a um diretório, dispositivo de bloco ou dispositivo de char)
  • 444 - permissões do arquivo sda_backup.img dentro da imagem squashfs
  • root root- UID e GID para o arquivo sda_backup.img dentro da imagem squashfs. Pode ser especificado por números decimais ou por nome
  • dd if=/dev/sda bs=4M - o comando dd usado para ler o dispositivo que queremos fazer backup

Monte a imagem

Primeiro monte a squashfsimagem:

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

Isso apresentará a imagem de disco descompactada para você montar:

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

Ou, se for uma imagem de unidade completa (particionada), você pode usar losetuppara anexar a imagem dd a um dispositivo de loop (possivelmente opcional) e, em seguida, encontrar kpartx -aou partprobeseparar as partições em dispositivos separados, ou mesmo vgscan/ vgchange -ayse houver LVM.

Eborbob
fonte
2
Eu adicionei algumas informações rápidas sobre squashfs, para evitar a necessidade de um arquivo dd temporário simples. Grande resposta com squashfs, apenas não faz os mais formatos XZ / GZ-friendly tubos
Xen2050
De alguma forma isso funcionaria com uma imagem de disco completa contendo várias partições também?
Friederbluemle
Veja aqui o disco completo: unix.stackexchange.com/questions/31669/…
HackerBoss
Dependendo do tipo de sistema de arquivos, a montagem pode exigir as seguintes ro,noloadopções:mount -o ro,noload /mnt/squash/sda1.img /mnt/sda1
HackerBoss
7

Consegui que um servidor NBD "servisse" uma versão não compactada de um arquivo .gz ou .xz. Não tenho certeza se ele deve ler o arquivo compactado inteiro com muita frequência (apenas testado até o momento com arquivos pequenos em memória RAM), mas pelo menos funciona sem precisar extrair uma cópia inteira não compactada.

Visualizando uma imagem dd compactada gz / xz "on-the-fly"

  1. Instale o nbdkit & client

    apt install nbdkit nbd-client
    
  2. Crie um arquivo de estilo "dd" de demonstração - um arquivo vazio de 50 milhões de arquivos com um sistema de arquivos ext e feche-o (opcional apenas para teste)

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

    Comprima com gzip ou xz

    gzip -vk9 50m
    xz -v9k 50m
    

    Nota: Uma xzopção de --block-size=16MiBdeve oferecer melhor desempenho de acesso aleatório, mas à custa de menos compactação (talvez 1%?). Veja a descrição do plugin xz do nbdkit .

  3. Executar servidor na imagem COMPRESSED

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

    ou 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
    

    O --no-forkcomando diz ao servidor "Não entre em segundo plano", então é possível ver possíveis mensagens de erro e eliminá-lo com CTRL-C.

    -v pode / irá mostrar muitas mensagens de status, especialmente ao ler.

  4. Executar cliente (em outro terminal / janela)

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

    O -noforké semelhante ao -no-forkanterior, mas eu poderia não matar o cliente com CTRL-C, kill <pid>ou sudo kill <pid>. Encerrar o servidor com CTRL-C interrompeu o servidor e o cliente.

  5. Observe que /dev/nbd0agora é idêntico à imagem UN-COMPRESSED

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

    /dev/nbd0agora pode ser usado como a imagem não compactada; montado, ler / copiar com dd, ou utilização kpartx, partprobe, vgscan/ vgchange, etc!

Graças a Cristian Ciupitu no Unix e Linux , apesar de ter demorado um pouco mais para encontrar o plugin e fazer tudo funcionar.

Xen2050
fonte
No Fedora 31, nbdkit -v --no-fork -i 127.0.0.1 --filter=xz file ~/Downloads/50m.xzfuncionou muito bem com o mesmo comando do cliente
EkriirkE
No Ubuntu xenial 16.04, o LTS nbdkit 1.1.11 usa o protocolo NBD antigo, que difere do novo protocolo NBD, usado nbd-client 3.13, mas você pode usar a versão nbd-client antes da 3.10, por exemplo nbd-client 3.8 from Ubuntu precise 12.04 old LTS[usar versões antigas apenas localmente por segurança!]
user1742529
0

Aqui está a minha maneira de fazê-lo, embora não conheça o equivalente a esse console,

  • Comprima a pasta em um iso. insira a descrição da imagem aqui
  • Monte o .isoarquivo com Disk Image Mounter. insira a descrição da imagem aqui
  • Tada Abro o iso compactado sem desembalá-lo. insira a descrição da imagem aqui
hellozee
fonte
4
Esse método realmente comprime os dados? Parece que usa uma imagem iso9660 simples (via rolo de arquivo?), Que não usa compactação. Eu tentei em um arquivo de 100MB de todos os zero ( dd if=/dev/zeroe rolo de arquivo) e, na verdade, adiciona 362k de dados (iso overhead, suponho). Graças, porém, a idéia é no caminho certo
Xen2050
Desculpe, mas eu não tenho nenhuma idéia sobre tecnologias de compactação, mas se você tentar qualquer outro formato de compactação, aposto que também pode ser listado com o rolo de arquivo, mas se você quiser ler esse arquivo, precisará extrair apenas esse arquivo específico.
hellozee