Inhaltsverzeichnis
Daten packen
- tar - Der Klassiker, faßt ganze Verzeichnisbäume zu einer einzigen Datei zusammen
- Zstandard - Der zur Zeit beste Packer
- XZ - Der Neue, wird gelegentlich als TAR-Ersatz verwendet - Windows unterstützt diesen Packer auch und somit ist er für Kompatibilität zu bevorzugen
> tar -caf archiv.txz verzeichnis > tar -caf archiv.tar.zst verzeichnis
Beispiel für ein mit Passwort geschütztes Archiv
Aufgabenstellung:
Es soll das Verzeichnis "Daten" in einem möglichst sicher verschlüsseltem Archiv abgelegt werden. Dabei sollen unter Linux nur "Board-Mittel" zum Einsatz kommen und der sicherste verfügbare Verschlüsselungsalgorithmus verwendet werden.
beispielhafte Lösung:
> time tar cf - --exclude='/.cache/' Daten | gpg --no-options --no-symkey-cache --cipher-algo TWOFISH --digest-algo SHA512 -ac --batch --passphrase Geheim01 -o - | gzip -9 > daten.tar.gpg.gz > zcat daten.tar.gpg.gz | gpg --no-options --no-symkey-cache -d --batch --passphrase Geheim01
In diesem Fall kann GZIP sehr effektiv packen, weil GPG hier nur Textdaten an GZIP übergibt.
- gegenüber OpenSSL hat GPG zwei Vorteile:
- man muß beim entschlüsseln nicht wissen wie das Archiv genau verschlüsselt wurde
- siehe auch:
verschlüsseltes Archiv überprüfen:
> zcat daten.tar.gpg.gz | gpg --no-options --batch --passphrase geheim -do - | tar tf -
verschlüsseltes Archiv ins Home-Verzeichnis entpacken:
> zcat daten.tar.gpg.gz | gpg --no-options --batch --passphrase geheim -do - | tar f - -C ~/
verschlüsseltes Archiv in kleine Häppchen aufteilen, damit es auch auf dem USB-Stick mit FAT-Dateisystem untergebracht werden kann:
> split -b 2000m daten.tar.gpg.gz daten_tar_gpg_gz. > ls daten_tar_gpg_gz.* daten_tar_gpg_gz.aa daten_tar_gpg_gz.ab daten_tar_gpg_gz.ac
alle Teile des verschlüsselten Archives ins Home-Verzeichnis entpacken:
> cat daten_tar_gpg_gz* > daten_tar_gpg.gz > rm daten_tar_gpg_gz* > zcat daten_tar_gpg.gz | gpg --no-options --batch --passphrase geheim -do - | tar f - -C ~/
Theoretisch sollte das auch so funktionieren: zcat daten_tar_gpg_gz* | gpg -do - | tar f - -C ~/, aber leider nicht immer…
Archive
Um ein Verzeichnis von Dateien zu packen benötigt man ein Archivierungsprogramm.
Derartige Programme gibt es viele, allerdings ist hier das verbreitetste unser gutes altes tar und alle anderen Programme, die antraten um seine Nachfolge anzutreten, haben zu wenig Vorteile gehabt als das sie ihn vom Trohn stoßen könnten.
Hat man jetzt ein Archiv, dann kann man es, um Platz zu sparen, noch packen.
Dazu braucht man ein Packprogramm. Davon gibt es ebenfalls recht viele, wobei jedes dieser Programme auch in einem anderen Umfeld seine speziellen Vorteile hat.
Das möchte ich hier nicht genauer beleuchte.
Wir konzentrieren uns auf die zwei verbreitetsten, die auch immernoch State-of-the-Art sind: gzip und bzip2.
gzip schreibt für jede gepackte Datei nur einen Header, das hat seine Vor- und Nachteile!
Da Gzip nur einmal den Inhalt am Anfang der Datei analysiert und an Hand dieser Analyse einen vernünftigen Algorithmus auswählt, sollte man gzip nur für Dateien mit homogenem Inhalt (Textdateien, Logdateien) verwenden. Ein großer Pluspunkt von gzip ist auch, das es deutlich weniger Rechenzeit der CPU beim packen verbraucht als bzip2 zum Beispiel! Gzip-Dateien können (ohne sie auszupacken) mit zcat direckt angesehen werden.
Sollen dagegen Dateien mit inhomogenem Inhalt (MySQL-Bin-Logs, TAR-Archive von Verzeichnissen mit Binärdateien und Textdateien) gepackt werden, dann ist bzip2 die deutlich bessere Wahl. Es verbraucht zwar deutlich mehr Rechenzeit der CPU, aber das Ergebnis ist bis zu 12-mal kleiner als mit gzip. Das liegt daran, dass bzip2 die zu packende Datei, Blockweise packt. Für jeden Block wählt bzip2 jeweils den optimalen Pack-Algotithmus aus, dadurch wird bei gemischtem Inhalt der gesammten Datei trotzdem jede Datanart in der selbigen optimal gapackt. Allerdings schreibt bzip2 auch für jeden Block einen eigenen Header und das kostet Platz. Deshalb kann bzip2 z.B. Logdateien nicht so gut packen wie gzip zum Beispiel.
Einschränkungen
cpio (archivierer)
kann nicht komprimieren; kann nur ASCII und max. 8GB-Archive, standardmäßig wird ein überflüssiges Binärformat verwendet "-H crc": portable SVR4-Format mit einer Schecksumme je Datei "-H ustar": POSIX.1-Format Wegen seiner Dateigrößenbeschränkungen wird cpio nicht mehr von der POSIX geführt, Nachfolger sollte afio werden; Die POSIX führt pax als Nachfolger von cpio und tar ein. und so trat pax die Nachfolge von cpio, tar und afio im POSIX-Standard an…
tar (archivierer)
- kann nur ASCII und max. 8GB-Archive,
- kann mit Hardlinks und Sparse-Dateien nicht richtig umgehen, was beim
- Wiedereinspielen eines Archivs zu Problemen führen kann;
- mit star und bsdtar versucht man die Schwächen von tar/GNU-tar
- zu vermeiden;
- mehr als 8GB gehen
- mit "-H ustar" (POSIX 1003.1-1988)
- und "-H posix" (POSIX 1003.1-2001)
- Solaris: mehr als 8GB gehen mit "-E" (ustar)
- Linux : benutzt standardmäßig "-H ustar" (POSIX 1003.1-1988) / (GNU-tar ist kein echtes POSIX-Format, nur ähnlich)
Die POSIX führte pax als Nachfolger von cpio und tar ein;
afio (archivierer + packer)
Nachfolger von cpio sollte afio werden, allerdings stammt der Quellcode von afio aus einer zur LPGL (aktuelle Lizenz) nicht kompatiblen Lizenz, aus diesem Grund hat die FSF afio aus ihrem Software-Verzeichnis genommen;
star (archivierer)
- es kann xz nicht direckt einbinden
pax (archivierer + packer)
- POSIX-Nachfolger von cpio;
- benutzt standardmäßig "-x ustar" (POSIX 1003.1-1988)
- mit "-x cpio" ist es "IEEE 1003.2 / POSIX.2"-konform
rar (archivierer + packer)
- steht unter Lizenzschutz / ist kommerziell
XZ (packer)
XZ kann zwei Formate:
XZpackt nur ca. halb so gut wie LZMALZMAkann keine beschädigten Archive entpacken (im Gegensatz zu XZ)
p7zip/7za (archivierer + packer)
Der Unterschied zwischen 7z und 7za liegt darin, dass 7z dynamisch gelinkt wurde und 7za statisch gelinkt wurde.
7z kann keine beschädigten Archive entpacken (im Gegensatz zu rar und tar)
- owner/group wird nicht gespeichert
deshalb wird noch ein archivierer (z.B. tar oder star) gebraucht.
Verwendet man p7zip mit star, dann legt star sein TAR-Archiv erst im /tmp-Verzeichnis ab bevor das TAR-Archiv dann mit p7zip zum endgültigen komprimierten Archiv gemacht wird. Man muss also im /tmp-Verzeichnis genügend Platz vorhalten…
Vorteile
cpio (archivierer)
gibt es auf allen Unix-Systemen;
tar (archivierer)
ist das verbreitetste Unix-Archivierungsprogramm;
afio (archivierer + packer)
afio komprimiert Dateiweise und verwendet blockweise komprimierende Algorithmen, so das ein beschädigter Bereich nicht das gesamte Archiv zerstört, wie es bei tar passieren kann;
star (archivierer)
- hat nicht die beschränkungen von tar
- verwendet die gleichen Prozeduren wie restore/dump;
- das Standard-Format
xstarist so POSIX-konform wie möglich (POSIX.1-1988), dadurch können mit anderen tar-Implementationen nur 100+130 Zeichen des Dateinamens gelesen werden - mit "H=pax" ist star "POSIX-1003.1-2001"-konform, es ist strikt deshalb sind die "POSIX.1-2001"-Erweiterungen nicht enthalten
- wird star mit dem Namen
taraufgerufen, dann istxustardas Standard-Format, dieses Format enthält auch die "POSIX.1-2001"-Erweiterungen - mit "H=exustar" verwendet star den "POSIX.1-2001"-Erweiterten Header zwingend und kann dann auch (als einzige tar-Implementation unter Linux) ALC's (-acl) speichern
- mit "H=exustar -dump" speichert star mehr Metadaten als üblich, das ist der "beste" Archivierungs-Mode (wenn man "-dump" gesetzt hat, braucht man "H=exustar" nicht mehr angeben, diese Funktionalität ist inklusive)
- ein, durch verbesserte Pufferung, schneller Archivierer
- beherscht UNICODE UTF-8
- versteht
find-Ausdrücke (star -find), auch beim lesen von Archiven - sollte ein Dateisystem beschädigt worden sein, kann star nach einem "fsck -y" alle fehlenden Dateien wieder entpacken (star -diff) ohne die vorhandenen unnötiger weise auch auspacken zu müssen
pax (archivierer + packer)
(Nachfolger für cpio und tar, einziger POSIX.2-Archivierer) kann alle cpio- und tar-Archive lesen und schreiben; kann POSIX.2;
zip (archivierer + packer)
ist das verbreitetste Windoofs-Archivierungsprogramm, Passwortschutz, kann beschädigte Archive manchmal reparieren
gzip (packer)
sehr verbreitet, packt Dateien mit einheitlichen Dateninhalt am besten; verbraucht sehr wenig Rechenleistung, packt nicht ganz so gut wie zip; kann nur eine Datei komprimieren, braucht also noch einen Archivierer;
Es gibt auch eine Implementierung von GZip, die parallel auf mehreren CPU-Kernen gleichzeitig packen kann, sie heißt pigz.
pigz steht für Parallel Implementation of GZip. Sie ist ein funktional
vollständiger Ersatz für gzip, der bei der Datenkompression mehrere Prozessoren oder Prozessorkerne nutzt.
Den besten Kompromiss zwischen Packungsdichte, Systemleistungsverbrauch und Packzeit, bietet gzip -1.
bzip2 (packer)
- sehr verbreitet, ist für Dateien mit gemischtem Dateninhalt optimiert;
- verbraucht deutlich mehr Rechenleitung als gzip;
- kann nur eine Datei komprimieren, braucht also noch einen Archivierer;
rar (archivierer + packer)
kann beschädigte Archive entpacken
XZ (packer)
Die XZ-Utils stellen die gleiche LZMA-Kompression wie 7-Zip bereit, aber in einem anderen Format, das laut den Entwicklern immer populärer wird und besser zu POSIX-Systemen passt.
- ca. 30% besser als gzip
- ca. 15% besser als bzip2
- legt crc64-Checksummen an und kann deshalb auch defekte Archive entpacken
- POSIX-konformer als 7zip
- im LZMA-Format wird etwa doppelt so gut gepackt wie bzip2 allerdings ohne Checksummen
p7zip/7za (packer)
Komprimiert teilweise besser als bzip2 und zip; beherscht UNICODE, verschlüssellung, Passwortschutz, Selbstentpacker und kann Archive mit beschädigten Dateien entpacken.
Archivierungsprogramme, die 7z unterstützen
Der Unterschied zwischen 7z und 7za liegt darin, dass 7z dynamisch gelinkt wurde und 7za statisch gelinkt wurde.
- p7zip/7za (portabeles Kommandozeilenprogramm)
- star (einzige tar-Implementation, die unter Linux ACL's speichern kann)
- ark (KDE-FrontEnd für verschiedene Kommandozeilenarchivierer)
- File Roller (GNOME-Archivierungstool)
- PeaZip (in Free Pascal geschrieben)
Beispiele
# find [Verzeichnis/Datei] | cpio -oH ustar --sparse > [Archiv.tar] # tar cjf [Archiv.tar.bz2] [Verzeichnis/Datei] # tar cJf [Archiv.tar.xz] [Verzeichnis/Datei] # tar cf - [Verzeichnis/Datei] | 7za a -si [Archiv.tar.7z] # pax -wf [Archiv.tar] [Verzeichnis/Datei] # pax -wjf [Archiv.tar.bz2] [Verzeichnis/Datei] # 7za a [Archiv.7z] [Verzeichnis/Datei] # 7za a -sfx [Archiv.exe] [Verzeichnis/Datei] # Archiv MUSS auch in Unix/Linux auf ".exe" enden!] # 7za a -sfx -mx=9 [Archiv.exe] [Verzeichnis/Datei] # Archiv mit max. Kompressionsrate # 7za a -v1g [Archiv.7z] [Verzeichnis/Datei] # 1GB-Archive # pax -w [Verzeichnis/Datei] | xz -z > [Archiv.tar.xz] # cat datei.img | xz -z > datei.img.xz # mit xz per Pipe packen # xz -t datei.img.xz # mit xz testen # cat datei.img.xz | xz -d > datei.img # mit xz per Pipe entpacken
### mit star ein einfaches tar-Archiv (POSIX.1-1988) erstellen # star cf [Archiv.tar] [Verzeichnis/Datei]
### mit star ein modernes tar-Archiv (POSIX.1-2001 + Erweiterungen) erstellen # star c H=exustar -f [Archiv.tar] [Verzeichnis/Datei]
### mit star können auch ACL's gesichert werden # star c H=exustar -acl -f [Archiv.tar] [Verzeichnis/Datei]
### star User-Daten, ACL's und Attribute sichern
# star c H=exustar -pax-p e -f [Archiv.tar] [Verzeichnis/Datei]
### star soll alle Meta-Daten sichern, die es sichern kann
# star c -dump -f [Archiv.tar] [Verzeichnis/Datei]
### mit star ein gepacktes tar-Archiv mit allen Meta-Daten erstellen # star c -7z -dump -f [Archiv.tar.7z] [Verzeichnis/Datei]
### eine Datei verschlüsselt mit maximaler Kompression verpaken # zip -9 -e [Archiv.tar.zip] [Datei] # zip -9 -r -e [Archiv.tar.zip] [Verzeichnis/]
Inhalt zeigen
# cpio --list < [Archiv.tar] # cpio --list < [Archiv.newc] # pax [Archiv.tar] # 7za l [Archiv.7z]
testen
# tar tJf [Archiv.tar.xz] # xz -t [Archiv.tar.xz] # xz -dc [Archiv.tar.xz] | pax # 7za t [Archiv.7z] # star t -7z -f [Archiv.tar.7z]
entpacken
# tar xJf [Archiv.tar.xz] # pax -rf [Archiv] # pax -rjf [Archiv.tar.bz2] # xz -dc [Archiv.tar.xz] | pax -r # 7za e [Archiv.7z] # mit relativem Pfad # 7za x [Archiv.7z] # mit absolutem Pfad # 7za e -so [Archiv.tar.7z] | tar xf - # owner/group mit entpacken (relativer Pfad) # 7za x -so [Archiv.tar.7z] | tar xf - # owner/group mit entpacken (absoluter Pfad) # star x -7z -f [Archiv.tar.7z]
kopieren
# pax -rwp e [Quelle] [Ziel] # mkdir -p [Ziel] ; star -copy -p [Quelle] [Ziel] # star -copy [Quell-Datei] [Ziel-Verzeichnis] # star -copy [Datei1] [Datei2] [Datei3] [Ziel-Verzeichnis] # star -copy -C [Quell-Verzeichnis] . [Ziel-Verzeichnis] # star c -dump -f - [Quell-Verzeichnis/-datei] | ssh root@192.168.0.1 'star xf -' # ssh root@192.168.0.1 'star c -dump -f - [Quell-Verzeichnis/-datei]' | star xf - # star c H=exustar -f - [Quell-Verzeichnis/-datei] | ssh root@192.168.0.1 'tar xf -' # tar cf - [Quell-Verzeichnis/-datei] | ssh root@192.168.0.1 'tar xf -' # ssh root@192.168.0.1 'tar cf - [Quell-Verzeichnis/-datei]' | tar xf -
mit Passwort verschlüsseln
# 7za a -mhe=on -p[geheim] [Archiv.7z] [Verzeichnis/Datei]
TAR - der bekannteste Vertreter
ein unkomprimiertes Archiv anlegen
> tar cf Archiv.tar Datei_1.txt Datei_2.txt Datei_3.txt
zum unkomprimierten Archiv einige Dateien hinzufühgen
> tar rf Archiv.tar Datei_4.txt Datei_5.txt Datei_6.txt
den Inhalt des unkomprimierten Archives anzeigen bzw. das entpacken testen (Sicherheitsüberprüfung)
> tar tf Archiv.tar
den Inhalt des unkomprimierten Archives entpacken
> tar xf Archiv.tar
das komplette Home-Verzeichnis, ohne Cache-Daten, packen
> tar cf - --exclude='.cache' ~/
Die Option --exclude= erwartet Pattern im glob-Format.
das komplette Home-Verzeichnis, ohne das Cache-Verzeichnis, packen
> tar cf - --exclude='*/.cache/*' ~/
Fazit
Das beste Archivierungsprogramm ist star, da kein anderer Archivierer im Moment diese Geschwindigkeit bietet und dabei noch alle Meta-Daten, inklusive ACL's, speichern kann.
Und das beste Packprogramm ist xz, da es in meinem Praxistest sogar noch etwas besser gepackt hat als 7z und darüber hinaus eine bessere POSIX-konformität bietet als 7z. Leider kann von beiden aber nur 7z seine Archive mit Passwort schützen.
Leider lassen sich die beiden besten nur etwas umständlich kombinieren, einfacher geht es mit dem zweitbesten Packprogramm 7z.
Die Kombination star und 7z ist schnell, packt gut und ist einfach zu handhaben. Damit ist das mein persönlicher Favorit (bis star auch noch mit xz umgehen kann).
# star c -7z -dump -f [Archiv.tar.7z] [Verzeichnis/Datei]
