Benutzer-Werkzeuge

Webseiten-Werkzeuge


daten_packen

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.

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)

  1. kann nur ASCII und max. 8GB-Archive,
  2. kann mit Hardlinks und Sparse-Dateien nicht richtig umgehen, was beim
  3. Wiedereinspielen eines Archivs zu Problemen führen kann;
  4. mit star und bsdtar versucht man die Schwächen von tar/GNU-tar
  5. zu vermeiden;
  6. mehr als 8GB gehen
    1. mit "-H ustar" (POSIX 1003.1-1988)
    2. und "-H posix" (POSIX 1003.1-2001)
  7. Solaris: mehr als 8GB gehen mit "-E" (ustar)
  8. 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)

  1. es kann xz nicht direckt einbinden

pax (archivierer + packer)

  1. POSIX-Nachfolger von cpio;
  2. benutzt standardmäßig "-x ustar" (POSIX 1003.1-1988)
  3. mit "-x cpio" ist es "IEEE 1003.2 / POSIX.2"-konform

rar (archivierer + packer)

  1. steht unter Lizenzschutz / ist kommerziell

XZ (packer)

XZ kann zwei Formate:

  1. XZ packt nur ca. halb so gut wie LZMA
  2. LZMA kann 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)

  1. hat nicht die beschränkungen von tar
  2. verwendet die gleichen Prozeduren wie restore/dump;
  3. das Standard-Format xstar ist so POSIX-konform wie möglich (POSIX.1-1988), dadurch können mit anderen tar-Implementationen nur 100+130 Zeichen des Dateinamens gelesen werden
  4. mit "H=pax" ist star "POSIX-1003.1-2001"-konform, es ist strikt deshalb sind die "POSIX.1-2001"-Erweiterungen nicht enthalten
  5. wird star mit dem Namen tar aufgerufen, dann ist xustar das Standard-Format, dieses Format enthält auch die "POSIX.1-2001"-Erweiterungen
  6. 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
  7. 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)
  8. ein, durch verbesserte Pufferung, schneller Archivierer
  9. beherscht UNICODE UTF-8
  10. versteht find-Ausdrücke (star -find), auch beim lesen von Archiven
  11. 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)

  1. sehr verbreitet, ist für Dateien mit gemischtem Dateninhalt optimiert;
  2. verbraucht deutlich mehr Rechenleitung als gzip;
  3. 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.

  1. ca. 30% besser als gzip
  2. ca. 15% besser als bzip2
  3. legt crc64-Checksummen an und kann deshalb auch defekte Archive entpacken
  4. POSIX-konformer als 7zip
  5. 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.

  1. p7zip/7za (portabeles Kommandozeilenprogramm)
  2. star (einzige tar-Implementation, die unter Linux ACL's speichern kann)
  3. ark (KDE-FrontEnd für verschiedene Kommandozeilenarchivierer)
  4. File Roller (GNOME-Archivierungstool)
  5. 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]
/home/http/wiki/data/pages/daten_packen.txt · Zuletzt geändert: von manfred