Ist es möglich, ein gzip-komprimiertes dd-Image im laufenden Betrieb einzubinden?

66

Ich erstelle gerne ein Image-Backup, wenn ich zum ersten Mal ein System sichern möchte. Nach diesem ersten Mal verwende ich rsync, um inkrementelle Sicherungen durchzuführen.

Meine übliche Image-Sicherung sieht wie folgt aus:

Hängen Sie den leeren Raum ein und nullen Sie ihn aus:

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

rm temp.dd

mounten und dd das Laufwerk beim Komprimieren

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

Um das System wieder normal zu machen, mache ich normalerweise a

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

Dies ist wirklich unkompliziert und ermöglicht es mir, das "gesamte Laufwerk" zu speichern, aber wirklich nur den verwendeten Speicherplatz zu sparen.

Hier liegt das Problem. Nehmen wir an, ich mache das oben genannte, aber nicht auf einem sauberen System und bekomme die rsync-Sicherungen nicht schnell genug zum Laufen und es gibt Dateien, auf die ich zugreifen möchte, die sich auf dem Image befinden. Angenommen, ich habe nicht den Speicherplatz, um das Image zu entpacken und auf ein Laufwerk zu kopieren, sondern möchte das Image einbinden, um einzelne Dateien daraus zu entfernen. Ist dies möglich?

Normalerweise würde man das dd-Image nicht komprimieren, so dass Sie es einfach mit einbinden können -o loop... aber das ist nicht mein Fall ...

Irgendwelche Vorschläge für die schnelle Montage des komprimierten Bilds?

Würde die Verwendung von AVFS zum 'Mounten' der gz-Datei und das Mounten der internen dd.img funktionieren (ich glaube nicht ... aber müsste überprüft werden ...)?

g19fanatic
quelle
Sie sollten SquashFSfür diese Art von Dingen verwenden. Duplizierte Dateien werden ebenfalls de-dupiert.
Avio
Es sieht so aus, als würde dieser Kerl das tun, wonach Sie fragen: blogs.gnome.org/muelli/2012/10/…
Joshua
Ich halte mich an Avios Vorschlag. Das einzige, was squashfs nicht archiviert, ist acls. Es archiviert Xattrs, also Selinux-Attribute usw. Wenn Sie Acls nicht verwenden, ist Squashfs IMHO der richtige Weg. Ich musste kürzlich "nur für den Fall" einige alte Laufwerke archivieren, die bereits auf neuen Speicher migriert wurden, und Squashfs war perfekt für diesen Job.
Kuba Ober

Antworten:

66

Dies hängt davon ab, ob es sich bei dem Festplattenimage um ein vollständiges Festplattenimage oder nur um eine Partition handelt.

Waschen der Partition (en)

Wenn die Festplatte in gutem Zustand ist, erhalten Sie eine bessere Komprimierung, wenn Sie den leeren Bereich auf der Festplatte mit Nullen reinigen. Wenn der Datenträger ausfällt, überspringen Sie diesen Schritt.

Wenn Sie ein Image einer gesamten Festplatte erstellen, möchten Sie alle Partitionen auf der Festplatte löschen.

VORSICHT: Achten Sie darauf, dass Sie ofeine Datei in der bereitgestellten Partition festlegen möchten , NICHT DIE PARTITION SELBST!

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

Partitionsimage erstellen

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

Wo sdaist der Name des Geräts und 1ist die Partitionsnummer. Passen Sie dies an Ihr System an, wenn Sie ein Image eines anderen Geräts oder einer anderen Partition erstellen möchten.

Erstellen eines vollständigen Image

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

Wo sdaist der Name des Geräts? Passen Sie dies an Ihr System an, wenn Sie ein anderes Gerät abbilden möchten.

Kompression

Erstellen Sie ein "Squashfs" -Bild, das das gesamte unkomprimierte Bild enthält.

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

Streaming-Komprimierung

Um zu vermeiden, dass eine separate temporäre Datei die volle Größe der Festplatte annimmt, können Sie ein Squashfs-Image streamen.

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

