Während in der Windows-Welt die "zip"-Dateien quasi als Standardformat für komprimierte Archive gelten, gehören in der Unix-Welt die Kompressionsprogramme gzip und bzip2 zum Standard-Repertoire. Obwohl *.zip Dateien und *.gz Dateien ein untereinander inkompatibles Dateiformat aufweisen, haben Sie eines gemeinsam: Beide machen vom Kompressionsalgorithmus Deflate Gebrauch. Reichen einem die Kompressionsraten von Deflate nicht aus, so greift man in der Unix-Welt oft auf bzip2 zurück, welches bessere Resultate liefert, jedoch den Preis eines höheren Rechenaufwandes sowohl beim Packen als auch beim Entpacken hat.
Noch bessere Kompressionsraten lassen sich mittels des Lempel-Ziv-Markow-Algorithmus (LZMA) erreichen. Interessanterweise ist der Rechenaufwand zum Entpacken von LZMA-komprimierten Dateien sogar geringer als bei der Verwendung von bzip2. Das freie Windows-Programm 7-Zip verwendet diesen Algorithmus standardmäßig und stellt außerdem mit dem daraus extrahierten LZMA Software Development Kit die Referenzimplementation des Algorithmus dar.
So wie man auch zwischen *.zip Dateien, *.gz Dateien und dem "Deflate"-Algorithmus als solchem unterscheiden muss, so gibt es auch bei LZMA und den dazugehörigen Dateiformaten einen Unterschied. Da diese diversen verschiedenen Formate, gemeinsam mit ihren verschiedenen Implementationen, derzeit noch relativ unbekannt und leicht verwechselbar sind, möchte ich versuchen im Folgenden einen Überblick zu geben.
| Format | Datei- endung |
MIME-Type | Art | Beschreibung | Referenz- Implementierung |
Lizenz d. Ref.Impl. |
|---|---|---|---|---|---|---|
| 7z | .7z | application/ x-7z-compressed |
Archiv von mehreren Dateien | Das Format unterstützt die Ablage mehrerer Dateien in einem Archiv unter Verwendung verschiedener Kompressionsalgorithmen: LZMA, PPMD, BZip2, Deflate. Maschinencode kann mit dem BCJ- oder BCJ2-Algorithmus vorbehandelt werden, um bessere Kompressionsfähigkeit zu erreichen. Für Dateinamen wird standardmäßig Unicode verwendet. Das Format unterstützt AES-Verschlüsselung. Einige Besonderheiten der Unix-Dateisysteme (z.B. Rechte oder Gerätedateien) werden nicht unterstützt. | 7-Zip | LGPL |
| LZMA (raw) | .lzma | application/ x-lzma (?) |
Datenstrom- / Einzeldatei-Kompression | Lediglich eine einzelne Datei bzw. ein Datenstrom kann in diesem Format komprimiert werden. Da keine speziellen Bytesequenzen im Header zur Erkennung des Formates vorgesehen sind, kann man LZMA-Raw-Dateien mit einfachen Mitteln nur an der Dateiendung oder einem ggf. übermittelten Mime-Type sicher erkennen. | 7-Zip bzw. LZMA SDK | Public domain |
| xz | .xz | application/ x-xz |
Datenstrom- / Einzeldatei-Kompression | Auch in diesem Format kann lediglich eine einzelne Datei bzw. ein Datenstrom komprimiert werden. Im Gegensatz zu LZMA-Raw ist ein unkomprimierter Header zum Erkennen des Dateityps sowie eine Prüfsumme vorhanden. Anstelle des LZMA-Algorithmus wird eine modifizierte Version (LZMA2) verwendet, die Unterstützung für gezieltes "flushing" bietet, unkomprimierte Teile enthalten kann und die Implementation eines Dekoders einfacher mache. Ebenso wie im 7z-Format sind zusätzliche Filter zur Vorbehandlung bestimmter Daten (z.B. Maschinencode) vorgesehen. (Siehe Spezifikation) | XZ Utils (Nachfolger der LZMA Utils) |
LGPL / Public domain |
| Lzip | .lzip | ? | Datenstrom- / Einzeldatei-Kompression |
Dieses Format entspricht im Wesentlichen LZMA-Raw mit einem zusätzlichen unkomprimierten Header zum Erkennen des Dateityps sowie einer Prüfsumme am Ende. Es ist somit leichtgewichtiger als das XZ-Format. (Siehe Spezifikation)
Die Lizenz der Referenzimplementation ist leider restriktiver. Die dazugehörige Softwarebibliothek lzlib lässt sich somit nicht in jedem OpenSource-Projekt einsetzen. |
Lzip | GPLv3 |
| Paket | Kommando | Beschreibung | unterstützte Formate (siehe oben) | ||||
|---|---|---|---|---|---|---|---|
| .7z | .lzma | .xz | .lzip | andere | |||
| p7zip (Portierung von 7-Zip auf Unix) |
7z | Komprimieren und Entpacken von mehreren Dateien in ein bzw. aus einem Archiv. Neben dem 7z-Format werden noch weitere Archivformate unterstützt. | ja | nur entpacken | nein | nein | ja |
| p7zip [-d] | Komprimieren oder Entpacken von einer Datei bzw. einem Datenstrom. Archive bestehend aus mehreren Dateien können zwar nicht erstellt jedoch entpackt werden. | ja | nur entpacken | nein | nein | nur entpacken | |
| LZMA SDK (LZMA_Alone) | lzma (lzma_alone) | Komprimieren oder Entpacken von einer Datei bzw. einem Datenstrom. Einige Distributionen bzw. Ports nennen das Programm "lzma_alone", um eine Kollision mit dem "lzma" Programm der XZ bzw. LZMA Utils zu vermeiden. | nein | ja | nein | nein | nein |
| XZ Utils (Nachfolger der LZMA Utils) |
lzma [-d] / lzmadec / unlzma | Komprimieren oder Entpacken von einer Datei bzw. einem Datenstrom. | nein | ja | nur entpacken | nein | nein |
| xz [-d] / xzdec / unxz | Komprimieren oder Entpacken von einer Datei bzw. einem Datenstrom. | nein | nur entpacken | ja | nein | nein | |
| Lzip | lzip [-d] | Komprimieren oder Entpacken von einer Datei bzw. einem Datenstrom. | nein | nein | nein | ja | nein |
Es ist schnell zu erkennen, dass LZMA-Kompression in der Unix-Welt derzeit alles andere als standardisiert ist. Man hat die Wahl zwischen 4 verschiedenen Formaten, sowie 4 verschiedenen Softwarepaketen, die wiederum insgesamt 6 Kompressionstools enthalten. Brian Lindholm schreibt in seinem unten verlinkten Artikel: „Does this mean we're in for a VHS/Betamax-style format war?“
Möchte man ein möglichst kompatibles LZMA-Kompressionsformat verwenden, so bietet sich LZMA-Raw an, da dieses von 7z, p7zip, lzma_alone, lzmadec und xzdec entpackt werden kann. Auch neuere Versionen von GNU-Tar unterstützen dieses Format (--lzma Kommandozeilenoption, oder -a mit .tlz oder .tar.lzma als Dateiendung). Man sollte unbedingt darauf achten, eine passende Dateiendung zu verwenden, da eine Dateityp-Erkennung mittels Magic-Bytes (z.B. durch das Kommandozeilenprogramm file) nicht funktioniert.
Das .xz-Format bietet zusätzliche Features; und die derzeit (2009-05-10) noch in der Beta-Phase befindliche Referenzimplementation soll laut Autor nach Fertigstellung als Public-Domain-Software veröffentlicht werden (derzeit noch LGPL).
Das Lzip-Format ist angenehm leichtgewichtig, kann dennoch wie auch das .xz-Format mittels Magic-Bytes einfach erkannt werden, doch die restriktivere Lizenz der (mir bisher einzig bekannten) Implementation kann die Verwendbarkeit einschränken. Da das Format jedoch im wesentlichen LZMA-Raw zuzüglich weniger Header-Bytes und einem CRC32 entspricht, ist die Lizenz der Referenzimplementation für das Format nicht so relevant, da verhältnismäßig leicht alternative Implementationen entwickelt werden könnten.
Grundsätzlich spricht auch nichts gegen eine Verwendung des original 7z-Formates unter Unix, sofern man falls nötig die Daten vorher in ein TAR Archiv einpackt, um z.B. die Dateirechte mit zu sichern. Leider funktionierte jedoch bei der mir vorliegenden Version (4.61 beta) von p7zip das Arbeiten mit Datenströmen nicht so reibungslos, wie man es sich unter Unix wünscht: So unterstützte das 7z-Kommando kein Lesen der Archive von StdIn und kein Schreiben der Archive auf StdOut, was vom p7zip-Kommando (welches intern 7z aufruft) unter Zuhilfenahme temporärer Dateien kaschiert wurde.