gzip
gzip ist ein freies Kompressionsprogramm, das, ebenso wie das entsprechende Dateiformat gzip, praktisch für alle Computerbetriebssysteme verfügbar ist (unter den Bedingungen der GPL auch im Quelltext).
gzip | |
---|---|
Hilfeanzeige in der Kommandozeile | |
Basisdaten | |
Entwickler | Jean-Loup Gailly und Mark Adler |
Erscheinungsjahr | 1992 |
Aktuelle Version | 1.11[1] (3. September 2021) |
Betriebssystem | plattformübergreifend verfügbar |
Programmiersprache | C |
Kategorie | Datenkompression |
Lizenz | GPL (Freie Software) |
www.gnu.org/software/gzip |
Allgemein ist gzip die Kurzform für „GNU zip“, wobei „zip“ vom englischen Wort für den Reißverschluss entlehnt wurde. OpenBSD hat eine BSD-lizenzierte Reimplementierung unter den Namen gzip(1), gunzip(1)
sowie gzcat(1)
vorgenommen, die völlig kompatibel zu den GNU-Werkzeugen ist.[2]
gzip bietet einen für Text zufriedenstellenden Kompressionsgrad und ist frei von patentierten Algorithmen (deflate wird verwendet). Es wurde ursprünglich von Jean-Loup Gailly entwickelt, um das unter Unix verwendete compress[3] zu ersetzen. Mark Adler schrieb das Dekompressionsprogramm gunzip.
Technik
gzip basiert auf dem Deflate-Algorithmus, der eine Kombination aus LZ77 und Huffman-Kodierung ist. Deflate wurde als Reaktion auf die Patente entwickelt, die auf LZW und anderen Kompressionsalgorithmen bestanden. Auch das ZIP-Dateiformat verwendet hauptsächlich Deflate zur Komprimierung, darf aber ansonsten nicht mit gzip verwechselt werden.
Die Fenstergröße bei gzip beträgt 32 KiB. Wenn eine Abfolge von Bytes sich in den vorherigen 32 KiB nicht wiederholt, wird sie unkomprimiert in der .gz-Datei gespeichert.[4] Diese Fenstergröße ist gegenüber modernen Kompressionsprogrammen (z. B. bzip2 mit 100 bis 900 KiB Blockgröße, rzip als Extremfall mit 900 MiB Fenstergröße) veraltet, jedoch ist gzip immer noch eines der schnellsten Kompressions-Programme und kann vielseitig eingesetzt werden, zum Beispiel in Verbindung mit einer sogenannten Pipeline – die Ausgabe („standard out“) eines Programms kann die Eingabe („standard in“) von gzip darstellen und umgekehrt.
Um die Entwicklung von Software zu vereinfachen, die Datenkompression nutzt, wurde die zlib-Bibliothek geschrieben. Sie unterstützt das gzip-Dateiformat und die Deflate-Kompression. Die Bibliothek ist weit verbreitet, da sie klein, effizient und vielseitig ist.
Aufbau
Das Archiv-Dateiformat für gzip ist gemäß RFC 1952 in Version 4.3 vom Mai 1996 spezifiziert.[5] Wenn einzelne Dateien mit gzip komprimiert werden, werden auch diverse Metadaten gespeichert, u. a. das Betriebssystem, unter dem das Archiv erstellt wurde, sowie die einzelnen Dateinamen und ihre Modifikationszeiten.
Auf modernen Betriebssystemen ergeben sich in dieser letzten Version des Archivformats bei den Metadaten folgende Einschränkungen:
- Die Dateigröße der Quelldatei ist auf Modulo 2^32 (entspricht 4 GiB) begrenzt, sodass unkomprimierte Dateigrößen > 4 GiB nicht korrekt angezeigt werden können, obwohl die Dateien selbst korrekt komprimiert wurden und auch dekomprimiert werden können. Es gibt jedoch Workarounds um die korrekten unkomprimierten Dateigrößen zu ermitteln.
- Die Modifikationszeit ist in der Zukunft auf den 7. Februar 2106, 06:28:15 UTC, beschränkt und speichert nur Sekundengenau. Moderne 64-Bit-Systeme unterstützen jedoch meist auch Mikro- und Nanosekunden – diese können in einem GZIP-Archiv weder gespeichert werden noch können sie wiederhergestellt werden. Auf einigen 32-Bit-Systemen hingegen ist das reale Limit für die Modifikationszeit in der Zukunft real niedriger, wenn diese vom Jahr-2038-Problem betroffen sind, was auf allen älteren Unix-artigen Betriebssystemen der Fall ist.[6]
Initialisierung [0-1]
Die ersten beiden Bytes bilden den sogenannten „Identification-Code“ des Formats, dieser ist beim gzip-Format immer derselbe. Genormt ist dieser Header mit den Bytes 0x1f und 0x8b (Hexadezimal) oder auch 31 und 139 (Dezimal). Diese Bytes sind zur Verifizierung des Datei-Formats (gzip) und um erste, auffällige Mängel der Datei aufzuzeigen. Wenn diese Initialisierung falsch oder gar nicht erfolgt, wird es Fehler geben, die entweder einen Fehler verursachen oder falsche End-Dateien (nach der Dekompression) hervorbringen.
Kompressionsmethode [2]
Das Byte auf dem Index (von 0 beginnend) 2 gibt an, um welche Kompressionsmethode es sich handelt, bzw. welche Aktion verwendet wurde, um die Datei(en) abzuspeichern.
Byte Wert | Bedeutung |
---|---|
0 | Kopie der Datei (keine Aktion durchgeführt) |
1 | Komprimierung |
2 | (Ver-)Packen |
3 | LZH-Format |
4 | Reserviert |
5 | Reserviert |
6 | Reserviert |
7 | Reserviert |
8 | „Deflate“ soll eine schnellere Alternative zum Komprimieren bereitstellen (derzeitig nur wenig Informationen) |
Spezielle Informationen („Flags“) [3]
Auf dem Index 3 liegt das Byte, das für besondere Informationen genutzt wird. Hier gibt es wieder bestimmte Werte, die eine festgelegte Bedeutung haben.
Wichtig ist, dass hier immer die Bits beachtet werden. Das bedeutet, dass z. B. „00010011“ (binär) (19 [dezimal]; 0x13 [hexadezimal]) folgendes aussagt: Die Datei ist ASCII-Text, ist eine einzige Datei, hat eine CRC-16-Nummer, besitzt extra Informationen und der originale Name ist bekannt.
Byte Wert | Bedeutung |
---|---|
1 (Bit-Stelle 1) | Datei hat einen ASCII-Text |
2 (Bit-Stelle 2) | CRC-16 vorhanden (dient als Prüfwert mit dem bestimmt wird, ob die Datei möglicherweise beschädigt ist oder nicht richtig übertragen wurde). |
4 (Bit-Stelle 3) | Bestimmt, ob zusätzliche Informationen bereitgestellt werden |
8 (Bit-Stelle 4) | Original-Name vorhanden |
16 (Bit-Stelle 5) | Kommentar vorhanden |
32 (Bit-Stelle 6) | Reserviert (muss 0 sein) |
64 (Bit-Stelle 7) | Reserviert (muss 0 sein) |
128 (Bit-Stelle 8) | Reserviert (muss 0 sein) |
Letzte Modifikation (Zeit) [4-7]
Dieser Wert wird von 4 Bytes bestimmt und gibt eine Zeit in Unixzeit an.
Zusätzliche spezielle Informationen („Extra Flags“) [8]
Die Definition ist analog zu „Spezielle Informationen“ auf Byte 3.
Beispiel für Kompressionsmethode „Deflate“:
Byte Wert | Bedeutung |
---|---|
2 (Bit-Stelle 2) | Kompressor benutzt maximale Kompression und langsamsten Algorithmus |
4 (Bit-Stelle 3) | Kompressor benutzt den schnellsten Algorithmus |
Betriebssystem [9]
Dieses Byte gibt an, auf welchem Betriebssystem die Datei komprimiert wurde.
Byte Wert | Bedeutung |
---|---|
0 | FAT (Dateisystem) |
1 | AmigaOS |
2 | VMS oder OpenVMS |
3 | Unix |
4 | VM oder CMS |
5 | Atari TOS |
6 | HPFS (Dateisystem) |
7 | Macintosh (Plattform), Mac OS (Betriebssystem) |
8 | Z-System |
9 | CP/M |
10 | TOPS-20 |
11 | NTFS (Dateisystem) |
12 | QDOS |
13 | Acorn RISC OS |
255 | Unbekannt |
Beispielaufrufe
Eine Datei packen:
gzip <Dateiname>
Eine gepackte Datei entpacken:
gzip -d <Dateiname>
oder
gunzip <Dateiname>
Rekursiv alle Dateien in einem Verzeichnis packen und die Kompressionsrate angeben:
gzip -rv <Verzeichnis>
Eine komprimierte Text-Datei ausgeben:
zcat <Dateiname>
Eine defekte komprimierte Datei bis zur Fehlerstelle entpacken:
zcat <gzip-Datei> > <Ziel-Datei>
Ermittlung der unkomprimierten Dateigröße bei archivierten Dateien, die größer als 4 GiB sind:[7]
zcat <gzip-Datei> | wc -c
gzip-komprimierte Dateien
gzip | |
---|---|
Dateiendung: | .gz |
MIME-Type: | application/gzip[8] |
Magische Zahl: | \x1F\x8B\x08 |
Entwickelt von: | Jean-Loup Gailly und Mark Adler |
Art: | Datenkompression |
Container für: | eine beliebige Datei |
Erweitert von: | compress |
Standard(s): | RFC 1952 |
Website: | gzip.org |
Die übliche Dateiendung für gzip-komprimierte Dateien ist heute .gz
, früher auch .z
.
Da gzip nur einzelne Dateien komprimieren kann, werden mehrere Dateien bzw. Verzeichnisbäume üblicherweise zunächst mit tar zu einer Tarball genannten Archivdatei zusammengefasst, welche anschließend mit gzip komprimiert wird.
Solche komprimierten Archivdateien tragen dann meist die doppelte Endung .tar.gz
oder auch einfach .tgz
.
Diese Methode ermöglicht insgesamt bessere Komprimierung, da so Redundanzen zwischen den einzelnen Dateien ausgenutzt werden können (progressive Kompression), erschwert aber den Zugriff auf die einzelnen Bestandteile.
Verbreitung
Unter Unix ist die Komprimierung mit gzip heute Standard, weil sie für viele Aufgaben einen guten Kompromiss aus hoher Geschwindigkeit und guter Datenreduktion ermöglicht. Wo es weniger auf Geschwindigkeit als auf minimale Dateigrößen ankommt (etwa bei der breiten Verteilung von Daten über relativ langsame Netze), werden allerdings zunehmend bzip2 und LZMA verwendet (ebenso wie bei gzip in Kombination mit tar).
Das zlib-komprimierte Dateiformat, der Deflate-Algorithmus und das gzip-Dateiformat wurden 1996 als Request for Comments RFC 1950, RFC 1951 und RFC 1952 standardisiert.
Siehe auch
- Liste von Datenkompressionsprogrammen
- zopfli ist ein von Google-Mitarbeitern programmierter Kodierer, der kompatible und kleinere gzip-Dateien erzeugt, allerdings auf Kosten sehr langer Kompressionszeiten
pigz
ist eine von Mark Adler programmierte Version vongzip
, welche sämtliche verfügbaren Prozessorkerne und -threads benutzt, und so die Kompression merklich beschleunigt
Weblinks
- gzip.org – ursprüngliche Projektseite (englisch)
- P. Deutsch: RFC 1952. – GZIP File Format Specification version 4.3. Mai 1996. (englisch). (englisch)
gzip(1)
: gzip, gunzip, zcat – Dateien komprimieren und expandieren – Debian GNU/Linux Ausführbare Programme oder Shell-Befehle Handbuchseite- goethe.ira.uka.de (Memento vom 8. September 2012 im Internet Archive) – gut verständliche Beschreibung der verschiedenen Komprimiermöglichkeiten
Einzelnachweise
- gzip-1.11 released [stable]. 3. September 2021 (abgerufen am 3. September 2021).
-
gzip(1)
: compress and expand data (deflate mode) – OpenBSD General Commands Manual -
compress
: compress data – Open Group Base Specification - Jean-loup Gailly, Mark Adler: Compression algorithm (deflate) (Memento vom 16. Februar 2014 im Internet Archive) Auf gzip.org. 1. September 1997 (Last-Modified).
- P. Deutsch: RFC 1952. – GZIP File Format Specification version 4.3. Mai 1996. (englisch).
- GNU Gzip Documentation. Free Software Foundation, Inc., abgerufen am 15. September 2020 (englisch).
- GNU Gzip Documentation. Free Software Foundation, Inc., abgerufen am 15. September 2020 (englisch): „The gzip format represents the input size modulo 2^32, so the uncompressed size and compression ratio are listed incorrectly for uncompressed files 4 GiB and larger. To work around this problem, you can use the following command to discover a large uncompressed file’s true size:
zcat file.gz | wc -c
“ - tools.ietf.org