Mounten eines komprimierten Partitionsimages

Mounten Sie zuerst das Squashfs-Image und dann das im gemounteten Squashfs-Image gespeicherte Partitions-Image.

mkdir squash_mount
sudo mount squash.img squash_mount

Nun haben Sie das komprimierte Image gemountet, mounten Sie das Image selbst (das sich innerhalb des Squashfs-Images befindet)

mkdir compressed_image
sudo mount squash_mount/sda1_backup.img compressed_image

Nun ist Ihr Bild unter gemountet compressed_image.

BEARBEITEN: Wenn Sie das Festplatten-Image an dieser Stelle einfach auf einer Partition wiederherstellen möchten (anstatt es zum Durchsuchen / Lesen des Inhalts anzuhängen), müssen Sie stattdessen nur dddas Image squash_mount/sda1_backup.imgauf dem Ziel speichern mount.

Mounten eines komprimierten vollständigen Disk-Image

Dazu müssen Sie ein Paket namens kpartx verwenden. Mit kpartx können Sie einzelne Partitionen in ein vollständiges Festplatten-Image einbinden.

sudo apt-get install kpartx

Mounten Sie zuerst Ihre komprimierte Partition, die das vollständige Festplatten-Image enthält

mkdir compressed_image
sudo mount squash.img compressed_image

Jetzt müssen Sie Geräte für jede Partition im vollständigen Festplatten-Image erstellen:

sudo kpartx -a compressed_image/sda_backup.img

Dadurch werden Geräte für die Partitionen im vollständigen Datenträgerabbild erstellt, /dev/mapper/loopNpPwobei N die für das Loopback-Gerät zugewiesene Nummer und P die Partitionsnummer ist. Zum Beispiel: /dev/mapper/loop0p1.

Jetzt haben Sie die Möglichkeit, die einzelnen Partitionen im vollständigen Festplatten-Image zu mounten:

mkdir fulldisk_part1
sudo mount /dev/mapper/loop0p1 fulldisk_part1
doug65536
quelle
Interessanter Ansatz für dieses Problem (Squashfs statt Gzip). Ich bin mit den Squashfs-Werkzeugen ziemlich unbekannt. Können Sie die Ausgabe von dd pfeifen, um eine Squash-Partition im laufenden Betrieb zu erstellen, so wie Sie es mit der Gzip-Partition tun können? Wie sind die Komprimierungsverhältnisse (gzip ist in Ordnung / gut, vor allem, wenn ich "leeren Raum mit Nullen" lösche)?
g19fanatic
Wie würden Sie das Bild auf die Festplatte zurückschreiben?
g19fanatic
2
@ g19fanatic Das unkomprimierte Disk-Image befindet sich "innerhalb" des Squashfs-Images. Sie mounten das Squashfs-Image und speichern es dann auf der Zieldiskette.
Doug65536
@ g19fanatic Die Komprimierung war exzellent (in meinem Fall sehr ähnlich wie bei gzip). mksquashfs war auch schnell, es ist parallelisiert. Bei meinem 990x (6-Kern) war die Schreibgeschwindigkeit der Zielfestplatte auf 100 MB / s begrenzt.
Doug65536
3
@ g19fanatic Mit den Flags -poder können Sie Squashfs streamen -pf, um eine Pseudodatei zu übergeben. Eine Pseudodatei kann verwendet werden, um Geräteknoten zu erstellen, auf die Sie sonst nicht ohne root verzichten können (nützlich zum Erstellen von Images als Teil eines Erstellungsprozesses) oder um die Ausgabe eines Befehls in das Image zu streamen. Eines der in den Dokumenten angegebenen Beispiele ( /usr/share/doc/squashfs-tools/examples/pseudo-file.exampleunter Debian / Ubuntu) besteht darin input f 444 root root dd if=/dev/sda1 bs=1024 count=10, die ersten 10 KB von einem Disk-Image in eine Datei mit dem Namen "input" im squashfs-Image zu kopieren.
Brian Campbell
15

