É possível montar uma imagem dd compactada com gzip em tempo real?

66

Gosto de criar um backup de imagem pela primeira vez em que faço backup de um sistema. Após essa primeira vez, uso o rsync para fazer backups incrementais.

Meu backup de imagem usual é o seguinte:

Monte e zere o espaço vazio:

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

rm temp.dd

desmontar e dd a unidade enquanto a comprime

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

para colocar o sistema de volta ao normal, geralmente faço uma

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

Isso é realmente simples e permite que eu salve o 'disco inteiro', mas realmente apenas salve o espaço usado.

Aqui está o problema. Digamos que eu faça o acima, mas não em um sistema limpo, e não obtenha os backups do rsync em breve, e há arquivos que eu quero acessar que estão na imagem. Digamos que eu não tenha espaço de armazenamento para descompactar e desdicionar a imagem em uma unidade, mas deseje montar a imagem para obter arquivos individuais dela ... Isso é possível?

Normalmente, não se comprime a imagem dd, o que permitirá que você monte a imagem usando -o loop... mas esse não é o meu caso ...

Alguma sugestão para montar o img compactado em tempo real?

Usar o AVFS para 'montar' o arquivo gz e montar o dd.img interno funcionará (acho que não ... mas precisaria de verificação ...)?

g19fanatic
fonte
Você deve usar SquashFSpara esse tipo de coisa. Ele também remove a duplicação de arquivos duplicados.
Avio
Parece que esse sujeito está fazendo o que você está perguntando: blogs.gnome.org/muelli/2012/10/…
Joshua
Eu segundo a sugestão de Avio. A única coisa que o squashfs não arquiva é acls. Ele arquiva xattrs, portanto, seleciona atributos, etc. Se você não usa acls, o squashfs é o caminho a seguir. Recentemente, tive que arquivar "por precaução" algumas unidades antigas que já foram migradas para um novo armazenamento, e o squashfs era perfeito para o trabalho.
Kuba Ober 24/02

Respostas:

66

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

Lavando a (s) partição (ões)

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

Se estiver imaginando um disco inteiro, convém lavar cada uma das partições do disco.

CUIDADO: Tenha cuidado, você deseja definir o ofa um arquivo na partição montada, não a partição-SE!

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

Onde sdaé o nome do dispositivo e 1o número da partição. Ajuste de acordo com o seu sistema, se desejar criar uma imagem para uma partição ou dispositivo diferente.

Criando uma imagem de disco inteira

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

Onde sdaé o nome do dispositivo. Ajuste de acordo com o seu sistema se desejar criar uma imagem para um dispositivo diferente.

Compressão

Faça uma imagem "squashfs" que contenha a imagem completa não compactada.

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

Compressão de Streaming

Para evitar que um arquivo temporário separado seja do tamanho total do disco, você pode transmitir para uma imagem 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, depois monte a imagem da partição armazenada na imagem do squashfs montado.

mkdir squash_mount
sudo mount squash.img squash_mount

Agora que você montou a imagem compactada, 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ê quiser simplesmente restaurar a imagem do disco em uma partição neste momento (em vez de montá-la para navegar / ler o conteúdo), apenas dda imagem no squash_mount/sda1_backup.imgdestino em vez de fazê-lo mount.

Montando uma imagem de disco completo 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 compactada 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/loopNpPque N é o número atribuído ao 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
doug65536
fonte
opinião interessante sobre esse problema (squashfs em vez de gzip). Eu não estou familiarizado com as ferramentas squashfs ... você pode canalizar a saída do dd para criar uma partição squash em tempo real, como você pode com a partição gzip? quais são as taxas de compressão (gzip está bom / bom, especialmente considerando que estou limpando 'espaço vazio com zeros')?
G19fanatic #
como você dd a imagem de volta para o disco rígido?
G19fanatic #
2
@ g19fanatic A imagem do disco não compactado está "dentro" da imagem do squashfs. Você monta a imagem do squashfs e copia a imagem dentro dela no disco de destino.
Doug65536
@ g19fanatic A compressão foi excelente (quase o mesmo que gzip no meu caso). O mksquashfs também foi rápido, é paralelo. No meu 990x (6 núcleos), era realmente limitado pela velocidade de gravação do disco de destino, em torno de 100 MB / s.
Doug65536
3
@ g19fanatic Você pode transmitir para squashfs usando os sinalizadores -pou -pfpara transmitir um pseudo-arquivo. Um pseudo arquivo pode ser usado para criar nós de dispositivo que, de outra forma, não seriam possíveis sem o root (útil para criar imagens como parte de um processo de compilação) ou para transmitir a saída de algum comando para a imagem. Um dos exemplos dados nos documentos ( /usr/share/doc/squashfs-tools/examples/pseudo-file.exampleno Debian / Ubuntu) é input f 444 root root dd if=/dev/sda1 bs=1024 count=10copiar os primeiros 10K de uma imagem de disco em um arquivo chamado "input" na imagem do squashfs.
Brian Campbell
15

