È possibile montare al volo un'immagine dd compressa con gzip?


66

Mi piace creare un backup dell'immagine per la prima volta che eseguo il backup di un sistema. Dopo questa prima volta, utilizzo rsync per eseguire backup incrementali.

Il mio solito backup di immagine è il seguente:

Montare e azzerare lo spazio vuoto:

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

rm temp.dd

umount e dd l'unità mentre la comprime

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

per riportare il sistema alla normalità, di solito farò un

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

Questo è davvero semplice e mi consente di salvare "l'intero disco" ma di salvare semplicemente lo spazio utilizzato.

Ecco il problema Diciamo che faccio quanto sopra ma non su un sistema pulito e non riesco a far andare i backup rsync abbastanza presto e ci sono file a cui voglio accedere che sono sull'immagine. Diciamo che non ho lo spazio di archiviazione per decomprimere e dd l'immagine su un'unità, ma voglio montare l'immagine per estrarre i singoli file da essa ... È possibile?

Normalmente, non si comprime l'immagine dd, che ti permetterà di montare l'immagine usando -o loop... ma questo non è il mio caso ...

Qualche suggerimento per montare al volo l'img compresso?

Usando AVFS per "montare" il file gz e poi montare il dd.img interno funzionerebbe (non credo ... ma avrebbe bisogno di verifica ...)?


Dovresti usare SquashFSper questo tipo di cose. De-duplica anche i file duplicati.
Avio,

Sembra che questo tizio stia facendo quello che stai chiedendo: blogs.gnome.org/muelli/2012/10/…
Joshua

Secondo il suggerimento di Avio. L'unica cosa che squashfs non archivia è acls. Archivia xattrs, quindi gli attributi selinux, ecc. Se non usi acls, allora squashfs è la strada da percorrere per IMHO. Di recente ho dovuto archiviare "per ogni evenienza" alcune vecchie unità che sono già state migrate in una nuova memoria e squashfs era perfetto per il lavoro.
Kuba Ober,

Risposte:


66

Dipende dal fatto che l'immagine del disco sia un'immagine del disco completo o solo una partizione.

Lavare le partizioni

Se il disco è in buone condizioni, otterrai una compressione migliore se lavi lo spazio vuoto sul disco con zeri. Se il disco non funziona, saltare questo passaggio.

Se immagini un intero disco, allora vorrai lavare ciascuna delle partizioni sul disco.

ATTENZIONE: fare attenzione, si desidera impostare ofun file nella partizione montata, NON LA SEZIONE SE STESSA!

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

Creare un'immagine di partizione

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

Dov'è sdail nome del dispositivo ed 1è il numero di partizione. Regolare di conseguenza per il proprio sistema se si desidera creare un'immagine di un dispositivo o di una partizione diversi.

Creare un'immagine dell'intero disco

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

Dov'è sdail nome del dispositivo. Regola di conseguenza per il tuo sistema se vuoi immaginare un dispositivo diverso.

Compressione

Crea un'immagine "squashfs" che contenga l'immagine non compressa completa.

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

Compressione in streaming

Per evitare di rendere un file temporaneo separato la dimensione completa del disco, è possibile eseguire lo streaming in un'immagine squashfs.

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

Montare un'immagine di partizione compressa

Innanzitutto monta l'immagine di squashfs, quindi monta l'immagine di partizione memorizzata nell'immagine di squashfs montata.

mkdir squash_mount
sudo mount squash.img squash_mount

Ora hai l'immagine compressa montata, monta l'immagine stessa (che è all'interno dell'immagine di squashfs)

mkdir compressed_image
sudo mount squash_mount/sda1_backup.img compressed_image

Ora la tua immagine è montata sotto compressed_image.

MODIFICA: Se vuoi semplicemente ripristinare l'immagine del disco su una partizione a questo punto (invece di montarla per sfogliare / leggere il contenuto), basta ddl'immagine squash_mount/sda1_backup.imgsulla destinazione invece di farlo mount.

Montare un'immagine compressa del disco completo

Ciò richiede l'uso di un pacchetto chiamato kpartx. kpartx ti permette di montare singole partizioni in un'immagine del disco completo.

sudo apt-get install kpartx

Innanzitutto, monta la partizione schiacciata che contiene l'immagine del disco completo

