Est-il possible de monter une image DD compressée gzip à la volée?

66

J'aime créer une sauvegarde d'image pour la première fois que je sauvegarde un système. Après cette première fois, j’utilise rsync pour effectuer des sauvegardes incrémentielles.

Ma sauvegarde d'image habituelle est la suivante:

Montez et mettez à zéro l'espace vide:

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

rm temp.dd

umount et dd le lecteur tout en le compressant

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

pour remettre le système à la normale, je ferai généralement une

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

C’est vraiment simple et me permet d’économiser la totalité du disque, tout en préservant l’espace utilisé.

Voici le problème. Disons que je fais ce qui précède, mais pas sur un système propre, que les sauvegardes rsync ne sont pas lancées assez tôt et que certains fichiers auxquels je souhaite accéder se trouvent sur l'image. Supposons que je ne dispose pas de l'espace de stockage nécessaire pour décompresser et dd l'image sur un lecteur, mais que je veuille monter l'image pour extraire des fichiers individuels ... Est-ce possible?

Normalement, on ne compresse pas l'image en DD, ce qui vous permettra de monter l'image en utilisant -o loop... mais ce n'est pas mon cas ...

Des suggestions pour monter l’img compressé à la volée?

Est-ce qu'utiliser AVFS pour 'monter' le fichier gz puis monter le fichier interne dd.img fonctionnerait (je ne le pense pas ... mais aurait besoin d'une vérification ...)?

g19fanatic
la source
Vous devriez utiliser SquashFSpour ce genre de choses. Il permet également de dupliquer les fichiers dupliqués.
Avio
On dirait que ce type fait ce que vous demandez: blogs.gnome.org/muelli/2012/10/…
Joshua
J'appuie la suggestion d'Avio. La seule chose que squashfs n’archive pas, c’est acls. Il archive les attributs xattrs, so ainsi, etc., etc. Si vous n'utilisez pas acls, alors squashfs est le moyen d'aller à mon humble avis. J'ai récemment dû archiver "au cas où" d'anciens lecteurs déjà migrés vers un nouveau stockage, et squashfs était parfait pour le travail.
Kuba Ober

Réponses:

66

Cela dépend si l'image disque est une image disque complète ou juste une partition.

Lavage de la partition

Si le disque est en bon état de fonctionnement, vous obtiendrez une meilleure compression si vous nettoyez l'espace vide du disque avec des zéros. Si le disque échoue, ignorez cette étape.

Si vous créez l'image d'un disque entier, vous voudrez peut-être laver chacune des partitions du disque.

ATTENTION: Attention, vous voulez définir l' ofun fichier dans la partition montée, PAS LA PARTITION LUI - MÊME!

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

Faire une image de partition

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

sdaest le nom du périphérique et 1le numéro de la partition. Ajustez en conséquence pour votre système si vous souhaitez créer une image sur un autre périphérique ou une autre partition.

Faire une image de disque entière

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

sdaest le nom de l'appareil. Ajustez en conséquence pour votre système si vous souhaitez créer une image avec un autre périphérique.

Compression

Créez une image "squashfs" contenant l’image complète non compressée.

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

Compression en continu

Pour éviter de créer un fichier temporaire distinct de la taille complète du disque, vous pouvez diffuser en continu dans une image squashfs.

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

Monter une image de partition compressée

Commencez par monter l'image squashfs, puis l'image de partition stockée dans l'image squashfs montée.

mkdir squash_mount
sudo mount squash.img squash_mount