Se a imagem for somente leitura, você também poderá usar o nbdkit ( página de manual ) e seu plug-in xz (o xz deve fornecer melhores tempos de compactação e 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 --block-sizeopção de 16 MiB deve fornecer um bom desempenho de acesso aleatório.

Nota: você pode usar programas alternativos de compactação xz, como o pixz, que fornece compactação paralela; apenas certifique-se de dividir a saída em vários pequenos blocos; caso contrário, o nbdkit precisará descomprimir muitos dados. Por exemplo, em setembro de 2015, o pxz não suporta isso.

Servir 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

Monte-o somente leitura

mount -o ro /dev/nbd0 sda1

Quando terminar

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

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

Cristian Ciupitu
fonte
15

Experimentar 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 é um sistema de arquivos baseado em FUSE para variantes do Unix, incluindo Linux. Seu objetivo é montar arquivos (por exemplo, tar, tar.gz, etc.) em um ponto de montagem em que possa ser lido ou gravado como em qualquer outro sistema de arquivos. Isso torna o acesso ao conteúdo do arquivo compactado, transparente a outros programas, sem descompactá-los.

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

Depois de montar o arquivo, você pode usá-lo como um arquivo normal. Talvez obtenha uma tabela de partição ou converta, monte uma imagem com as ferramentas qemu.

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

eri
fonte
Perfeito! Esta é a solução mais fácil e elegante até agora. Eu me pergunto por que não há votos aqui.
TranslucentCloud
Eu acho que é porque se você montar um arquivo como disk.img.gz em uma pasta com archivemount, digamos / mnt /, você obteria um único arquivo /mnt/disk.img, que precisará montar em outro lugar. Em vez disso, a pergunta quer algo capaz de desembrulhar os dois em uma única etapa (e o valor do arquivo parece capaz de fazer isso em .tar.gz, mas não em imagens brutas compactadas com gzip).
P91paul
2
Essa resposta também é muito interessante. Eu acredito que squashfs ganha mais amor porque tem mais consciência. Reconheci instantaneamente o nome, mas nunca ouvi falar de um arquivo. Vou ter que tentar também!
g19fanatic
2
não archivemount não permitem montar uma imagem criada por comandodd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.ddimg.gz
Sergei
3
Concordado - no momento da redação, o archivemount suporta arquivos tar que são compactados em gzip, mas não em arquivos simples.
precisa saber é o seguinte
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 como esta:

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

Na verdade não. Você não pode realmente procurar um bloco específico no arquivo compactado sem descomprimir tudo primeiro, o que dificulta o uso da imagem compactada como um dispositivo de bloco.

Você pode usar algo como dumpe restore(ou tar, realmente), todos os quais usam um formato de streaming ... para poder acessar arquivos inválidos, efetivamente digitalizando através do fluxo não compactado. Isso significa que, se o arquivo desejado estiver no final do arquivo compactado, você poderá esperar muito, mas não exige que você descompacte tudo no disco.

O uso tarde backup pode parecer um pouco antiquado, mas você tem muita flexibilidade.

larsks
fonte
11
O problema está no fato de eu nem saber se o arquivo de interesse está realmente nesse backup compactado ... Você conhece um explorador de arquivos que percorrerá toda a imagem .gz'd, mantenha o arquivo / dir estrutura na memória, forneça uma visão simples da estrutura e permita que você 'escolha' arquivos (agora que ele sabe onde eles existem) para extrair? É uma especificação muito nicho ... mas eu pude ver toneladas de usos para algo assim ... se existir.
g19fanatic
11
Caso contrário, você poderia me indicar algumas instruções sobre como extrair a estrutura da imagem do GZ'd? Eu seria capaz de criar um programa desse tipo (programa para viver ...), mas sou cego no tópico de descompactar dados de imagem e nas especificidades de diferentes sistemas de arquivos.
g19fanatic
Suspeito que a construção de sua própria ferramenta seja um projeto maior do que você realmente deseja realizar. No entanto ... supondo que você tenha um sistema de arquivos ext [234], sugiro o pacote e2fsprogs , ou talvez algo como fuse-ext2 . Ambos fornecem ferramentas de espaço do usuário para interagir com sistemas de arquivos ext [234].
Larsks
Observe também que o que você possui não parece ser uma imagem do sistema de arquivos, é uma imagem completa do disco, o que significa que você primeiro terá que analisar a tabela de partições e localizar a partição apropriada.
larsks
Eu digitei errado na pergunta acima e a corrigirei. Eu costumo fazer uma imagem dd baseada em partição e salvar uma cópia da tabela de partição. Eu costumava fazer cópias de disco inteiras, mas odiava precisar montar com opções para chegar ao local adequado.
g19fanatic
3

Outro adendo à resposta de Cristian Ciupitu :

Se você usar nbdkitpara montar uma imagem de disco completa (em comparação com uma imagem de partição), pode ser necessário especificar o tamanho do bloco (tamanho do setor do disco) ao conectar-se ao servidor NBD, pois o padrão é 1024bytes. Para usar 512bytes:

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

Depois disso, o disco aparecerá como /dev/nbd0e você poderá visualizar a tabela de partições usando fdisk -l. No entanto, as partições ainda não podem ser montadas - use kpartx( da resposta de doug65536 ) para criar dispositivos para as partições, por exemplo:

kpartx -arv /dev/nbd0

Por fim, as partições aparecerão /dev/mapper/e você poderá montá-las como de costume. Certifique-se de usar o modo somente leitura ( -o ro), pois o plugin xz suporta apenas leituras:

mount -o ro /dev/mapper/nbd0p3 /mnt
friederbluemle
fonte