mkdir compressed_image
sudo mount squash.img compressed_image

Ora è necessario creare dispositivi per ciascuna delle partizioni nell'immagine del disco completo:

sudo kpartx -a compressed_image/sda_backup.img

Ciò creerà dispositivi per le partizioni nell'immagine del disco completo in /dev/mapper/loopNpPcui N è il numero assegnato per il dispositivo di loopback e P è il numero di partizione. Ad esempio: /dev/mapper/loop0p1.

Ora hai un modo per montare le singole partizioni nell'immagine del disco completo:

mkdir fulldisk_part1
sudo mount /dev/mapper/loop0p1 fulldisk_part1

interpretazione interessante di questo problema (squashfs invece di gzip). Non ho familiarità con gli strumenti di squashfs ... puoi reindirizzare l'output di dd per creare al volo una partizione di squash come puoi con la partizione gzip? qual è il rapporto di compressione (gzip va bene / bene, specialmente se sto cancellando "spazio vuoto con zeri")?
g19fanatic

come riporteresti l'immagine sul disco rigido?
g19fanatic

2
@ g19fanatic L'immagine del disco non compresso è "dentro" l'immagine di squashfs. Montate l'immagine di squashfs, quindi dd l'immagine al suo interno sul disco di destinazione.
doug65536,

@ g19fanatic La compressione è stata eccellente (quasi uguale a gzip nel mio caso). Anche mksquashfs è stato veloce, è parallelizzato. Sul mio 990x (6 core) era effettivamente limitato dalla velocità di scrittura del disco di destinazione, circa 100 MB / sec.
doug65536,

3
@ g19fanatic Puoi eseguire lo streaming in squashfs usando i flag -po -pfper passargli uno pseudo-file. Uno pseudo file può essere usato per cose come creare nodi di dispositivo che altrimenti non si potrebbero fare a meno di root (utile per costruire immagini come parte di un processo di compilazione) o per trasmettere l'output di alcuni comandi nell'immagine. Uno degli esempi forniti nei documenti ( /usr/share/doc/squashfs-tools/examples/pseudo-file.examplesu Debian / Ubuntu) è input f 444 root root dd if=/dev/sda1 bs=1024 count=10copiare i primi 10K da un'immagine del disco in un file chiamato "input" nell'immagine di squashfs.
Brian Campbell,

15

Se l'immagine è di sola lettura puoi anche usare nbdkit ( pagina man ) e il suo plugin xz (xz dovrebbe fornire una migliore compressione e tempi di accesso casuali rispetto a gzip).

Crea l'immagine della partizione compressa

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

Una --block-sizepossibilità di 16 MiB dovrebbe fornire buone prestazioni ad accesso casuale.

Nota: è possibile utilizzare programmi di compressione xz alternativi come pixz che fornisce una compressione parallela, assicurarsi solo che divida l'output in più piccoli blocchi, altrimenti nbdkit deve decomprimere molti dati. Ad esempio da settembre 2015, pxz non supporta questo.

Servilo con nbdkit

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

Connettersi al server NBD

nbd-client 127.0.0.1 10809 /dev/nbd0 -nofork

Montalo in sola lettura

mount -o ro /dev/nbd0 sda1

Quando fatto

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

Arresta nbdkit premendo Ctrl+ C(o con kill ).


15

Provare 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 è un file system basato su FUSE per varianti Unix, incluso Linux. Il suo scopo è montare archivi (ad es. Tar, tar.gz, ecc.) Su un punto di montaggio in cui può essere letto o scritto come con qualsiasi altro file system. Questo rende l'accesso ai contenuti dell'archivio, che può essere compresso, trasparente ad altri programmi, senza decomprimerli.

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

Dopo aver montato l'archivio puoi usarlo come un normale file. Forse ottenere una tabella delle partizioni, o convertire, montare l'immagine con gli strumenti qemu.

squashfs utile per l'avvio da immagine, ma molto complesso per il backup.


Perfetto! Questa è la soluzione più semplice ed elegante finora. Mi chiedo perché non ci siano voti qui.
TranslucentCloud,

Penso che sia perché se montate un archivio come disk.img.gz su una cartella con archivemount, diciamo / mnt /, otterreste un singolo file /mnt/disk.img, che dovrete poi montare altrove. La domanda invece vuole qualcosa in grado di scartare entrambi in un solo passaggio (e archivemount sembra in grado di farlo su .tar.gz, ma non su immagini gzip grezze).
p91paul,