Maintenant que vous avez l'image compressée montée, montez l'image elle-même (c'est à l'intérieur de l'image squashfs)

mkdir compressed_image
sudo mount squash_mount/sda1_backup.img compressed_image

Maintenant, votre image est montée sous compressed_image.

ÉDITER: si vous vouliez simplement restaurer l’image disque sur une partition à ce stade (au lieu de la monter pour parcourir / lire le contenu), il suffit d’afficher ddl’image squash_mount/sda1_backup.imgsur la destination au lieu de la faire mount.

Monter une image disque complète compressée

Cela nécessite l'utilisation d'un package appelé kpartx. kpartx vous permet de monter des partitions individuelles dans une image disque complète.

sudo apt-get install kpartx

Commencez par monter votre partition écrasée contenant l’image de disque complète.

mkdir compressed_image
sudo mount squash.img compressed_image

Maintenant, vous devez créer des périphériques pour chacune des partitions dans l'image de disque complète:

sudo kpartx -a compressed_image/sda_backup.img

Cela créera des unités pour les partitions dans l’image de disque complète /dev/mapper/loopNpPN est le numéro attribué à l’unité de bouclage et P le numéro de la partition. Par exemple: /dev/mapper/loop0p1.

Vous avez maintenant un moyen de monter les partitions individuelles dans l'image disque complète:

mkdir fulldisk_part1
sudo mount /dev/mapper/loop0p1 fulldisk_part1
doug65536
la source
prise intéressante sur ce problème (squashfs au lieu de gzip). Je ne suis pas très familier avec les outils squashfs ... pouvez-vous diriger la sortie de dd pour créer une partition squash à la volée comme vous le pouvez avec la partition gzip? quel est le taux de compression (gzip est correct / bon, surtout si je supprime les "espaces vides avec des zéros")?
g19fanatic
comment dderiez-vous l'image sur le disque dur?
g19fanatic
2
@ g19fanatic L'image disque non compressée est "à l'intérieur" de l'image squashfs. Vous montez l’image squashfs puis dd l’image qu’elle contient sur le disque de destination.
Doug65536
@ g19fanatic La compression était excellente (presque identique à gzip dans mon cas). mksquashfs était rapide aussi, il est parallélisé. Sur mon 990x (6 cœurs), il était en fait limité par la vitesse d’écriture du disque de destination, environ 100 Mo / s.
Doug65536
3
@ g19fanatic Vous pouvez diffuser en squashfs en utilisant les drapeaux -pou -pfpour lui transmettre un pseudo-fichier. Un pseudo fichier peut être utilisé pour créer des nœuds de périphérique que vous ne pouvez pas utiliser autrement sans root (utile pour créer des images dans le cadre d'un processus de construction) ou pour transmettre en continu la sortie d'une commande dans l'image. L'un des exemples donnés dans la documentation ( /usr/share/doc/squashfs-tools/examples/pseudo-file.examplesur Debian / Ubuntu) consiste input f 444 root root dd if=/dev/sda1 bs=1024 count=10à copier le premier 10K d'une image disque dans un fichier nommé "entrée" dans l'image squashfs.
Brian Campbell
15

Si l'image est en lecture seule, vous pouvez également utiliser nbdkit ( page de manuel ) et son plug-in xz (xz devrait fournir une meilleure compression et des temps d'accès aléatoires supérieurs à ceux de gzip).

Créer l'image de partition compressée

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

Une --block-sizeoption de 16 Mio devrait fournir de bonnes performances d'accès aléatoire.

Remarque: vous pouvez utiliser d'autres programmes de compression xz tels que pixz, qui fournit une compression parallèle. Assurez-vous simplement de fractionner la sortie en plusieurs petits blocs, sinon nbdkit doit décompresser de nombreuses données. Par exemple, à compter de septembre 2015, pxz ne prend pas cela en charge.

Servez-le avec nbdkit

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

Se connecter au serveur NBD

nbd-client 127.0.0.1 10809 /dev/nbd0 -nofork

Montez-le en lecture seule

mount -o ro /dev/nbd0 sda1

Lorsque vous avez terminé

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

Arrêtez nbdkit en appuyant sur Ctrl+ C(ou avec kill ).

Cristian Ciupitu
la source
15

Essayer 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 est un système de fichiers basé sur FUSE pour les variantes Unix, y compris Linux. Son objectif est de monter des archives (tar, tar.gz, etc.) sur un point de montage où elles peuvent être lues ou écrites comme avec tout autre système de fichiers. Cela rend l'accès au contenu de l'archive, qui peut être compressé, transparent pour les autres programmes, sans les décompresser.

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

Après avoir monté l’archive, vous pouvez utiliser son contenu comme un fichier normal. Vous pouvez peut-être obtenir une table de partition ou convertir une image de montage avec les outils qemu.

squashfs utile pour démarrer à partir d'une image, mais beaucoup plus complexe pour la sauvegarde.

eri
la source
Parfait! C'est la solution la plus simple et la plus élégante à ce jour. Je me demande pourquoi il n'y a pas de vote ici.
TranslucentCloud
Je pense que c’est parce que si vous montez une archive telle que disk.img.gz sur un dossier avec archivemount, par exemple / mnt /, vous obtiendrez un fichier unique /mnt/disk.img, que vous devrez alors monter ailleurs. La question veut plutôt quelque chose qui puisse décompresser les deux en une seule étape (et archivemount semble capable de le faire sur .tar.gz, mais pas sur les images brutes gzippées).
p91paul
2
Cette réponse est aussi très intéressante. Je crois que squashfs reçoit plus d'amour parce qu'il a plus de conscience. J'ai instantanément reconnu le nom, mais je n'ai jamais entendu parler d'Archivemount. Je vais devoir essayer aussi!
g19fanatic
2
archivemount ne permet pas de monter une image créée par commandedd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.ddimg.gz
Sergei
3
D'accord - au moment de la rédaction, archivemount prend en charge les archives tar gzippées, mais non les fichiers gzippés ordinaires.
mwfearnley
10

Cette réponse complète la réponse de Cristian Ciupitu . Si vous utilisez la compression xz avec une taille de bloc raisonnable, vous pouvez accéder à l'image disque à l'aide de guestfish ou d'autres outils libguestfs tels que:

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

Pas vraiment. Vous ne pouvez pas vraiment rechercher un bloc spécifique dans le fichier compressé sans tout d'abord décompresser, ce qui rend difficile l'utilisation de l'image compressée en tant que périphérique de bloc.

Vous pouvez utiliser quelque chose comme dumpet restore(ou tarvraiment), qui utilisent tous un format de diffusion en continu ... afin de pouvoir accéder à des fichiers individuels en balayant efficacement le flux non compressé. Cela signifie que si le fichier souhaité se trouve à la fin de l'archive compressée, l'attente peut être longue, mais cela ne vous oblige pas à tout décompresser réellement sur le disque.

Utiliser tardes sauvegardes peut sembler un peu démodé, mais vous obtenez beaucoup de flexibilité.

alsacs
la source
1
Le problème réside dans le fait que je ne sais même pas si le fichier qui vous intéresse est réellement sur cette sauvegarde compressée ... Connaissez-vous un explorateur de fichiers qui parcourt l’ensemble de l’image .gz'd, conservez le fichier / répertoire structure en mémoire, fournit une vue simple de la structure et vous permet de "choisir" les fichiers (maintenant qu'il sait où ils existent) à extraire? C'est une spécification très niche ... mais je pourrais voir des tonnes d'utilisations pour quelque chose comme ça ... s'il existe.
g19fanatic
1
Si ce n'était pas le cas, seriez-vous capable de m'indiquer des instructions sur la manière de tirer la structure de l'image gz'd? Je serais capable de créer un tel programme (programme pour gagner sa vie ...) mais je suis aveugle sur le sujet de la décompression des données d'image et des spécificités des différents systèmes de fichiers.
g19fanatic
Je suppose que la construction de votre propre outil sera un projet plus vaste que celui que vous souhaitez réellement entreprendre. Cependant ... en supposant que vous ayez un système de fichiers ext [234], je suggérerais le paquet e2fsprogs , ou peut-être quelque chose comme fuse-ext2 . Les deux fournissent des outils d’espace utilisateur pour interagir avec les systèmes de fichiers ext [234].
larsks
Notez également que ce que vous avez ne semble pas être une image de système de fichiers, mais une image de disque complète, ce qui signifie que vous devez d'abord analyser la table de partition et localiser la partition appropriée.
larsks
Je me suis trompé dans la question ci-dessus et vais le réparer. Je fais habituellement une image basée sur une partition et sauvegarde une copie de la table des partitions. J'avais l'habitude de faire des copies de disques entiers mais je détestais avoir besoin de monter avec des options pour arriver au bon endroit.
g19fanatic
3

Un autre addendum à la réponse de Cristian Ciupitu :

Si vous nbdkitmontez une image de disque complète (par opposition à une image de partition), vous devrez peut-être spécifier la taille du bloc (taille du secteur du disque) lors de la connexion au serveur NBD, la valeur par défaut étant en 1024octets. Pour utiliser des 512octets à la place:

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

Après cela, le disque apparaîtra comme /dev/nbd0, et vous devriez pouvoir voir la table de partition en utilisant fdisk -l. Cependant, les partitions ne sont pas encore montables - Utilisez kpartx(à partir de la réponse de doug65536 ) pour créer des périphériques pour les partitions, par exemple:

kpartx -arv /dev/nbd0

Enfin, les partitions apparaîtront dans /dev/mapper/et vous pourrez les monter comme d’habitude. Veillez à utiliser le mode readonly ( -o ro), car le plugin xz ne prend en charge que les lectures suivantes:

mount -o ro /dev/mapper/nbd0p3 /mnt
friederbluemle
la source