É possível montar uma imagem dd compactada gzip rapidamente?

65

Eu gosto de criar um backup de imagem pela primeira vez que estou fazendo o backup de um sistema. Depois dessa primeira vez, uso o rsync para fazer backups incrementais.

Meu backup de imagem habitual é o seguinte:

Monte e zere o espaço vazio:

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

rm temp.dd

umount e dd a unidade enquanto a compacta

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

para colocar o sistema de volta ao normal, normalmente irei fazer um

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

Isso é realmente simples e permite que eu salve a 'unidade inteira', mas apenas salve o espaço usado.

Aqui está o problema. Vamos dizer que eu faço o acima, mas não em um sistema limpo e não obter os backups rsync indo em breve o suficiente e existem arquivos que eu quero acessar que estão na imagem. Digamos que eu não tenha o espaço de armazenamento para realmente descompactar e inserir a imagem em uma unidade, mas deseja montar a imagem para obter arquivos individuais dela ... Isso é possível?

Normalmente, não é possível compactar a imagem dd, o que permitirá montar a imagem usando -o loop ... mas esse não é o meu caso ...

Alguma sugestão para montar o img comprimido imediatamente?

Usaria o AVFS para 'montar' o arquivo gz e montaria o trabalho interno do dd.img (eu acho que não. .. mas precisaria de verificação ...)?

    
por g19fanatic 14.02.2012 / 18:38

6 respostas

64

Depende se a imagem do disco é uma imagem completa do disco ou apenas uma partição.

Lavando a (s) divisória (ões)

Se o disco estiver em boas condições de funcionamento, você obterá melhor compactação se lavar o espaço vazio no disco com zeros. Se o disco estiver falhando, pule esta etapa.

Se você estiver visualizando um disco inteiro, desejará lavar cada uma das partições no disco.

CUIDADO: Tenha cuidado, você quer definir o of para um arquivo na partição montada, NÃO A PARTE SEMPRE!

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

Criando uma imagem de partição

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

Em que sda é o nome do dispositivo e 1 é o número da partição. Ajuste de acordo com o seu sistema, se você quiser criar uma imagem de um dispositivo ou partição diferente.

Criando uma imagem de disco inteira

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

Em que sda é o nome do dispositivo. Ajuste de acordo com o seu sistema se você quiser criar uma imagem de um dispositivo diferente.

Compressão

Crie uma imagem "squashfs" que contenha a imagem totalmente descomprimida.

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

Streaming Compression

Para evitar criar um arquivo temporário separado no tamanho total do disco, é possível transmitir para uma imagem do squashfs.

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

Montando uma imagem de partição compactada

Primeiro, monte a imagem do squashfs e monte a imagem da partição armazenada na imagem do squashfs montada.

mkdir squash_mount
sudo mount squash.img squash_mount

Agora você tem a imagem compactada montada, monte a própria imagem (que está dentro da imagem do squashfs)

mkdir compressed_image
sudo mount squash_mount/sda1_backup.img compressed_image

Agora, sua imagem está montada em compressed_image .

EDIT: Se você quisesse simplesmente restaurar a imagem do disco em uma partição neste momento (em vez de montá-la para navegar / ler o conteúdo), apenas dd da imagem em squash_mount/sda1_backup.img no destino, em vez de fazer mount .

Montando uma imagem de disco cheia e compactada

Isso requer que você use um pacote chamado kpartx. O kpartx permite montar partições individuais em uma imagem de disco completa.

sudo apt-get install kpartx

Primeiro, monte sua partição esmagada que contém a imagem completa do disco

mkdir compressed_image
sudo mount squash.img compressed_image

Agora, você precisa criar dispositivos para cada uma das partições na imagem completa do disco:

sudo kpartx -a compressed_image/sda_backup.img

Isso criará dispositivos para as partições na imagem completa do disco em /dev/mapper/loopNpP , onde N é o número designado para o dispositivo de loopback e P é o número da partição . Por exemplo: /dev/mapper/loop0p1 .