Wenn das Bild schreibgeschützt ist , können Sie auch nbdkit ( man page ) und das xz-Plugin verwenden (xz sollte eine bessere Komprimierungs- und Direktzugriffszeit bieten als gzip).

Erstellen Sie das komprimierte Partitionsimage

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

Eine --block-sizeOption von 16 MB sollte eine gute Direktzugriffsleistung bieten.

Hinweis: Sie können alternative xz-Komprimierungsprogramme wie pixz verwenden, die eine parallele Komprimierung ermöglichen. Stellen Sie jedoch sicher, dass die Ausgabe in mehrere kleine Blöcke aufgeteilt wird. Andernfalls muss nbdkit viele Daten dekomprimieren. Zum Beispiel unterstützt pxz ab September 2015 dies nicht.

Servieren Sie es mit Nbdkit

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

Stellen Sie eine Verbindung zum NBD-Server her

nbd-client 127.0.0.1 10809 /dev/nbd0 -nofork

Mounten Sie es schreibgeschützt

mount -o ro /dev/nbd0 sda1

Wenn Sie fertig sind

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

Beenden Sie nbdkit durch Drücken von Ctrl+ C(oder mit kill ).

Cristian Ciupitu
quelle
15

Versuchen 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 ist ein FUSE-basiertes Dateisystem für Unix-Varianten, einschließlich Linux. Der Zweck ist das Mounten von Archiven (z. B. tar, tar.gz usw.) an einem Mount-Punkt, von dem aus sie wie mit jedem anderen Dateisystem gelesen oder beschrieben werden können. Dadurch wird der Zugriff auf die Inhalte des Archivs, die komprimiert sein können, für andere Programme transparent, ohne sie zu dekomprimieren.

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

Nach dem Mounten des Archivs können Sie den Inhalt wie eine normale Datei verwenden. Vielleicht Partitionstabelle abrufen oder konvertieren, Image mit QEMU-Tools mounten.

squashfs nützlich für das Booten vom Image, aber sehr komplex für das Backup.

eri
quelle
Perfekt! Dies ist die bisher einfachste und eleganteste Lösung. Ich frage mich, warum es hier keine Stimmen gibt.
TranslucentCloud
Ich denke, es liegt daran, dass wenn Sie ein Archiv wie disk.img.gz in einen Ordner mit archivemount mounten, sagen wir / mnt /, Sie eine einzelne Datei /mnt/disk.img bekommen, die Sie dann woanders mounten müssen. Die Frage möchte stattdessen, dass etwas in der Lage ist, beide in einem Schritt zu entpacken (und Archivierung scheint in der Lage zu sein, dies auf .tar.gz, aber nicht auf gezippten Rohbildern zu tun).
p91paul
2
Diese Antwort ist auch sehr interessant. Ich glaube, dass Squashfs mehr Liebe bekommen, weil es mehr Bewusstsein hat. Ich habe den Namen sofort erkannt, aber noch nie von archivemount gehört. Ich werde es auch versuchen müssen!
g19fanatic
2
Mit archivemount ist es nicht möglich, ein von commanddd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.ddimg.gz
Sergei
3
Einverstanden - Zum Zeitpunkt des Schreibens unterstützt archivemount tar-Archive, die komprimierte, aber keine komprimierten Dateien enthalten.
Mwfearnley
10

Diese Antwort ergänzt die Antwort von Cristian Ciupitu . Wenn Sie die xz-Komprimierung mit einer angemessenen Blockgröße verwenden, können Sie mit guestfish oder anderen libguestfs- Tools wie folgt auf das Disk-Image zugreifen :

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

Nicht wirklich. Sie können nicht wirklich nach einem bestimmten Block in der komprimierten Datei suchen, ohne das Ganze zuerst zu dekomprimieren, was es schwierig macht, das komprimierte Bild als Blockgerät zu verwenden.

