Ich habe sechs logische Linux-Volumes, die zusammen eine virtuelle Maschine sichern. Die VM wird derzeit heruntergefahren, sodass Sie problemlos konsistente Images davon erstellen können.
Ich möchte alle sechs Bilder in einem Archiv zusammenfassen. Trivialerweise könnte ich so etwas tun:
cp /dev/Zia/vm_lvraid_* /tmp/somedir
tar c /tmp/somedir | whatever
Aber das schafft natürlich eine zusätzliche Kopie. Ich möchte die zusätzliche Kopie vermeiden.
Der naheliegende Ansatz:
tar c /dev/Zia/vm_lvraid_* | whatever
funktioniert nicht, da tar die dateien als besondere erkennt (symlinks in diesem fall) und grundsätzlich ln -s
im archiv ablegt. Oder, mit --dereference
oder direkt darauf hingewiesen /dev/dm-X
, erkennt es sie als spezielle (Gerätedateien) und speichert sie grundsätzlich mknod
im Archiv.
Ich habe nach Befehlszeilenoptionen für tar gesucht, um dieses Verhalten zu überschreiben, und konnte keine finden. Ich habe auch versucht cpio
, das gleiche Problem, und konnte dort auch keine Optionen finden, um es zu überschreiben. Ich habe es auch versucht 7z
(ebenso). Gleiche mit pax
. Ich habe es sogar versucht zip
, was sich gerade selbst verwirrt hat.
edit: Wenn man sich den Quellcode von GNU tar und GNU cpio ansieht, sieht es so aus, als ob keiner von beiden dies kann. Zumindest nicht ohne ernsthafte Tricks (der spezielle Umgang mit Gerätedateien kann nicht deaktiviert werden). Vorschläge für ernsthafte Tricks wären also willkommen oder alternative Hilfsprogramme.
TLDR: Gibt es einen Archivierer, der mehrere Disk-Images (von Raw-Geräten) zusammenpackt und diese Ausgabe streamen kann, ohne zusätzliche Kopien auf der Festplatte anzufertigen? Meine Präferenz würde in einem gemeinsamen Format wie POSIX oder GNU tar ausgegeben.
quelle
Antworten:
Also wollte ich das kürzlich mit machen
tar
. Einige Nachforschungen ergaben, dass es mehr als unsinnig war, dass ich es nicht konnte. Ich habe mir dieses seltsamesplit --filter="cat >file; tar -r ..."
Ding ausgedacht , aber es war furchtbar langsam. Und je mehr ich darüber las,tar
desto unsinniger schien es.Sie sehen,
tar
ist nur eine verkettete Liste von Datensätzen. Die konstituierenden Dateien werden in keiner Weise geändert - sie befinden sich vollständig im Archiv. Sie sind jedoch an 512-Byte- Blockgrenzen blockiert , und vor jeder Datei steht ein Header . Das ist es. Das Header-Format ist wirklich sehr einfach.Also schrieb ich meine eigenen
tar
. Ich nenne es ...shitar
.Das ist wirklich das Fleisch und die Kartoffeln. Es schreibt die Überschriften und berechnet die Chksum - was relativ gesehen der einzige schwierige Teil ist. Es macht das
ustar
Header-Format ... vielleicht . Zumindest emuliert es das, was GNUtar
für dasustar
Header-Format hält, bis zu dem Punkt, dass es sich nicht beschwert. Und es steckt noch mehr dahinter, ich habe es nur noch nicht wirklich geronnen . Hier zeige ich Ihnen:Das ist
tar
. Alles ist mit\0
Nullen aufgefüllt, daher verwandle ich michem
zur\n
besseren Lesbarkeit in eWlines. Undshitar
:AUSGABE
Ich sage irgendwie da oben, weil das nicht
shitar
das Ziel ist -tar
macht das schon wunderbar. Ich wollte nur zeigen, wie es funktioniert - was bedeutet, ich muss auf die berührenchksum
. Wenn es das nicht gäbe, würde ich einem einfachdd
den Kopf abschneidentar
Akte loswerden und damit fertig sein. Das mag manchmal sogar funktionieren, aber es wird chaotisch, wenn sich mehrere Mitglieder im Archiv befinden. Trotzdem ist die Chksum wirklich einfach.Machen Sie zuerst 7 Leerzeichen (was eine seltsame Gnu-Sache ist, denke ich, wie in der Spezifikation 8 steht, aber was auch immer - ein Hack ist ein Hack) . Addieren Sie dann die Oktalwerte jedes Bytes im Header. Das ist dein Chksum. Sie benötigen also die Dateimetadaten, bevor Sie den Header erstellen, oder Sie haben keine Prüfsumme. Und das ist ein
ustar
meistens Archiv.In Ordnung. Nun, was soll es tun:
Das macht drei 500-MB-Disk-Images, formatiert und hängt jede und schreibt eine Datei in jede.
Hinweis - Anscheinend werden blockierte Geräte nur immer korrekt blockiert. Ziemlich praktisch.
Das ist
tar
der Inhalt der Datenträger-Gerätedateien im Stream und leitet die Ausgabe anxz
.Nun, der Moment der Wahrheit ...
Hurra! Extraktion...
Vergleich...
Und der Berg ...
Und so, in diesem Fall,
shitar
funktioniert es, denke ich. Ich möchte lieber nicht auf all die Dinge eingehen, die es nicht gut machen wird. Aber ich werde sagen - mach zumindest keine Zeilenumbrüche in den Dateinamen.Sie können dies auch tun - und sollten es vielleicht tun, wenn Sie die Alternativen in Betracht ziehen, die ich Ihnen angeboten habe
squashfs
. Nicht nur erhalten Sie das einzelne Archiv aus dem Stream gebaut - aber es istmount
möglich und builtin den Kernelvfs
:Aus pseudo-file.example :
Sie können auch verwenden
btrfs (send|receive)
, um ein Sub-Volume in einen beliebigenstdin
-fähigen Kompressor zu streamen . Dieses Subvolume muss nicht existieren, bevor Sie es als Kompressionscontainer verwenden möchten.Trotzdem über
squashfs
...Ich glaube nicht, dass ich dies gerecht mache. Hier ist ein sehr einfaches Beispiel:
Das ist nur das Inline-
-p
Argument fürmksquash
. Sie können eine Datei mit beliebig-pf
vielen Quellen erstellen . Das Format ist einfach: Sie definieren den Namen / Pfad einer Zieldatei im Dateisystem des neuen Archivs, geben ihm einen Modus und einen Eigentümer und legen fest, von welchem Prozess stdout ausgeführt und gelesen werden soll. Sie können so viele erstellen, wie Sie möchten - und Sie können LZMA, GZIP, LZ4, XZ ... verwenden. Hmm, es gibt mehr ... Komprimierungsformate, als Sie möchten. Und das Endergebnis ist ein Archiv, in das Siecd
.Mehr zum Format:
Dies ist natürlich nicht nur ein Archiv, sondern ein komprimiertes, einbindbares Linux-Dateisystem-Image. Das Format ist das des Linux-Kernels - es ist ein von Vanille-Kernel unterstütztes Dateisystem. Auf diese Weise ist es genauso verbreitet wie der Vanilla Linux-Kernel. Wenn Sie mir also sagen würden, dass Sie ein Vanilla-Linux-System verwenden, auf dem das
tar
Programm nicht installiert ist, wäre ich zweifelhaft - aber ich würde Ihnen wahrscheinlich glauben. Aber wenn Sie mir sagen würden, dass Sie ein Vanilla Linux-System verwenden, auf dem dassquashfs
Dateisystem nicht unterstützt wird, würde ich Ihnen nicht glauben.quelle
input f 444 root root dd if=/dev/sda1 bs=1024 count=10
ist f die Dateieingabe? Vielleicht ist es besser, ein Spielzeuggerät zu erstellen, es mit Daten zu füllen und daraus zu schreiben? Und braucht das alles root?input
Datei ist eine Datei imsquashfs
Archiv - das Dateisystem-Image, das sich aus der Ausführung des Befehls ergibt. Wenn Sie dies tunmksquash
, können Sie diese Pseudodateibefehle für Befehle angeben, die ausgeführt werden und von denen derstdout
beim Komprimieren erfasst wird.Ihr Problem hat mich einige Zeit verwirrt, und ich glaube, ich habe eine Lösung gefunden, die funktionieren würde.
Ich denke, Sie können mit 7z mit der
-si{NAME}
Flagge erreichen, was Sie wollen .Sie können sich an Ihre Bedürfnisse anpassen.
BEARBEITEN : Entfernen Sie die nutzlose Verwendung von Katze
quelle
7z
Manpage nicht, dass -si einen Dateinamen annehmen kann, aber es funktioniert. Es ist nicht perfekt (die Ausgabe kann nicht irgendwo weitergeleitet werden), aber es ist definitiv das Beste, was bisher in einem gemeinsamen Format ausgegeben wird.