Agora você tem uma maneira de montar as partições individuais na imagem completa do disco:

mkdir fulldisk_part1
sudo mount /dev/mapper/loop0p1 fulldisk_part1
    
por 13.05.2013 / 04:45
13

Se a imagem for somente leitura , você também poderá usar nbdkit ( página man ) e seu plugin xz (o xz deve fornecer melhor compressão e tempos de acesso aleatório do que o gzip).

Crie a imagem da partição compactada

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

Uma opção --block-size de 16 MiB deve fornecer um bom desempenho de acesso aleatório.

Observação: você pode usar programas de compactação xz alternativos, como o pixz , que oferece compactação paralela, Verifique se ele divide a saída em vários blocos pequenos, caso contrário, o nbdkit precisa descompactar muitos dados. Por exemplo, a partir de setembro de 2015, pxz não é compatível com isso.

Sirva com nbdkit

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

Conecte-se ao servidor NBD

nbd-client 127.0.0.1 10809 /dev/nbd0 -nofork

Montar somente leitura

mount -o ro /dev/nbd0 sda1

Quando terminar

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

Pare nbdkit pressionando Ctrl + C (ou com kill ).

    
por 19.06.2014 / 18:50
13

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

O archivemount é um sistema de arquivos baseado em FUSE para variantes do Unix, incluindo o Linux. Sua finalidade é montar arquivos (ou seja, tar, tar.gz, etc.) em um ponto de montagem no qual possa ser lido ou gravado como em qualquer outro sistema de arquivos. Isso torna o acesso ao conteúdo do arquivo, que pode ser compactado, transparente para outros programas, sem descompactá-los.

link

Após a montagem do arquivo, você pode usá-lo como um arquivo normal. Talvez pegue a tabela de partições, ou converta, monte imagens com ferramentas qemu.

squashfs útil para inicializar a partir da imagem, mas muito complexo para backup.

    
por 28.05.2014 / 10:29
10

Esta resposta complementa a resposta de Cristian Ciupitu . Se você usar a compactação xz com um tamanho de bloco razoável, poderá acessar a imagem do disco usando guestfish ou outras ferramentas libguestfs assim:

nbdkit xz file=disk.img.xz --run 'guestfish --format=raw -a $nbd -i'
    
por 20.06.2014 / 22:44
8

Não realmente. Você não pode realmente procurar um bloco específico no arquivo compactado sem descompactar a coisa toda primeiro, o que torna difícil usar a imagem compactada como um dispositivo de bloco.

Você pode usar algo como dump e restore (ou tar , na verdade), que usam um formato de streaming ... para que você possa acessar arquivos individuais examinando com eficiência o fluxo descompactado. Isso significa que, se o arquivo desejado estiver no final do arquivo compactado, você poderá esperar muito, mas não precisará descompactar tudo no disco.

Usar tar para backups pode parecer um pouco antiquado, mas você tem muita flexibilidade.

    
por 14.02.2012 / 23:39
2

Outro adendo à resposta de Cristian Ciupitu :

Se você usar nbdkit para montar uma imagem de disco completa (em comparação a uma imagem de partição), talvez seja necessário especificar o tamanho do bloco (tamanho do setor do disco) ao conectar ao NBD servidor, como o padrão é 1024 bytes. Para usar 512 bytes:

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

Depois disso, o disco aparecerá como /dev/nbd0 e você poderá visualizar a tabela de partição usando fdisk -l . No entanto, as partições ainda não são montáveis - Use kpartx (da resposta de doug65536 ) para criar dispositivos para as partições Por exemplo:

kpartx -arv /dev/nbd0

Finalmente, as partições aparecerão em /dev/mapper/ e você poderá montá-las como de costume. Certifique-se de usar o modo readonly ( -o ro ), pois o plugin xz só suporta leituras:

mount -o ro /dev/mapper/nbd0p3 /mnt
    
por 20.11.2017 / 18:26