Sie können so etwas wie dumpund restore(oder tarwirklich) verwenden, die alle ein Streaming-Format verwenden. Sie können also auf einzelne Dateien zugreifen, indem Sie den unkomprimierten Stream effektiv durchsuchen. Wenn sich die gewünschte Datei am Ende des komprimierten Archivs befindet, kann es sein, dass Sie lange warten müssen, Sie müssen jedoch nicht alles auf die Festplatte dekomprimieren.

Die Verwendung tarfür Backups mag ein bisschen altmodisch erscheinen, aber Sie erhalten viel Flexibilität.

larsks
quelle
1
Das Problem liegt in der Tatsache, dass ich nicht einmal weiß, ob sich die Datei von Interesse tatsächlich auf dieser komprimierten Sicherung befindet ... Kennen Sie einen Datei-Explorer, der das gesamte .gz-Image durchläuft? Behalten Sie die Datei / dir bei Struktur im Speicher, bieten eine einfache Ansicht der Struktur und ermöglichen es Ihnen, Dateien (jetzt, wo es weiß, wo sie existieren) zum Extrahieren auszuwählen? Es ist eine sehr Nischenspezifikation ... aber ich könnte Tonnen von Verwendungszwecken für so etwas sehen ... wenn es existiert.
g19fanatic
1
Wenn nicht, könnten Sie mir Anweisungen geben, wie Sie die Struktur aus dem gz'd-Image ziehen können? Ich wäre in der Lage, ein solches Programm (Programm für den Lebensunterhalt ...) zu erstellen, bin aber blind für das Thema Dekomprimierung von Bilddaten und die Besonderheiten verschiedener Dateisysteme.
g19fanatic
Ich vermute, dass der Bau Ihres eigenen Tools ein größeres Projekt sein wird, als Sie wirklich durchführen möchten. Unter der Annahme, dass Sie ein ext [234] -Dateisystem haben, würde ich das Paket e2fsprogs oder vielleicht etwas wie fuse-ext2 vorschlagen . Beide bieten User-Space-Tools für die Interaktion mit ext [234] -Dateisystemen.
Larsks
Beachten Sie auch, dass es sich bei dem, was Sie haben, anscheinend nicht um ein Dateisystem-Image handelt, sondern um ein vollständiges Festplatten-Image. Dies bedeutet, dass Sie zuerst die Partitionstabelle analysieren und die entsprechende Partition suchen müssen.
Larsks
Ich habe mich in der obigen Frage vertippt und werde das Problem beheben. Normalerweise mache ich ein partitionsbasiertes dd-Image und speichere eine Kopie der Partitionstabelle. Früher habe ich ganze Platten kopiert, aber ich hasste es, mit Optionen zu mounten, um an den richtigen Ort zu gelangen.
g19fanatic
3

Ein weiterer Nachtrag zu Cristian Ciupitu's Antwort :

Wenn Sie nbdkitein vollständiges Festplatten-Image (im Gegensatz zu einem Partitions-Image) bereitstellen, müssen Sie möglicherweise die Blockgröße (Sektorgröße der Festplatte) angeben, wenn Sie eine Verbindung zum NBD-Server herstellen, da standardmäßig 1024Bytes verwendet werden. So verwenden Sie 512stattdessen Bytes:

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

Danach erscheint der Datenträger als /dev/nbd0und Sie sollten in der Lage sein, die Partitionstabelle mit anzuzeigen fdisk -l. Die Partitionen sind jedoch noch nicht bereitstellbar. Verwenden Sie kpartx(aus der Antwort von doug65536 ), um Geräte für die Partitionen zu erstellen, z.

kpartx -arv /dev/nbd0

Schließlich werden die Partitionen in angezeigt /dev/mapper/, und Sie können sie wie gewohnt bereitstellen. Stellen Sie sicher, dass Sie den schreibgeschützten Modus ( -o ro) verwenden, da das xz-Plugin nur Lesevorgänge unterstützt:

mount -o ro /dev/mapper/nbd0p3 /mnt
friederblümle
quelle