2
Anche questa risposta è molto interessante. Credo che squashfs ottenga più amore perché ha più consapevolezza. Ho riconosciuto immediatamente il nome ma non ho mai sentito parlare di archivemount. Dovrò provarci anche io!
g19fanatic,

2
archivemount non consente di montare un'immagine creata dal comandodd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.ddimg.gz
Sergei

3
D'accordo - al momento della scrittura, archivemount supporta archivi tar che sono compressi con gzip, ma non con semplici file gzip.
mwfearnley,

10

Questa risposta integra la risposta di Cristian Ciupitu . Se usi la compressione xz con una dimensione del blocco ragionevole, puoi accedere all'immagine del disco usando guestfish o altri strumenti libguestfs come questo:

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

8

Non proprio. Non puoi davvero cercare un blocco specifico nel file compresso senza prima decomprimere il tutto, il che rende difficile usare l'immagine compressa come dispositivo a blocchi.

Potresti usare qualcosa del tipo dumpe restore(o tar, davvero), che usano tutti un formato di streaming ... in modo da poter accedere ai file individuali scansionando efficacemente il flusso non compresso. Significa che se il file desiderato si trova alla fine dell'archivio compresso, potrebbe essere necessario attendere molto tempo, ma non è necessario decomprimere effettivamente tutto sul disco.

L'uso tarper i backup può sembrare un po 'vecchio stile, ma si ottiene molta flessibilità.


1
Il problema sta nel fatto che non so nemmeno se il file di interesse si trova effettivamente su questo backup compresso ... Conosci un esploratore di file che passerà attraverso l'intera immagine .gz, mantieni il file / dir struttura in memoria, fornire una semplice visualizzazione della struttura e consentire di "raccogliere" i file (ora che sa dove esistono) da estrarre? È una specifica molto di nicchia ... ma potrei vedere tonnellate di usi per qualcosa del genere ... se esiste.
g19fanatic,

1
In caso contrario, saresti in grado di indicarmi alcune istruzioni su come estrarre la struttura dall'immagine gz'd? Sarei in grado di creare un tale programma (programma per vivere ...) ma sono cieco sul tema della decompressione dei dati delle immagini e sulle specifiche dei diversi filesystem.
g19fanatic,

Ho il sospetto che costruire il tuo strumento sarà un progetto più ampio di quello che vuoi davvero intraprendere. Comunque ... supponendo che tu abbia un filesystem ext [234], suggerirei il pacchetto e2fsprogs , o forse qualcosa come fuse-ext2 . Entrambi forniscono strumenti per lo spazio utente per interagire con i filesystem ext [234].
Larsks,

Nota anche che ciò che hai non sembra essere un'immagine del filesystem, è un'immagine del disco intero, il che significa che dovrai prima analizzare la tabella delle partizioni e individuare la partizione appropriata.
Larsks,

Ho sbagliato a scrivere la domanda sopra e lo risolverò. Di solito faccio un'immagine dd basata su partizioni e salvo una copia della tabella delle partizioni. Ero abituato a fare copie di interi dischi, ma odiavo doverlo montare con opzioni per arrivare nella posizione corretta.
g19fanatic,

3

Un altro addendum alla risposta di Cristian Ciupitu :

Se si utilizza nbdkitper montare un'immagine completa del disco (rispetto a un'immagine della partizione), potrebbe essere necessario specificare la dimensione del blocco (dimensione del settore del disco) quando ci si connette al server NBD, poiché per impostazione predefinita è 1024byte. Per utilizzare 512invece i byte:

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

Successivamente, il disco apparirà come /dev/nbd0e dovresti essere in grado di visualizzare la tabella delle partizioni usando fdisk -l. Tuttavia, le partizioni non sono ancora montabili: utilizzare kpartx(dalla risposta di doug65536 ) per creare dispositivi per le partizioni, ad esempio:

kpartx -arv /dev/nbd0

Infine, appariranno le partizioni /dev/mapper/e potrai montarle come al solito. Assicurati di utilizzare la modalità sola lettura ( -o ro), poiché il plug-in xz supporta solo le letture:

mount -o ro /dev/mapper/nbd0p3 /mnt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.