XZ
Section: XZ\-Dienstprogramme (1)
Updated: 1. Februar 2020
Page Index
BEZEICHNUNG
xz, unxz, xzcat, lzma, unlzma, lzcat - .xz- und .lzma-Dateien komprimieren
oder dekomprimieren
ÜBERSICHT
xz [
Option…] [
Datei…]
BEFEHLSALIASE
unxz ist gleichbedeutend mit
xz --decompress.
xzcat ist gleichbedeutend mit
xz --decompress --stdout.
lzma ist gleichbedeutend mit
xz --format=lzma.
unlzma ist gleichbedeutend mit
xz --format=lzma --decompress.
lzcat ist gleichbedeutend mit
xz --format=lzma --decompress --stdout.
Wenn Sie Skripte schreiben, die Dateien dekomprimieren, sollten Sie stets
den Namen xz mit den entsprechenden Argumenten (xz -d oder xz -dc)
anstelle der Namen unxz und xzcat verwenden.
BESCHREIBUNG
xz ist ein Allzweckwerkzeug zur Datenkompression, dessen
Befehlszeilensyntax denen von
gzip(1) und
bzip2(1) ähnelt. Das native
Dateiformat ist das
.xz-Format, aber das veraltete, von den
LZMA-Dienstprogrammen verwendete Format sowie komprimierte Rohdatenströme
ohne Containerformat-Header werden ebenfalls unterstützt.
xz komprimiert oder dekomprimierte jede Datei entsprechend des
gewählten Vorgangsmodus. Falls entweder - oder keine Datei angegeben ist,
liest xz aus der Standardeingabe und leitet die verarbeiteten Dateien in
die Standardausgabe. Wenn die Standardausgabe kein Terminal ist, verweigert
xz das Schreiben komprimierter Daten in die Standardausgabe. Dabei wird
eine Fehlermeldung angezeigt und die Datei übersprungen. Ebenso
verweigert xz das Lesen komprimierter Daten aus der Standardeingabe, wenn
diese ein Terminal ist.
Dateien, die nicht als - angegeben sind, werden in eine neue Datei
geschrieben, deren Name aus den Namen der Quell-Datei abgeleitet wird
(außer wenn --stdout angegeben ist):
- •
-
Bei der Kompression wird das Suffix des Formats der Zieldatei (.xz oder
.lzma) an den Namen der Quelldatei angehängt und so der Name der
Zieldatei gebildet.
- •
-
Bei der Dekompression wird das Suffix .xz oder .lzma vom Dateinamen
entfernt und so der Name der Zieldatei gebildet. Außerdem erkennt xz die
Suffixe .txz und .tlz und ersetzt diese durch .tar.
Wenn die Zieldatei bereits existiert, wird eine Fehlermeldung angezeigt und
die Datei übersprungen.
Außer beim Schreiben in die Standardausgabe zeigt xz eine Warnung an und
überspringt die Datei, wenn eine der folgenden Bedingungen zutreffend
ist:
- •
-
Die Datei ist keine reguläre Datei. Symbolischen Verknüpfungen wird nicht
gefolgt und daher nicht zu den regulären Dateien gezählt.
- •
-
Die Datei hat mehr als eine harte Verknüpfung.
- •
-
Für die Datei ist das »setuid«-, »setgid«- oder »sticky«-Bit gesetzt.
- •
-
Der Aktionsmodus wird auf Kompression gesetzt und die Datei hat bereits
das Suffix des Zieldateiformats (.xz oder .txz beim Komprimieren in
das .xz-Format und .lzma oder .tlz beim Komprimieren in das
.lzma-Format).
- •
-
Der Aktionsmodus wird auf Dekompression gesetzt und die Datei hat nicht
das Suffix eines der unterstützten Zieldateiformate (.xz, .txz,
.lzma oder .tlz).
Nach erfolgreicher Kompression oder Dekompression der Datei kopiert xz
Eigentümer, Gruppe, Zugriffsrechte, Zugriffszeit und Änderungszeit aus der
Ursprungs-Datei in die Zieldatei. Sollte das Kopieren der Gruppe
fehlschlagen, werden die Zugriffsrechte so angepasst, dass jenen Benutzern
der Zugriff auf die Zieldatei verwehrt bleibt, die auch keinen Zugriff auf
die Ursprungs-Datei hatten. Das Kopieren anderer Metadaten wie
Zugriffssteuerlisten oder erweiterter Attribute wird von xz noch nicht
unterstützt.
Sobald die Zieldatei erfolgreich geschlossen wurde, wird die
Ursprungs-Datei entfernt. Dies wird durch die Option --keep
verhindert. Die Ursprungs-Datei wird niemals entfernt, wenn die Ausgabe
in die Standardausgabe geschrieben wird.
Durch Senden der Signale SIGINFO oder SIGUSR1 an den xz-Prozess
werden Fortschrittsinformationen in den Fehlerkanal der Standardausgabe
geleitet. Dies ist nur eingeschränkt hilfreich, wenn die
Standardfehlerausgabe ein Terminal ist. Mittels --verbose wird ein
automatisch aktualisierter Fortschrittsanzeiger angezeigt.
Speicherbedarf
In Abhängigkeit von den gewählten Kompressionseinstellungen bewegt sich der
Speicherverbrauch zwischen wenigen hundert Kilobyte und mehrere
Gigabyte. Die Einstellungen bei der Kompression einer Datei bestimmen dabei
den Speicherbedarf bei der Dekompression. Die Dekompression benötigt
üblicherweise zwischen 5 % und 20 % des Speichers, der bei der Kompression
der Datei erforderlich war. Beispielsweise benötigt die Dekompression einer
Datei, die mit
xz -9 komprimiert wurde, gegenwärtig etwa 65 MiB
Speicher. Es ist jedoch auch möglich, dass
.xz-Dateien mehrere Gigabyte
an Speicher zur Dekompression erfordern.
Insbesondere für Benutzer älterer Systeme wird eventuell ein sehr großer
Speicherbedarf ärgerlich sein. Um unangenehme Überraschungen zu vermeiden,
verfügt xz über eine eingebaute Begrenzung des Speicherbedarfs, die
allerdings in der Voreinstellung deaktiviert ist. Zwar verfügen einige
Betriebssysteme über eingebaute Möglichkeiten zur prozessabhängigen
Speicherbegrenzung, doch diese sind zu unflexibel (zum Beispiel kann
ulimit(1) beim Begrenzen des virtuellen Speichers mmap(2)
beeinträchtigen).
Die Begrenzung des Speicherbedarfs kann mit der Befehlszeilenoption
--memlimit=Begrenzung aktiviert werden. Oft ist es jedoch bequemer,
die Begrenzung durch Setzen der Umgebungsvariable XZ_DEFAULTS
standardmäßig zu aktivieren, zum Beispiel
XZ_DEFAULTS=--memlimit=150MiB. Die Begrenzungen können getrennt für
Kompression und Dekompression mittels --memlimit-compress=Begrenzung
und --memlimit-decompress=Begrenzung festgelegt werden. Die Verwendung
einer solchen Option außerhalb der Variable XZ_DEFAULTS ist kaum
sinnvoll, da xz in einer einzelnen Aktion nicht gleichzeitig Kompression
und Dekompression ausführen kann und --memlimit=Begrenzung (oder -M
Begrenzung) lässt sich einfacher in der Befehlszeile eingeben.
Wenn die angegebene Speicherbegrenzung bei der Dekompression überschritten
wird, schlägt der Vorgang fehl und xz zeigt eine Fehlermeldung an. Wird
die Begrenzung bei der Kompression überschritten, dann versucht xz die
Einstellungen entsprechend anzupassen, außer wenn --format=raw oder
--no-adjust angegeben ist. Auf diese Weise schlägt die Aktion nicht fehl,
es sei denn, die Begrenzung wurde sehr niedrig angesetzt. Die Anpassung der
Einstellungen wird schrittweise vorgenommen, allerdings entsprechen die
Schritte nicht den Voreinstellungen der Kompressionsstufen. Das bedeutet,
wenn beispielsweise die Begrenzung nur geringfügig unter den Anforderungen
für xz -9 liegt, werden auch die Einstellungen nur wenig angepasst und
nicht vollständig herunter zu den Werten für xz -8
Verkettung und Auffüllung von .xz-Dateien
Es ist möglich,
.xz-Dateien direkt zu verketten. Solche Dateien werden
von
xz genauso dekomprimiert wie eine einzelne
.xz-Datei.
Es ist weiterhin möglich, eine Auffüllung zwischen den verketteten Teilen
oder nach dem letzten Teil einzufügen. Die Auffüllung muss aus Null-Bytes
bestehen und deren Größe muss ein Vielfaches von vier Byte sein. Dies kann
zum Beispiel dann vorteilhaft sein, wenn die .xz-Datei auf einem
Datenträger gespeichert wird, dessen Dateisystem die Dateigrößen in
512-Byte-Blöcken speichert.
Verkettung und Auffüllung sind für .lzma-Dateien oder Rohdatenströme
nicht erlaubt.
OPTIONEN
Ganzzahlige Suffixe und spezielle Werte
An den meisten Stellen, wo ein ganzzahliges Argument akzeptiert wird, kann
ein optionales Suffix große Ganzzahlwerte einfacher darstellen. Zwischen
Ganzzahl und dem Suffix dürfen sich keine Leerzeichen befinden.
- KiB
-
multipliziert die Ganzzahl mit 1.024 (2^10). Ki, k, kB, K und
KB werden als Synonyme für KiB akzeptiert.
- MiB
-
multipliziert die Ganzzahl mit 1.048.576 (2^20). Mi, m, M und MB
werden als Synonyme für MiB akzeptiert.
- GiB
-
multipliziert die Ganzzahl mit 1.073.741.824 (2^30). Gi, g, G und
GB werden als Synonyme für GiB akzeptiert.
Der spezielle Wert max kann dazu verwendet werden, um den von der
jeweiligen Option akzeptierten maximalen Ganzzahlwert anzugeben.
Aktionsmodus
Falls mehrere Aktionsmodi angegeben sind, wird der zuletzt angegebene
verwendet.
- -z, --compress
-
Kompression. Dies ist der voreingestellte Aktionsmodus, sofern keiner
angegeben ist und auch kein bestimmter Modus aus dem Befehlsnamen abgeleitet
werden kann (der Befehl unxz impliziert zum Beispiel --decompress).
- -d, --decompress, --uncompress
-
dekomprimpiert.
- -t, --test
-
prüft die Integrität der komprimierten Dateien. Diese Option ist
gleichbedeutend mit --decompress --stdout, außer dass die dekomprimierten
Daten verworfen werden, anstatt sie in die Standardausgabe zu leiten. Es
werden keine Dateien erstellt oder entfernt.
- -l, --list
-
gibt Informationen zu den komprimierten Dateien aus. Es werden keine
unkomprimierten Dateien ausgegeben und keine Dateien angelegt oder
entfernt. Im Listenmodus kann das Programm keine komprimierten Daten aus der
Standardeingabe oder anderen nicht durchsuchbaren Quellen lesen.
-
Die Liste zeigt in der Standardeinstellung grundlegende Informationen zu den
Dateien an, zeilenweise pro Datei. Detailliertere Informationen erhalten
Sie mit der Option --verbose. Wenn Sie diese Option zweimal angeben,
werden noch ausführlichere Informationen ausgegeben. Das kann den Vorgang
allerdings deutlich verlangsamen, da die Ermittlung der zusätzlichen
Informationen zahlreiche Suchvorgänge erfordert. Die Breite der
ausführlichen Ausgabe ist breiter als 80 Zeichen, daher könnte die
Weiterleitung in beispielsweise less -S sinnvoll sein, falls das
Terminal nicht breit genug ist.
-
Die exakte Ausgabe kann in verschiedenen xz-Versionen und
Spracheinstellungen unterschiedlich sein. Wenn eine maschinell auswertbare
Ausgabe gewünscht ist, dann sollten Sie --robot --list verwenden.
Aktionsattribute
- -k, --keep
-
verhindert das Löschen der Eingabedateien.
- -f, --force
-
Diese Option hat verschiedene Auswirkungen:
-
- •
-
Wenn die Zieldatei bereits existiert, wird diese vor der Kompression oder
Dekompression gelöscht.
- •
-
Die Kompression oder Dekompression wird auch dann ausgeführt, wenn die
Eingabe ein symbolischer Link zu einer regulären Datei ist, mehr als einen
harten Link hat oder das »setuid«-, »setgid«- oder »sticky«-Bit gesetzt
ist. Die genannten Bits werden nicht in die Zieldatei kopiert.
- •
-
Wenn es zusammen mit --decompress und --stdout verwendet wird und
xz den Typ der Quelldatei nicht ermitteln kann, wird die Quelldatei
unverändert in die Standardausgabe kopiert. Dadurch kann xzcat --force
für Dateien, die nicht mit xz komprimiert wurden, wie cat(1) verwendet
werden. Zukünftig könnte xz neue Dateikompressionsformate unterstützen,
wodurch xz mehr Dateitypen dekomprimieren kann, anstatt sie unverändert
in die Standardausgabe zu kopieren. Mit der Option --format=Format
können Sie xz anweisen, nur ein einzelnes Dateiformat zu dekomprimieren.
- -c, --stdout, --to-stdout
-
schreibt die komprimierten oder dekomprimierten Daten in die Standardausgabe
anstatt in eine Datei. Dies impliziert --keep.
- --single-stream
-
dekomprimiert nur den ersten .xz-Datenstrom und ignoriert stillschweigend
weitere Eingabedaten, die möglicherweise dem Datenstrom
folgen. Normalerweise führt solcher anhängender Datenmüll dazu, dass xz
eine Fehlermeldung ausgibt.
-
xz dekomprimiert niemals mehr als einen Datenstrom aus .lzma-Dateien
oder Rohdatenströmen, aber dennoch wird durch diese Option möglicherweise
vorhandener Datenmüll nach der .lzma-Datei oder dem Rohdatenstrom
ignoriert.
-
Diese Option ist wirkungslos, wenn der Aktionsmodus nicht --decompress
oder --test ist.
- --no-sparse
-
verhindert die Erzeugung von Sparse-Dateien. In der Voreinstellung versucht
xz, bei der Dekompression in eine reguläre Datei eine Sparse-Datei zu
erzeugen, wenn die dekomprimierten Daten lange Abfolgen von binären Nullen
enthalten. Dies funktioniert auch beim Schreiben in die Standardausgabe,
sofern diese in eine reguläre Datei weitergeleitet wird und bestimmte
Zusatzbedingungen erfüllt sind, die die Aktion absichern. Die Erzeugung von
Sparse-Dateien kann Plattenplatz sparen und beschleunigt die Dekompression
durch Verringerung der Ein-/Ausgaben der Platte.
- -S .suf, --suffix=.suf
-
verwendet .suf bei der Dekompression anstelle von .xz oder .lzma
als Suffix für die Zieldatei. Falls nicht in die Standardausgabe geschrieben
wird und die Quelldatei bereits das Suffix .suf hat, wird eine Warnung
angezeigt und die Datei übersprungen.
-
berücksichtigt bei der Dekompression zusätzlich zu Dateien mit den Suffixen
.xz, .txz, .lzma oder .tlz auch jene mit dem Suffix
.suf. Falls die Quelldatei das Suffix .suf hat, wird dieses entfernt
und so der Name der Zieldatei abgeleitet.
-
Beim Komprimieren oder Dekomprimieren von Rohdatenströmen mit
--format=raw muss das Suffix stets angegeben werden, außer wenn die
Ausgabe in die Standardausgabe erfolgt. Der Grund dafür ist, dass es kein
vorgegebenes Suffix für Rohdatenströme gibt.
- --files[=Datei]
-
liest die zu verarbeitenden Dateinamen aus Datei. Falls keine Datei
angegeben ist, werden die Dateinamen aus der Standardeingabe
gelesen. Dateinamen müssen mit einem Zeilenumbruch beendet werden. Ein
Bindestrich (-) wird als regulärer Dateiname angesehen und nicht als
Standardeingabe interpretiert. Falls Dateinamen außerdem als
Befehlszeilenargumente angegeben sind, werden diese vor den Dateinamen aus
der Datei verarbeitet.
- --files0[=Datei]
-
Dies ist gleichbedeutend mit --files[=Datei], außer dass jeder
Dateiname mit einem Null-Zeichen abgeschlossen werden muss.
Grundlegende Dateiformat- und Kompressionsoptionen
- -F Format, --format=Format
-
gibt das Format der zu komprimierenden oder dekomprimierenden Datei an:
-
- auto
-
Dies ist die Voreinstellung. Bei der Kompression ist auto gleichbedeutend
mit xz. Bei der Dekompression wird das Format der Eingabedatei
automatisch erkannt. Beachten Sie, dass Rohdatenströme, wie sie mit
--format=raw erzeugt werden, nicht automatisch erkannt werden können.
- xz
-
Die Kompression erfolgt in das .xz-Dateiformat oder akzeptiert nur
.xz-Dateien bei der Dekompression.
- lzma, alone
-
Die Kompression erfolgt in das veraltete .lzma-Dateiformat oder
akzeptiert nur .lzma-Dateien bei der Dekompression. Der alternative Name
alone dient der Abwärtskompatibilität zu den LZMA-Dienstprogrammen.
- raw
-
Komprimiert oder dekomprimiert einen Rohdatenstrom (ohne Header). Diese
Option ist nur für fortgeschrittene Benutzer bestimmt. Zum Dekodieren von
Rohdatenströmen müssen Sie die Option --format=raw verwenden und die
Filterkette ausdrücklich angeben, die normalerweise in den (hier fehlenden)
Container-Headern gespeichert worden wäre.
- -C Prüfung, --check=Prüfung
-
gibt den Typ der Integritätsprüfung an. Die Prüfsumme wird aus den
unkomprimierten Daten berechnet und in der .xz-Datei gespeichert. Diese
Option wird nur bei der Kompression in das .xz-Format angewendet, da das
.lzma-Format keine Integritätsprüfungen unterstützt. Die eigentliche
Integritätsprüfung erfolgt (falls möglich), wenn die .xz-Datei
dekomprimiert wird.
-
Folgende Typen von Prüfungen werden unterstützt:
-
- none
-
führt keine Integritätsprüfung aus. Dies ist eine eher schlechte
Idee. Dennoch kann es nützlich sein, wenn die Integrität der Daten auf
andere Weise sichergestellt werden kann.
- crc32
-
berechnet die CRC32-Prüfsumme anhand des Polynoms aus IEEE-802.3 (Ethernet).
- crc64
-
berechnet die CRC64-Prüfsumme anhand des Polynoms aus ECMA-182. Dies ist die
Voreinstellung, da beschädigte Dateien etwas besser als mit CRC32 erkannt
werden und die Geschwindigkeitsdifferenz unerheblich ist.
- sha256
-
berechnet die SHA-256-Prüfsumme. Dies ist etwas langsamer als CRC32 und
CRC64.
-
Die Integrität der .xz-Header wird immer mit CRC32 geprüft. Es ist nicht
möglich, dies zu ändern oder zu deaktivieren.
- --ignore-check
-
verifiziert die Integritätsprüfsumme der komprimierten Daten bei der
Dekompression nicht. Die CRC32-Werte in den .xz-Headern werden weiterhin
normal verifiziert.
-
Verwenden Sie diese Option nicht, außer Sie wissen, was Sie tun. Mögliche
Gründe, diese Option zu verwenden:
-
- •
-
Versuchen, Daten aus einer beschädigten .xz-Datei wiederherzustellen.
- •
-
Erhöhung der Geschwindigkeit bei der Dekompression. Dies macht sich meist
mit SHA-256 bemerkbar, oder mit Dateien, die extrem stark komprimiert
sind. Wir empfehlen, diese Option nicht für diesen Zweck zu verwenden, es
sei denn, die Integrität der Datei wird extern auf andere Weise überprüft.
- -0 … -9
-
wählt eine der voreingestellten Kompressionsstufen, standardmäßig
-6. Wenn mehrere Voreinstellungsstufen angegeben sind, ist nur die
zuletzt angegebene wirksam. Falls bereits eine benutzerdefinierte
Filterkette angegeben wurde, wird diese durch die Festlegung der
Voreinstellung geleert.
-
Die Unterschiede zwischen den Voreinstellungsstufen sind deutlicher als bei
gzip(1) und bzip2(1). Die gewählten Kompressionseinstellungen
bestimmen den Speicherbedarf bei der Dekompression, daher ist es auf älteren
Systemen mit wenig Speicher bei einer zu hoch gewählten Voreinstellung
schwer, eine Datei zu dekomprimieren. Insbesondere ist es keine gute Idee,
blindlings -9 für alles zu verwenden, wie dies häufig mit gzip(1) und
bzip2(1) gehandhabt wird.
-
- -0 … -3
-
Diese Voreinstellungen sind recht schnell. -0 ist manchmal schneller als
gzip -9, wobei aber die Kompression wesentlich besser ist. Die
schnelleren Voreinstellungen sind im Hinblick auf die Geschwindigkeit mit
bzip2(1) vergleichbar , mit einem ähnlichen oder besseren
Kompressionsverhältnis, wobei das Ergebnis aber stark vom Typ der zu
komprimierenden Daten abhängig ist.
- -4 … -6
-
Gute bis sehr gute Kompression, wobei der Speicherbedarf für die
Dekompression selbst auf alten Systemen akzeptabel ist. -6 ist die
Voreinstellung, welche üblicherweise eine gute Wahl ist, zum Beispiel für
die Verteilung von Dateien, die selbst noch auf Systemen mit nur 16 MiB
Arbeitsspeicher dekomprimiert werden müssen (-5e oder -6e sind
ebenfalls eine Überlegung wert. Siehe --extreme).
- -7 … -9
-
Ähnlich wie -6, aber mit einem höheren Speicherbedarf für die Kompression
und Dekompression. Sie sind nur nützlich, wenn Dateien komprimiert werden
sollen, die größer als 8 MiB, 16 MiB beziehungsweise 32 MiB sind.
-
Auf der gleichen Hardware ist die Dekompressionsgeschwindigkeit ein nahezu
konstanter Wert in Bytes komprimierter Daten pro Sekunde. Anders
ausgedrückt: Je besser die Kompression, umso schneller wird üblicherweise
die Dekompression sein. Das bedeutet auch, dass die Menge der pro Sekunde
ausgegebenen unkomprimierten Daten stark variieren kann.
-
Die folgende Tabelle fasst die Eigenschaften der Voreinstellungen zusammen:
-
-
Voreinstellung | DictGröße | KompCPU | KompSpeicher | DekSpeicher
|
-0 | 256 KiB | 0 | 3 MiB | 1 MiB
|
-1 | 1 MiB | 1 | 9 MiB | 2 MiB
|
-2 | 2 MiB | 2 | 17 MiB | 3 MiB
|
-3 | 4 MiB | 3 | 32 MiB | 5 MiB
|
-4 | 4 MiB | 4 | 48 MiB | 5 MiB
|
-5 | 8 MiB | 5 | 94 MiB | 9 MiB
|
-6 | 8 MiB | 6 | 94 MiB | 9 MiB
|
-7 | 16 MiB | 6 | 186 MiB | 17 MiB
|
-8 | 32 MiB | 6 | 370 MiB | 33 MiB
|
-9 | 64 MiB | 6 | 674 MiB | 65 MiB
|
-
Spaltenbeschreibungen:
-
- •
-
DictGröße ist die Größe des LZMA2-Wörterbuchs. Es ist Speicherverschwendung,
ein Wörterbuch zu verwenden, das größer als die unkomprimierte Datei
ist. Daher ist es besser, die Voreinstellungen -7 … -9 zu vermeiden,
falls es keinen wirklichen Bedarf dafür gibt. Mit -6 und weniger wird
üblicherweise so wenig Speicher verschwendet, dass dies nicht ins Gewicht
fällt.
- •
-
KompCPU ist eine vereinfachte Repräsentation der LZMA2-Einstellungen, welche
die Kompressionsgeschwindigkeit beeinflussen. Die Wörterbuchgröße wirkt sich
ebenfalls auf die Geschwindigkeit aus. Während KompCPU für die Stufen -6
bis -9 gleich ist, tendieren höhere Stufen dazu, etwas langsamer zu
sein. Um eine noch langsamere, aber möglicherweise bessere Kompression zu
erhalten, siehe --extreme.
- •
-
KompSpeicher enthält den Speicherbedarf des Kompressors im
Einzel-Thread-Modus. Dieser kann zwischen den xz-Versionen leicht
variieren. Der Speicherbedarf einiger der zukünftigen Multithread-Modi kann
dramatisch höher sein als im Einzel-Thread-Modus.
- •
-
DekSpeicher enthält den Speicherbedarf für die Dekompression. Das bedeutet,
dass die Kompressionseinstellungen den Speicherbedarf bei der Dekompression
bestimmen. Der exakte Speicherbedarf bei der Dekompression ist geringfügig
größer als die Größe des LZMA2-Wörterbuchs, aber die Werte in der Tabelle
wurden auf ganze MiB aufgerundet.
- -e, --extreme
-
verwendet eine langsamere Variante der gewählten
Kompressions-Voreinstellungsstufe (-0 … -9), um hoffentlich ein etwas
besseres Kompressionsverhältnis zu erreichen, das aber in ungünstigen Fällen
auch schlechter werden kann. Der Speicherverbrauch bei der Dekompression
wird dabei nicht beeinflusst, aber der Speicherverbrauch der Kompression
steigt in der Voreinstellungsstufen -0 bis -3 geringfügig an.
-
Da es zwei Voreinstellungen mit den Wörterbuchgrößen 4 MiB und 8 MiB gibt,
verwenden die Voreinstellungsstufen -3e und -5e etwas schnellere
Einstellungen (niedrigere KompCPU) als -4e beziehungsweise -6e. Auf
diese Weise sind zwei Voreinstellungen nie identisch.
-
-
Voreinstellung | DictGröße | KompCPU | KompSpeicher | DekSpeicher
|
-0e | 256 KiB | 8 | 4 MiB | 1 MiB
|
-1e | 1 MiB | 8 | 13 MiB | 2 MiB
|
-2e | 2 MiB | 8 | 25 MiB | 3 MiB
|
-3e | 4 MiB | 7 | 48 MiB | 5 MiB
|
-4e | 4 MiB | 8 | 48 MiB | 5 MiB
|
-5e | 8 MiB | 7 | 94 MiB | 9 MiB
|
-6e | 8 MiB | 8 | 94 MiB | 9 MiB
|
-7e | 16 MiB | 8 | 186 MiB | 17 MiB
|
-8e | 32 MiB | 8 | 370 MiB | 33 MiB
|
-9e | 64 MiB | 8 | 674 MiB | 65 MiB
|
-
Zum Beispiel gibt es insgesamt vier Voreinstellungen, die ein 8 MiB großes
Wörterbuch verwenden, deren Reihenfolge von der schnellsten zur langsamsten
-5, -6, -5e und -6e ist.
- --fast
-
- --best
-
sind etwas irreführende Aliase für -0 beziehungsweise -9. Sie werden
nur zwecks Abwärtskompatibilität zu den LZMA-Dienstprogrammen
bereitgestellt. Sie sollten diese Optionen besser nicht verwenden.
- --block-size=Größe
-
teilt beim Komprimieren in das .xz-Format die Eingabedaten in Blöcke der
angegebenen Größe in Byte. Die Blöcke werden unabhängig voneinander
komprimiert, was dem Multi-Threading entgegen kommt und Zufallszugriffe bei
der Dekompression begrenzt. Diese Option wird typischerweise eingesetzt, um
die vorgegebene Blockgröße im Multi-Thread-Modus außer Kraft zu setzen, aber
sie kann auch im Einzel-Thread-Modus angewendet werden.
-
Im Multi-Thread-Modus wird etwa die dreifache Größe in jedem Thread zur
Pufferung der Ein- und Ausgabe belegt. Die vorgegebene Größe ist das
Dreifache der Größe des LZMA2-Wörterbuchs oder 1 MiB, je nachdem, was mehr
ist. Typischerweise ist das Zwei- bis Vierfache der Größe des
LZMA2-Wörterbuchs oder wenigstens 1 MB ein guter Wert. Eine Größe, die
geringer ist als die des LZMA2-Wörterbuchs, ist Speicherverschwendung, weil
dann der LZMA2-Wörterbuchpuffer niemals vollständig genutzt werden
würde. Die Größe der Blöcke wird in den Block-Headern gespeichert, die von
einer zukünftigen Version von xz für eine Multi-Thread-Dekompression
genutzt wird.
-
Im Einzel-Thread-Modus werden die Blöcke standardmäßig nicht geteilt. Das
Setzen dieser Option wirkt sich nicht auf den Speicherbedarf aus. In den
Block-Headern werden keine Größeninformationen gespeichert, daher werden im
Einzel-Thread-Modus erzeugte Dateien nicht zu den im Multi-Thread-Modus
erzeugten Dateien identisch sein. Das Fehlen der Größeninformation bedingt
auch, dass eine zukünftige Version von xz nicht in der Lage sein wird,
die Dateien im Multi-Thread-Modus zu dekomprimieren.
- --block-list=Größen
-
beginnt bei der Kompression in das .xz-Format nach den angegebenen
Intervallen unkomprimierter Daten einen neuen Block.
-
Die unkomprimierte Größe der Blöcke wird in einer durch Kommata
getrennten Liste angegeben. Auslassen einer Größe (zwei oder mehr
aufeinander folgende Kommata) ist ein Kürzel dafür, die Größe des vorherigen
Blocks zu verwenden.
-
Falls die Eingabedatei größer ist als die Summe der Größen, dann wird der
letzte in Größe angegebene Wert bis zum Ende der Datei wiederholt. Mit
dem speziellen Wert 0 können Sie angeben, dass der Rest der Datei als
einzelner Block kodiert werden soll.
-
Falls Sie Größen angeben, welche die Blockgröße des Encoders übersteigen
(entweder den Vorgabewert im Thread-Modus oder den mit
--block-size=Größe angegebenen Wert), wird der Encoder zusätzliche
Blöcke erzeugen, wobei die in den Größen angegebenen Grenzen eingehalten
werden. Wenn Sie zum Beispiel --block-size=10MiB
--block-list=5MiB,10MiB,8MiB,12MiB,24MiB angeben und die Eingabedatei 80
MiB groß ist, erhalten Sie 11 Blöcke: 5, 10, 8, 10, 2, 10, 10, 4, 10, 10 und
1 MiB.
-
Im Multi-Thread-Modus werden die Blockgrößen in den Block-Headern
gespeichert. Dies geschieht im Einzel-Thread-Modus nicht, daher wird die
kodierte Ausgabe zu der im Multi-Thread-Modus nicht identisch sein.
- --flush-timeout=Zeit
-
löscht bei der Kompression die ausstehenden Daten aus dem Encoder und macht
sie im Ausgabedatenstrom verfügbar, wenn mehr als die angegebene Zeit in
Millisekunden (als positive Ganzzahl) seit dem vorherigen Löschen vergangen
ist und das Lesen weiterer Eingaben blockieren würde. Dies kann nützlich
sein, wenn xz zum Komprimieren von über das Netzwerk eingehenden Daten
verwendet wird. Kleine Zeit-Werte machen die Daten unmittelbar nach dem
Empfang nach einer kurzen Verzögerung verfügbar, während große Zeit-Werte
ein besseres Kompressionsverhältnis bewirken.
-
Dieses Funktionsmerkmal ist standardmäßig deaktiviert. Wenn diese Option
mehrfach angegeben wird, ist die zuletzt angegebene wirksam. Für die Angabe
der Zeit kann der spezielle Wert 0 verwendet werden, um dieses
Funktionsmerkmal explizit zu deaktivieren.
-
Dieses Funktionsmerkmal ist außerhalb von POSIX-Systemen nicht verfügbar.
-
Dieses Funktionsmerkmal ist noch experimentell. Gegenwärtig ist xz
aufgrund der Art und Weise, wie xz puffert, für Dekompression in Echtzeit
ungeeignet.
- --memlimit-compress=Grenze
-
legt eine Grenze für die Speichernutzung bei der Kompression fest. Wenn
diese Option mehrmals angegeben wird, ist die zuletzt angegebene wirksam.
-
Falls die Kompressionseinstellungen die Grenze überschreiten, passt xz
die Einstellungen nach unten an, so dass die Grenze nicht mehr überschritten
wird und zeigt einen Hinweis an, dass eine automatische Anpassung
vorgenommen wurde. Solche Anpassungen erfolgen nicht, wenn mit
--format=raw komprimiert wird oder wenn --no-adjust angegeben
wurde. In diesen Fällen wird eine Fehlermeldung mit dem Exit-Status 1
ausgegeben und xz mit dem Exit-Status 1 beendet.
-
Die Grenze kann auf verschiedene Arten angegeben werden:
-
- •
-
Die Grenze kann ein absoluter Wert in Byte sein. Ein Suffix wie MiB
kann dabei hilfreich sein. Beispiel: --memlimit-compress=80MiB.
- •
-
Die Grenze kann als Prozentsatz des physischen Gesamtspeichers (RAM)
angegeben werden. Dies ist insbesondere nützlich, wenn in einem
Shell-Initialisierungsskript, das mehrere unterschiedliche Rechner gemeinsam
verwenden, die Umgebungsvariable XZ_DEFAULTS gesetzt ist. Auf diese Weise
ist die Grenze auf Systemen mit mehr Speicher höher. Beispiel:
--memlimit-compress=70%
- •
-
Mit 0 kann die Grenze auf den Standardwert zurückgesetzt werden. Dies
ist gegenwärtig gleichbedeutend mit dem Setzen der Grenze auf max
(keine Speicherbegrenzung). Sobald die Unterstützung für Multi-Threading
implementiert wurde, kann es im Multi-Thread-Fall einen Unterschied zwischen
0 und max geben, daher wird empfohlen, 0 anstelle von max zu
verwenden, bis die Einzelheiten hierzu geklärt sind.
-
Für die 32-Bit-Version von xz gibt es einen Spezialfall: Falls die Grenze
über 4020 MiB liegt, wird die Grenze auf 4020 MiB gesetzt (die
Werte 0 und max werden hiervon nicht beeinflusst; für die
Dekompression gibt es keine vergleichbare Funktion). Dies kann hilfreich
sein, wenn ein 32-Bit-Executable auf einen 4 GiB großen Adressraum
zugreifen kann, wobei wir hoffen wollen, dass es in anderen Situationen
keine negativen Effekte hat.
-
Siehe auch den Abschnitt Speicherbedarf.
- --memlimit-decompress=Grenze
-
legt eine Begrenzung des Speicherverbrauchs für die Dekompression fest. Dies
beeinflusst auch den Modus --list. Falls die Aktion nicht ausführbar ist,
ohne die Grenze zu überschreiten, gibt xz eine Fehlermeldung aus und
die Dekompression wird fehlschlagen. Siehe --memlimit-compress=Grenze
zu möglichen Wegen, die Grenze anzugeben.
- -M Grenze, --memlimit=Grenze, --memory=Grenze
-
Dies ist gleichbedeutend mit --memlimit-compress=Grenze
--memlimit-decompress=Grenze.
- --no-adjust
-
zeigt einen Fehler an und bricht die Ausführung ab, falls die
Kompressionseinstellungen die Begrenzung der Speichernutzung
überschreiten. Standardmäßig werden die Einstellungen nach unten korrigiert,
so dass diese Grenze nicht überschritten wird. Bei der Erzeugung von
Rohdatenströmen (--format=raw) ist die automatische Korrektur stets
deaktiviert.
- -T Threads, --threads=Threads
-
gibt die Anzahl der zu verwendenden Arbeits-Threads an. Wenn Sie Threads
auf einen speziellen Wert 0 setzen, verwendet xz so viele Threads, wie
Prozessorkerne im System verfügbar sind. Die tatsächliche Anzahl kann
geringer sein als die angegebenen Threads, wenn die Eingabedatei nicht
groß genug für Threading mit den gegebenen Einstellungen ist oder wenn mehr
Threads die Speicherbegrenzung übersteigen würden.
-
Die gegenwärtig einzige Threading-Methode teilt die Eingabe in Blöcke und
komprimiert diese unabhängig voneinander. Die vorgegebene Blockgröße ist von
der Kompressionsstufe abhängig und kann mit der Option
--block-size=Größe außer Kraft gesetzt werden.
-
Eine thread-basierte Dekompression wurde bislang noch nicht
implementiert. Sie wird nur bei Dateien funktionieren, die mehrere Blöcke
mit Größeninformationen in deren Headern enthalten. Alle im
Multi-Thread-Modus komprimierten Dateien erfüllen diese Bedingung, im
Einzel-Thread-Modus komprimierte Dateien dagegen nicht, selbst wenn
--block-size=Größe verwendet wird.
Benutzerdefinierte Filterketten für die Kompression
Eine benutzerdefinierte Filterkette ermöglicht die Angabe detaillierter
Kompressionseinstellungen, anstatt von den Voreinstellungen auszugehen. Wenn
eine benutzerdefinierte Filterkette angegeben wird, werden die vorher in der
Befehlszeile angegebenen Voreinstellungsoptionen (
-0 …
-9 und
--extreme) außer Kraft gesetzt. Wenn eine Voreinstellungsoption nach
einer oder mehreren benutzerdefinierten Filterkettenoptionen angegeben wird,
dann wird die neue Voreinstellung wirksam und die zuvor angegebenen
Filterkettenoptionen werden außer Kraft gesetzt.
Eine Filterkette ist mit dem Piping (der Weiterleitung) in der Befehlszeile
vergleichbar. Bei der Kompression gelangt die unkomprimierte Eingabe in den
ersten Filter, dessen Ausgabe wiederum in den zweiten Filter geleitet wird
(sofern ein solcher vorhanden ist). Die Ausgabe des letzten Filters wird in
die komprimierte Datei geschrieben. In einer Filterkette sind maximal vier
Filter zulässig, aber typischerweise besteht eine Filterkette nur aus einem
oder zwei Filtern.
Bei vielen Filtern ist die Positionierung in der Filterkette eingeschränkt:
Einige Filter sind nur als letzte in der Kette verwendbar, einige können
nicht als letzte Filter gesetzt werden, und andere funktionieren an
beliebiger Stelle. Abhängig von dem Filter ist diese Beschränkung entweder
auf das Design des Filters selbst zurückzuführen oder ist aus
Sicherheitsgründen vorhanden.
Eine benutzerdefinierte Filterkette wird durch eine oder mehrere
Filteroptionen in der Reihenfolge angegeben, in der sie in der Filterkette
wirksam werden sollen. Daher ist die Reihenfolge der Filteroptionen von
signifikanter Bedeutung! Beim Dekodieren von Rohdatenströmen
(--format=raw) wird die Filterkette in der gleichen Reihenfolge angegeben
wie bei der Kompression.
Filter akzeptieren filterspezifische Optionen in einer durch Kommata
getrennten Liste. Zusätzliche Kommata in den Optionen werden
ignoriert. Jede Option hat einen Standardwert, daher brauchen Sie nur jene
anzugeben, die Sie ändern wollen.
Um die gesamte Filterkette und die Optionen anzuzeigen, rufen Sie xz
-vv auf (was gleichbedeutend mit der zweimaligen Angabe von --verbose
ist). Dies funktioniert auch zum Betrachten der von den Voreinstellungen
verwendeten Filterkettenoptionen.
- --lzma1[=Optionen]
-
- --lzma2[=Optionen]
-
fügt LZMA1- oder LZMA2-Filter zur Filterkette hinzu. Diese Filter können nur
als letzte Filter in der Kette verwendet werden.
-
LZMA1 ist ein veralteter Filter, welcher nur wegen des veralteten
.lzma-Dateiformats unterstützt wird, welches nur LZMA1 unterstützt. LZMA2
ist eine aktualisierte Version von LZMA1, welche einige praktische Probleme
von LZMA1 behebt. Das .xz-Format verwendet LZMA2 und unterstützt LZMA1
gar nicht. Kompressionsgeschwindigkeit und -verhältnis sind bei LZMA1 und
LZMA2 praktisch gleich.
-
LZMA1 und LZMA2 haben die gleichen Optionen:
-
- preset=Voreinstellung
-
setzt alle LZMA1- oder LZMA2-Optionen auf die Voreinstellung
zurück. Diese Voreinstellung wird in Form einer Ganzzahl angegeben, der
ein aus einem einzelnen Buchstaben bestehender Voreinstellungsmodifikator
folgen kann. Die Ganzzahl kann 0 bis 9 sein, entsprechend den
Befehlszeilenoptionen -0 … -9. Gegenwärtig ist e der einzige
unterstützte Modifikator, was --extreme entspricht. Wenn keine
Voreinstellung angegeben ist, werden die Standardwerte der LZMA1- oder
LZMA2-Optionen der Voreinstellung 6 entnommen.
- dict=Größe
-
Die Größe des Wörterbuchs (Chronikpuffers) gibt an, wie viel Byte der
kürzlich verarbeiteten unkomprimierten Daten im Speicher behalten werden
sollen. Der Algorithmus versucht, sich wiederholende Byte-Abfolgen
(Übereinstimmungen) in den unkomprimierten Daten zu finden und diese durch
Referenzen zu den Daten zu ersetzen, die sich gegenwärtig im Wörterbuch
befinden. Je größer das Wörterbuch, umso größer ist die Chance, eine
Übereinstimmung zu finden. Daher bewirkt eine Erhöhung der Größe des
Wörterbuchs üblicherweise ein besseres Kompressionsverhältnis, aber ein
Wörterbuch, das größer ist als die unkomprimierte Datei, wäre
Speicherverschwendung.
-
Typische Wörterbuch-Größen liegen im Bereich von 64 KiB bis 64 MiB. Das
Minimum ist 4 KiB. Das Maximum für die Kompression ist gegenwärtig 1.5 GiB
(1536 MiB). Bei der Dekompression wird bereits eine Wörterbuchgröße bis zu
4 GiB minus 1 Byte unterstützt, welche das Maximum für die LZMA1- und
LZMA2-Datenstromformate ist.
-
Die Größe des Wörterbuchs und der Übereinstimmungsfinder (Üf)
bestimmen zusammen den Speicherverbrauch des LZMA1- oder
LZMA2-Kodierers. Bei der Dekompression ist ein Wörterbuch der gleichen
Größe (oder ein noch größeres) wie bei der Kompression erforderlich,
daher wird der Speicherverbrauch des Dekoders durch die Größe des bei der
Kompression verwendeten Wörterbuchs bestimmt. Die .xz-Header speichern
die Größe des Wörterbuchs entweder als 2^n oder 2^n + 2^(n-1),
so dass diese Größen für die Kompression etwas bevorzugt werden. Andere
Größen werden beim Speichern in den .xz-Headern aufgerundet.
- lc=lc
-
gibt die Anzahl der literalen Kontextbits an. Das Minimum ist 0 und das
Maximum 4; der Standardwert ist 3. Außerdem darf die Summe von lc und
lp nicht größer als 4 sein.
-
Alle Bytes, die nicht als Übereinstimmungen kodiert werden können, werden
als Literale kodiert. Solche Literale sind einfache 8-bit-Bytes, die jeweils
für sich kodiert werden.
-
Bei der Literalkodierung wird angenommen, dass die höchsten lc-Bits des
zuvor unkomprimierten Bytes mit dem nächsten Byte in Beziehung stehen. Zum
Beispiel folgt in typischen englischsprachigen Texten auf einen
Großbuchstaben ein Kleinbuchstabe und auf einen Kleinbuchstaben
üblicherweise wieder ein Kleinbuchstabe. Im US-ASCII-Zeichensatz sind die
höchsten drei Bits 010 für Großbuchstaben und 011 für Kleinbuchstaben. Wenn
lc mindestens 3 ist, kann die literale Kodierung diese Eigenschaft der
unkomprimierten Daten ausnutzen.
-
Der Vorgabewert (3) ist üblicherweise gut. Wenn Sie die maximale Kompression
erreichen wollen, versuchen Sie lc=4. Manchmal hilft es ein wenig, doch
manchmal verschlechtert es die Kompression. Im letzteren Fall versuchen Sie
zum Beispiel auch lc=2.
- lp=lp
-
gibt die Anzahl der literalen Positionsbits an. Das Minimum ist 0 und das
Maximum 4; die Vorgabe ist 0.
-
Lp beeinflusst, welche Art der Ausrichtung der unkomprimierten Daten beim
Kodieren von Literalen angenommen wird. Siehe pb weiter unten für weitere
Informationen zur Ausrichtung.
- pb=Anzahl
-
legt die Anzahl der Positions-Bits fest. Das Minimum ist 0 und das Maximum
4; Standard ist 2.
-
Pb beeinflusst, welche Art der Ausrichtung der unkomprimierten Daten
generell angenommen wird. Standardmäßig wird eine Vier-Byte-Ausrichtung
angenommen (2^pb=2^2=4), was oft eine gute Wahl ist, wenn es keine
bessere Schätzung gibt.
-
Wenn die Ausrichtung bekannt ist, kann das entsprechende Setzen von pb
die Dateigröße ein wenig verringern. Wenn Textdateien zum Beispiel eine
Ein-Byte-Ausrichtung haben (US-ASCII, ISO-8859-*, UTF-8), kann das Setzen
von pb=0 die Kompression etwas verbessern. Für UTF-16-Text ist pb=1
eine gute Wahl. Wenn die Ausrichtung eine ungerade Zahl wie beispielsweise 3
Byte ist, könnte pb=0 die beste Wahl sein.
-
Obwohl die angenommene Ausrichtung mit pb und lp angepasst werden
kann, bevorzugen LZMA1 und LZMA2 noch etwas die 16-Byte-Ausrichtung. Das
sollten Sie vielleicht beim Design von Dateiformaten berücksichtigen, die
wahrscheinlich oft mit LZMA1 oder LZMA2 komprimiert werden.
- mf=Üf
-
Der Übereinstimmungsfinder hat einen großen Einfluss auf die Geschwindigkeit
des Kodierers, den Speicherbedarf und das
Kompressionsverhältnis. Üblicherweise sind auf Hash-Ketten basierende
Übereinstimmungsfinder schneller als jene, die mit Binärbäumen arbeiten. Die
Vorgabe hängt von der Voreinstellungsstufe ab: 0 verwendet hc3, 1-3
verwenden hc4 und der Rest verwendet bt4.
-
Die folgenden Übereinstimmungsfinder werden unterstützt. Die Formeln zur
Ermittlung des Speicherverbrauchs sind grobe Schätzungen, die der Realität
am nächsten kommen, wenn Wörterbuch eine Zweierpotenz ist.
-
- hc3
-
Hash-Kette mit 2- und 3-Byte-Hashing
Minimalwert für nice: 3
Speicherbedarf:
dict * 7,5 (falls dict <= 16 MiB);
dict * 5,5 + 64 MiB (falls dict > 16 MiB)
- hc4
-
Hash-Kette mit 2-, 3- und 4-Byte-Hashing
Minimaler Wert für nice: 4
Speicherbedarf:
dict * 7,5 (falls dict <= 32 MiB ist);
dict * 6,5 (falls dict > 32 MiB ist)
- bt2
-
Binärbaum mit 2-Byte-Hashing
Minimaler Wert für nice: 2
Speicherverbrauch: dict * 9.5
- bt3
-
Binärbaum mit 2- und 3-Byte-Hashing
Minimalwert für nice: 3
Speicherbedarf:
dict * 11,5 (falls dict <= 16 MiB ist);
dict * 9,5 + 64 MiB (falls dict > 16 MiB ist)
- bt4
-
Binärbaum mit 2-, 3- und 4-Byte-Hashing
Minimaler Wert für nice: 4
Speicherbedarf:
dict * 11,5 (falls dict <= 32 MiB ist);
dict * 10,5 (falls dict > 32 MiB ist)
- mode=Modus
-
gibt die Methode zum Analysieren der vom Übereinstimmungsfinder gelieferten
Daten an. Als Modi werden fast und normal unterstützt. Die Vorgabe
ist fast für die Voreinstellungsstufen 0-3 und normal für die
Voreinstellungsstufen 4-9.
-
Üblicherweise wird fast mit Hashketten-basierten Übereinstimmungsfindern
und normal mit Binärbaum-basierten Übereinstimmungsfindern verwendet. So
machen es auch die Voreinstellungsstufen.
- nice=nice
-
gibt an, was als annehmbarer Wert für eine Übereinstimmung angesehen werden
kann. Wenn eine Übereinstimmung gefunden wird, die mindestens diesen
nice-Wert hat, sucht der Algorithmus nicht weiter nach besseren
Übereinstimmungen.
-
Der nice-Wert kann 2-273 Byte sein. Höhere Werte tendieren zu einem
besseren Kompressionsverhältnis, aber auf Kosten der Geschwindigkeit. Die
Vorgabe hängt von der Voreinstellungsstufe ab.
- depth=Tiefe
-
legt die maximale Suchtiefe im Übereinstimmungsfinder fest. Vorgegeben ist
der spezielle Wert 0, der den Kompressor veranlasst, einen annehmbaren Wert
für Tiefe aus Üf und nice-Wert zu bestimmen.
-
Die angemessene Tiefe für Hash-Ketten ist 4-100 und 16-1000 für
Binärbäume. Hohe Werte für die Tiefe können den Kodierer bei einigen
Dateien extrem verlangsamen. Vermeiden Sie es, die Tiefe über einen Wert
von 100 zu setzen, oder stellen Sie sich darauf ein, die Kompression
abzubrechen, wenn sie zu lange dauert.
-
Beim Dekodieren von Rohdatenströmen (--format=raw) benötigt LZMA2 nur die
Wörterbuch-Größe. LZMA1 benötigt außerdem lc, lp und pb.
- --x86[=Optionen]
-
- --powerpc[=Optionen]
-
- --ia64[=Optionen]
-
- --arm[=Optionen]
-
- --armthumb[=Optionen]
-
- --sparc[=Optionen]
-
fügt ein »Branch/Call/Jump«-(BCJ-)Filter zur Filterkette hinzu. Diese Filter
können nicht als letzter Filter in der Filterkette verwendet werden.
-
Ein BCJ-Filter wandelt relative Adressen im Maschinencode in deren absolute
Gegenstücke um. Die Datengröße wird dadurch nicht geändert, aber die
Redundanz erhöht, was LZMA2 dabei helfen kann, eine um 10 bis 15% kleinere
.xz-Datei zu erstellen. Die BCJ-Filter sind immer reversibel, daher
verursacht die Anwendung eines BCJ-Filters auf den falschen Datentyp keinen
Datenverlust, wobei aber das Kompressionsverhältnis etwas schlechter werden
könnte.
-
Es ist in Ordnung, einen BCJ-Filter auf eine gesamte Binärdatei anzuwenden;
es ist nicht nötig, dies nur auf den binären Bereich zu beschränken. Die
Anwendung eines BCJ-Filters auf ein Archiv, das sowohl binäre als auch
nicht-binäre Dateien enthält, kann gute Ergebnisse liefern, muss es aber
nicht. Daher ist es generell nicht gut, einen BCJ-Filter blindlings
anzuwenden, wenn Sie Binärpakete zwecks Weitergabe komprimieren wollen.
-
Diese BCJ-Filter sind sehr schnell und erhöhen den Speicherbedarf nur
unerheblich. Wenn ein BCJ-Filter das Kompressionsverhältnis einer Datei
verbessert, kann er auch gleichzeitig die Dekompressionsgeschwindigkeit
verbessern. Das kommt daher, dass auf der gleichen Hardware die
Dekompressionsgeschwindigkeit von LZMA2 ungefähr eine feste Anzahl Byte an
komprimierten Daten pro Sekunde ist.
-
Diese BCJ-Filter haben bekannte Probleme mit dem Kompressionsverhältnis:
-
- •
-
In einigen Dateitypen, die ausführbaren Code enthalten (zum Beispiel
Objektdateien, statische Bibliotheken und Linux-Kernelmodule), sind die
Adressen in den Anweisungen mit Füllwerten gefüllt. Diese BCJ-Filter führen
dennoch die Adressumwandlung aus, wodurch die Kompression bei diesen Dateien
schlechter wird.
- •
-
Bei der Anwendung eines BCJ-Filters auf ein Archiv, das mehrere ähnliche
Binärdateien enthält, kann das Kompressionsverhältnis schlechter sein als
ohne BCJ-Filter. Das kommt daher, weil der BCJ-Filter die Grenzen der
Binärdateien nicht erkennt und den Zähler der Adressumwandlung für jede
Binärdatei nicht zurücksetzt.
-
Beide der oben genannten Probleme werden in der Zukunft in einem neuen
Filter nicht mehr auftreten. Die alten BCJ-Filter werden noch in
eingebetteten Systemen von Nutzen sein, weil der Dekoder des neuen Filters
größer sein und mehr Speicher beanspruchen wird.
-
Verschiedene Befehlssätze haben unterschiedliche Ausrichtungen:
-
-
Filter | Ausrichtung | Hinweise
|
x86 | 1 | 32-Bit oder 64-Bit x86
|
PowerPC | 4 | Nur Big Endian
|
ARM | 4 | Nur Little Endian
|
ARM-Thumb | 2 | Nur Little Endian
|
IA-64 | 16 | Big oder Little Endian
|
SPARC | 4 | Big oder Little Endian
|
-
Da die BCJ-gefilterten Daten üblicherweise mit LZMA2 komprimiert sind, kann
das Kompressionsverhältnis dadurch etwas verbessert werden, dass die
LZMA2-Optionen so gesetzt werden, dass sie der Ausrichtung des gewählten
BCJ-Filters entsprechen. Zum Beispiel ist es beim IA-64-Filter eine gute
Wahl, pb=4 mit LZMA2 zu setzen (2^4=16). Der x86-Filter bildet dabei eine
Ausnahme; Sie sollten bei der für LZMA2 voreingestellten 4-Byte-Ausrichtung
bleiben, wenn Sie x86-Binärdateien komprimieren.
-
Alle BCJ-Filter unterstützen die gleichen Optionen:
-
- start=Versatz
-
gibt den Start-Versatz an, der bei der Umwandlung zwischen relativen und
absoluten Adressen verwendet wird. Der Versatz muss ein Vielfaches der
Filterausrichtung sein (siehe die Tabelle oben). Der Standardwert ist 0. In
der Praxis ist dieser Standardwert gut; die Angabe eines benutzerdefinierten
Versatzes ist fast immer unnütz.
- --delta[=Optionen]
-
fügt den Delta-Filter zur Filterkette hinzu. Der Delta-Filter kann nicht als
letzter Filter in der Filterkette verwendet werden.
-
Gegenwärtig wird nur eine einfache, Byte-bezogene Delta-Berechnung
unterstützt. Beim Komprimieren von zum Beispiel unkomprimierten
Bitmap-Bildern oder unkomprimierten PCM-Audiodaten kann es jedoch sinnvoll
sein. Dennoch können für spezielle Zwecke entworfene Algorithmen deutlich
bessere Ergebnisse als Delta und LZMA2 liefern. Dies trifft insbesondere auf
Audiodaten zu, die sich zum Beispiel mit flac(1) schneller und besser
komprimieren lassen.
-
Unterstützte Optionen:
-
- dist=Abstand
-
gibt den Abstand der Delta-Berechnung in Byte an. Zulässige Werte für den
Abstand sind 1 bis 256. Der Vorgabewert ist 1.
-
Zum Beispiel wird mit dist=2 und der 8-Byte-Eingabe A1 B1 A2 B3 A3 B5 A4
B7 die Ausgabe A1 B1 01 02 01 02 01 02 sein.
Andere Optionen
- -q, --quiet
-
unterdrückt Warnungen und Hinweise. Geben Sie dies zweimal an, um auch
Fehlermeldungen zu unterdrücken. Diese Option wirkt sich nicht auf den
Exit-Status aus. Das bedeutet, das selbst bei einer unterdrückten Warnung
der Exit-Status zur Anzeige einer Warnung dennoch verwendet wird.
- -v, --verbose
-
bewirkt ausführliche Ausgaben. Wenn die Standardfehlerausgabe mit einem
Terminal verbunden ist, zeigt xz den Fortschritt an. Durch zweimalige
Angabe von --verbose wird die Ausgabe noch ausführlicher.
-
Der Fortschrittsanzeiger stellt die folgenden Informationen dar:
-
- •
-
Der Prozentsatz des Fortschritts wird angezeigt, wenn die Größe der
Eingabedatei bekannt ist. Das bedeutet, dass der Prozentsatz in
Weiterleitungen (Pipes) nicht angezeigt werden kann.
- •
-
Menge der erzeugten komprimierten Daten (bei der Kompression) oder der
verarbeiteten Daten (bei der Dekompression).
- •
-
Menge der verarbeiteten unkomprimierten Daten (bei der Kompression) oder der
erzeugten Daten (bei der Dekompression).
- •
-
Kompressionsverhältnis, das mittels Dividieren der Menge der bisher
komprimierten Daten durch die Menge der bisher verarbeiteten unkomprimierten
Daten ermittelt wird.
- •
-
Kompressions- oder Dekompressionsgeschwindigkeit. Diese wird anhand der
Menge der unkomprimierten verarbeiteten Daten (bei der Kompression) oder der
Menge der erzeugten Daten (bei der Dekompression) pro Sekunde gemessen. Die
Anzeige startet einige Sekunden nachdem xz mit der Verarbeitung der Datei
begonnen hat.
- •
-
Die vergangene Zeit im Format M:SS oder H:MM:SS.
- •
-
Die geschätzte verbleibende Zeit wird nur angezeigt, wenn die Größe der
Eingabedatei bekannt ist und bereits einige Sekunden vergangen sind, nachdem
xz mit der Verarbeitung der Datei begonnen hat. Die Zeit wird in einem
weniger präzisen Format ohne Doppelpunkte angezeigt, zum Beispiel 2 min 30
s.
-
Wenn die Standardfehlerausgabe kein Terminal ist, schreibt xz mit
--verbose nach dem Komprimieren oder Dekomprimieren der Datei in einer
einzelnen Zeile den Dateinamen, die komprimierte Größe, die unkomprimierte
Größe, das Kompressionsverhältnis und eventuell auch die Geschwindigkeit und
die vergangene Zeit in die Standardfehlerausgabe. Die Geschwindigkeit und
die vergangene Zeit werden nur angezeigt, wenn der Vorgang mindestens ein
paar Sekunden gedauert hat. Wurde der Vorgang nicht beendet, zum Beispiel
weil ihn der Benutzer abgebrochen hat, wird außerdem der Prozentsatz des
erreichten Verarbeitungsfortschritts aufgenommen, sofern die Größe der
Eingabedatei bekannt ist.
- -Q, --no-warn
-
setzt den Exit-Status nicht auf 2, selbst wenn eine Bedingung erfüllt ist,
die eine Warnung gerechtfertigt hätte. Diese Option wirkt sich nicht auf die
Ausführlichkeitsstufe aus, daher müssen sowohl --quiet als auch
--no-warn angegeben werden, um einerseits keine Warnungen anzuzeigen und
andererseits auch den Exit-Status nicht zu ändern.
- --robot
-
gibt Meldungen in einem maschinenlesbaren Format aus. Dadurch soll das
Schreiben von Frontends erleichtert werden, die xz anstelle von Liblzma
verwenden wollen, was in verschiedenen Skripten der Fall sein kann. Die
Ausgabe mit dieser aktivierten Option sollte über mehrere
xz-Veröffentlichungen stabil sein. Details hierzu finden Sie im Abschnitt
ROBOTER-MODUS.
- --info-memory
-
zeigt in einem menschenlesbaren Format an, wieviel physischen Speicher (RAM)
das System nach Annahme von xz hat, sowie die Speicherbedarfsbegrenzung
für Kompression und Dekompression, und beendet das Programm erfolgreich.
- -h, --help
-
zeigt eine Hilfemeldung mit den am häufigsten genutzten Optionen an und
beendet das Programm erfolgreich.
- -H, --long-help
-
zeigt eine Hilfemeldung an, die alle Funktionsmerkmale von xz beschreibt
und beendet das Programm erfolgreich.
- -V, --version
-
zeigt die Versionsnummer von xz und Liblzma in einem menschenlesbaren
Format an. Um eine maschinell auswertbare Ausgabe zu erhalten, geben Sie
--robot vor --version an.
ROBOTER-MODUS
Der Roboter-Modus wird mit der Option
--robot aktiviert. Er bewirkt, dass
die Ausgabe von
xz leichter von anderen Programmen ausgewertet werden
kann. Gegenwärtig wird
--robot nur zusammen mit
--version,
--info-memory und
--list unterstützt. In der Zukunft wird dieser Modus
auch für Kompression und Dekompression unterstützt.
Version
xz --robot --version gibt die Versionsnummern von
xz und Liblzma im
folgenden Format aus:
XZ_VERSION=XYYYZZZS
LIBLZMA_VERSION=XYYYZZZS
- X
-
Hauptversion.
- YYY
-
Unterversion. Gerade Zahlen bezeichnen eine stabile Version. Ungerade Zahlen
bezeichnen Alpha- oder Betaversionen.
- ZZZ
-
Patch-Stufe für stabile Veröffentlichungen oder einfach nur ein Zähler für
Entwicklungsversionen.
- S
-
Stabilität. 0 ist Alpha, 1 ist Beta und 2 ist stabil. S sollte immer 2
sein, wenn YYY eine gerade Zahl ist.
XYYYZZZS sind in beiden Zeilen gleich, sofern xz und Liblzma aus der
gleichen Veröffentlichung der XZ-Utils stammen.
Beispiele: 4.999.9beta ist 49990091 und 5.0.0 is 50000002.
Informationen zur Speicherbedarfsbegrenzung
xz --robot --info-memory gibt eine einzelne Zeile mit drei durch
Tabulatoren getrennten Spalten aus:
- 1.
-
Gesamter physischer Speicher (RAM) in Byte
- 2.
-
Speicherbedarfsbegrenzung für die Kompression in Byte. Ein spezieller Wert
von Null bezeichnet die Standardeinstellung, die im Einzelthread-Modus
bedeutet, dass keine Begrenzung vorhanden ist.
- 3.
-
Speicherbedarfsbegrenzung für die Dekompression in Byte. Ein spezieller Wert
von Null bezeichnet die Standardeinstellung, die im Einzelthread-Modus
bedeutet, dass keine Begrenzung vorhanden ist.
In der Zukunft könnte die Ausgabe von xz --robot --info-memory weitere
Spalten enthalten, aber niemals mehr als eine einzelne Zeile.
Listenmodus
xz --robot --list verwendet eine durch Tabulatoren getrennte Ausgabe. In
der ersten Spalte jeder Zeile bezeichnet eine Zeichenkette den Typ der
Information, die in dieser Zeile enthalten ist:
- name
-
Dies ist stets die erste Zeile, wenn eine Datei aufgelistet wird. Die zweite
Spalte in der Zeile enthält den Dateinamen.
- file
-
Diese Zeile enthält allgemeine Informationen zur .xz-Datei. Diese Zeile
wird stets nach der name-Zeile ausgegeben.
- stream
-
Dieser Zeilentyp wird nur verwendet, wenn --verbose angegeben wurde. Es
gibt genau so viele stream-Zeilen, wie Datenströme in der .xz-Datei
enthalten sind.
- block
-
Dieser Zeilentyp wird nur verwendet, wenn --verbose angegeben wurde. Es
gibt so viele block-Zeilen, wie Blöcke in der .xz-Datei. Die
block-Zeilen werden nach allen stream-Zeilen angezeigt; verschiedene
Zeilentypen werden nicht verschachtelt.
- summary
-
Dieser Zeilentyp wird nur verwendet, wenn --verbose zwei Mal angegeben
wurde. Diese Zeile wird nach allen block-Zeilen ausgegeben. Wie die
file-Zeile enthält die summary-Zeile allgemeine Informationen zur
.xz-Datei.
- totals
-
Diese Zeile ist immer die letzte der Listenausgabe. Sie zeigt die
Gesamtanzahlen und -größen an.
Die Spalten der file-Zeilen:
-
- 2.
-
Anzahl der Datenströme in der Datei
- 3.
-
Gesamtanzahl der Blöcke in den Datenströmen
- 4.
-
Komprimierte Größe der Datei
- 5.
-
Unkomprimierte Größe der Datei
- 6.
-
Das Kompressionsverhältnis, zum Beispiel 0.123. Wenn das Verhältnis über
9.999 liegt, werden drei Minuszeichen (---) anstelle des
Kompressionsverhältnisses angezeigt.
- 7.
-
Durch Kommata getrennte Liste der Namen der Integritätsprüfungen. Für die
bekannten Überprüfungstypen werden folgende Zeichenketten verwendet:
None, CRC32, CRC64 und SHA-256. Unbek.N wird verwendet,
wobei N die Kennung der Überprüfung als Dezimalzahl angibt (ein- oder
zweistellig).
- 8.
-
Gesamtgröße der Datenstromauffüllung in der Datei
Die Spalten der stream-Zeilen:
-
- 2.
-
Datenstromnummer (der erste Datenstrom ist 1)
- 3.
-
Anzahl der Blöcke im Datenstrom
- 4.
-
Komprimierte Startposition
- 5.
-
Unkomprimierte Startposition
- 6.
-
Komprimierte Größe (schließt die Datenstromauffüllung nicht mit ein)
- 7.
-
Unkomprimierte Größe
- 8.
-
Kompressionsverhältnis
- 9.
-
Name der Integritätsprüfung
- 10.
-
Größe der Datenstromauffüllung
Die Spalten der block-Zeilen:
-
- 2.
-
Anzahl der in diesem Block enthaltenen Datenströme
- 3.
-
Blocknummer relativ zum Anfang des Datenstroms (der erste Block ist 1)
- 4.
-
Blocknummer relativ zum Anfang der Datei
- 5.
-
Komprimierter Startversatz relativ zum Beginn der Datei
- 6.
-
Unkomprimierter Startversatz relativ zum Beginn der Datei
- 7.
-
Komprimierte Gesamtgröße des Blocks (einschließlich Header)
- 8.
-
Unkomprimierte Größe
- 9.
-
Kompressionsverhältnis
- 10.
-
Name der Integritätsprüfung
Wenn --verbose zwei Mal angegeben wurde, werden zusätzliche Spalten in
die block-Zeilen eingefügt. Diese werden mit einem einfachen --verbose
nicht angezeigt, da das Ermitteln dieser Informationen viele Suchvorgänge
erfordert und daher recht langsam sein kann:
-
- 11.
-
Wert der Integritätsprüfung in hexadezimaler Notation
- 12.
-
Block-Header-Größe
- 13.
-
Block-Schalter: c gibt an, dass die komprimierte Größe verfügbar ist, und
u gibt an, dass die unkomprimierte Größe verfügbar ist. Falls der
Schalter nicht gesetzt ist, wird stattdessen ein Bindestrich (-)
angezeigt, um die Länge der Zeichenkette beizubehalten. In Zukunft könnten
neue Schalter am Ende der Zeichenkette hinzugefügt werden.
- 14.
-
Größe der tatsächlichen komprimierten Daten im Block. Ausgeschlossen sind
hierbei die Block-Header, die Blockauffüllung und die Prüffelder.
- 15.
-
Größe des Speichers (in Byte), der zum Dekomprimieren dieses Blocks mit
dieser xz-Version benötigt wird.
- 16.
-
Filterkette. Beachten Sie, dass die meisten der bei der Kompression
verwendeten Optionen nicht bekannt sein können, da in den .xz-Headern nur
die für die Dekompression erforderlichen Optionen gespeichert sind.
Die Spalten der summary-Zeilen:
-
- 2.
-
Größe des Speichers (in Byte), der zum Dekomprimieren dieser Datei mit
dieser xz-Version benötigt wird.
- 3.
-
yes oder no geben an, ob in allen Block-Headern sowohl die
komprimierte als auch die unkomprimierte Größe gespeichert ist.
Seit xz 5.1.2alpha:
- 4.
-
Minimale xz-Version, die zur Dekompression der Datei erforderlich ist
Die Spalten der totals-Zeile:
-
- 2.
-
Anzahl der Datenströme
- 3.
-
Anzahl der Blöcke
- 4.
-
Komprimierte Größe
- 5.
-
Unkomprimierte Größe
- 6.
-
Durchschnittliches Kompressionsverhältnis
- 7.
-
Durch Kommata getrennte Liste der Namen der Integritätsprüfungen, die in den
Dateien präsent waren.
- 8.
-
Größe der Datenstromauffüllung
- 9.
-
Anzahl der Dateien. Dies dient dazu, die Reihenfolge der vorigen Spalten an
die in den file-Zeilen anzugleichen.
Wenn --verbose zwei Mal angegeben wird, werden zusätzliche Spalten in die
totals-Zeile eingefügt:
-
- 10.
-
Maximale Größe des Speichers (in Byte), der zum Dekomprimieren der Dateien
mit dieser xz-Version benötigt wird.
- 11.
-
yes oder no geben an, ob in allen Block-Headern sowohl die
komprimierte als auch die unkomprimierte Größe gespeichert ist.
Seit xz 5.1.2alpha:
- 12.
-
Minimale xz-Version, die zur Dekompression der Datei erforderlich ist
Zukünftige Versionen könnten neue Zeilentypen hinzufügen, weiterhin könnten
auch in den vorhandenen Zeilentypen weitere Spalten hinzugefügt werden, aber
die existierenden Spalten werden nicht geändert.
EXIT-STATUS
- 0
-
Alles ist in Ordnung.
- 1
-
Ein Fehler ist aufgetreten.
- 2
-
Es ist etwas passiert, das eine Warnung rechtfertigt, aber es sind keine
tatsächlichen Fehler aufgetreten.
In die Standardausgabe geschriebene Hinweise (keine Warnungen oder Fehler),
welche den Exit-Status nicht beeinflussen.
UMGEBUNGSVARIABLEN
xz wertet eine durch Leerzeichen getrennte Liste von Optionen in den
Umgebungsvariablen
XZ_DEFAULTS und
XZ_OPT aus (in dieser Reihenfolge),
bevor die Optionen aus der Befehlszeile ausgewertet werden. Beachten Sie,
dass beim Auswerten der Umgebungsvariablen nur Optionen berücksichtigt
werden; alle Einträge, die keine Optionen sind, werden stillschweigend
ignoriert. Die Auswertung erfolgt mit
getopt_long(3), welches auch für
die Befehlszeilenargumente verwendet wird.
- XZ_DEFAULTS
-
Benutzerspezifische oder systemweite Standardoptionen. Typischerweise werden
diese in einem Shell-Initialisierungsskript gesetzt, um die
Speicherbedarfsbegrenzung von xz standardmäßig zu aktivieren. Außer bei
Shell-Initialisierungsskripten und in ähnlichen Spezialfällen darf die
Variable XZ_DEFAULTS in Skripten niemals gesetzt oder außer Kraft gesetzt
werden.
- XZ_OPT
-
Dies dient der Übergabe von Optionen an xz, wenn es nicht möglich ist,
die Optionen direkt in der Befehlszeile von xz zu übergeben. Dies ist
beispielsweise der Fall, wenn xz von einem Skript oder Dienstprogramm
ausgeführt wird, zum Beispiel GNU tar(1):
-
-
XZ_OPT=-2v tar caf foo.tar.xz foo
-
Skripte können XZ_OPT zum Beispiel zum Setzen skriptspezifischer
Standard-Kompressionsoptionen verwenden. Es ist weiterhin empfehlenswert,
Benutzern die Außerkraftsetzung von XZ_OPT zu erlauben, falls dies
angemessen ist. Zum Beispiel könnte in sh(1)-Skripten Folgendes stehen:
-
-
XZ_OPT=${XZ_OPT-"-7e"}
export XZ_OPT
KOMPATIBILITÄT ZU DEN LZMA-UTILS
Die Befehlszeilensyntax von
xz ist praktisch eine Obermenge der von
lzma,
unlzma und
lzcat in den LZMA-Utils der Versionen 4.32.x. In
den meisten Fällen sollte es möglich sein, die LZMA-Utils durch die XZ-Utils
zu ersetzen, ohne vorhandene Skripte ändern zu müssen. Dennoch gibt es
einige Inkompatibilitäten, die manchmal Probleme verursachen können.
Voreinstellungsstufen zur Kompression
Die Nummerierung der Voreinstellungsstufen der Kompression ist in
xz und
den LZMA-Utils unterschiedlich. Der wichtigste Unterschied ist die Zuweisung
der Wörterbuchgrößen zu den verschiedenen Voreinstellungsstufen. Die
Wörterbuchgröße ist etwa gleich dem Speicherbedarf bei der Dekompression.
-
Stufe | xz | LZMA-Utils
|
-0 | 256 KiB | nicht verfügbar
|
-1 | 1 MiB | 64 KiB
|
-2 | 2 MiB | 1 MiB
|
-3 | 4 MiB | 512 KiB
|
-4 | 4 MiB | 1 MiB
|
-5 | 8 MiB | 2 MiB
|
-6 | 8 MiB | 4 MiB
|
-7 | 16 MiB | 8 MiB
|
-8 | 32 MiB | 16 MiB
|
-9 | 64 MiB | 32 MiB
|
Die Unterschiede in der Wörterbuchgröße beeinflussen auch den Speicherbedarf
bei der Kompression, aber es gibt noch einige andere Unterschiede zwischen
den LZMA-Utils und den XZ-Utils, die die Kluft noch vergrößern:
-
Stufe | xz | LZMA-Utils 4.32.x
|
-0 | 3 MiB | nicht verfügbar
|
-1 | 9 MiB | 2 MiB
|
-2 | 17 MiB | 12 MiB
|
-3 | 32 MiB | 12 MiB
|
-4 | 48 MiB | 16 MiB
|
-5 | 94 MiB | 26 MiB
|
-6 | 94 MiB | 45 MiB
|
-7 | 186 MiB | 83 MiB
|
-8 | 370 MiB | 159 MiB
|
-9 | 674 MiB | 311 MiB
|
Die standardmäßige Voreinstellungsstufe in den LZMA-Utils ist -7, während
diese in den XZ-Utils -6 ist, daher verwenden beide standardmäßig ein 8
MiB großes Wörterbuch.
Vor- und Nachteile von .lzma-Dateien als Datenströme
Die unkomprimierte Größe der Datei kann in den
.lzma-Headern gespeichert
werden. Die LZMA-Utils tun das beim Komprimieren gewöhnlicher Dateien. Als
Alternative kann die unkomprimierte Größe als unbekannt markiert und eine
Nutzdatenende-Markierung (end-of-payload) verwendet werden, um anzugeben, wo
der Dekompressor stoppen soll. Die LZMA-Utils verwenden diese Methode, wenn
die unkomprimierte Größe unbekannt ist, was beispielsweise in Pipes
(Befehlsverkettungen) der Fall ist.
xz unterstützt die Dekompression von .lzma-Dateien mit oder ohne
Nutzdatenende-Markierung, aber alle von xz erstellten .lzma-Dateien
verwenden diesen Nutzdatenende-Markierung, wobei die unkomprimierte Größe in
den .lzma-Headern als unbekannt markiert wird. Das könnte in einigen
unüblichen Situationen ein Problem sein. Zum Beispiel könnte ein
.lzma-Dekompressor in einem Gerät mit eingebettetem System nur mit
Dateien funktionieren, deren unkomprimierte Größe bekannt ist. Falls Sie auf
dieses Problem stoßen, müssen Sie die LZMA-Utils oder das LZMA-SDK
verwenden, um .lzma-Dateien mit bekannter unkomprimierter Größe zu
erzeugen.
Nicht unterstützte .lzma-Dateien
Das
.lzma-Format erlaubt
lc-Werte bis zu 8 und
lp-Werte bis zu
4. Die LZMA-Utils können Dateien mit beliebigem
lc und
lp
dekomprimieren, aber erzeugen immer Dateien mit
lc=3 und
lp=0. Das
Erzeugen von Dateien mit anderem
lc und
lp ist mit
xz und mit dem
LZMA-SDK möglich.
Die Implementation des LZMA-Filters in liblzma setzt voraus, dass die Summe
von lc und lp nicht größer als 4 ist. Daher können .lzma-Dateien,
welche diese Begrenzung überschreiten, mit xz nicht dekomprimiert werden.
Die LZMA-Utils erzeugen nur .lzma-Dateien mit einer Wörterbuchgröße von
2^n (einer Zweierpotenz), aber akzeptieren Dateien mit einer beliebigen
Wörterbuchgröße. Liblzma akzeptiert nur .lzma-Dateien mit einer
Wörterbuchgröße von 2^n oder 2^n + 2^(n-1). Dies dient zum
Verringern von Fehlalarmen beim Erkennen von .lzma-Dateien.
Diese Einschränkungen sollten in der Praxis kein Problem sein, da praktisch
alle .lzma-Dateien mit Einstellungen komprimiert wurden, die Liblzma
akzeptieren wird.
Angehängter Datenmüll
Bei der Dekompression ignorieren die LZMA-Utils stillschweigend alles nach
dem ersten
.lzma-Datenstrom. In den meisten Situationen ist das ein
Fehler. Das bedeutet auch, dass die LZMA-Utils die Dekompression verketteter
.lzma-Dateien nicht unterstützen.
Wenn nach dem ersten .lzma-Datenstrom Daten verbleiben, erachtet xz
die Datei als beschädigt, es sei denn, die Option --single-stream wurde
verwendet. Dies könnte die Ausführung von Skripten beeinflussen, die davon
ausgehen, dass angehängter Datenmüll ignoriert wird.
ANMERKUNGEN
Die komprimierte Ausgabe kann variieren
Die exakte komprimierte Ausgabe, die aus der gleichen unkomprimierten
Eingabedatei erzeugt wird, kann zwischen den Versionen der XZ-Utils
unterschiedlich sein, selbst wenn die Kompressionsoptionen identisch
sind. Das kommt daher, weil der Kodierer verbessert worden sein könnte
(hinsichtlich schnellerer oder besserer Kompression), ohne das Dateiformat
zu beeinflussen. Die Ausgabe kann sogar zwischen verschiedenen Programmen
der gleichen Version der XZ-Utils variieren, wenn bei der Erstellung des
Binärprogramms unterschiedliche Optionen verwendet wurden.
Sobald --rsyncable implementiert wurde, bedeutet das, dass die sich
ergebenden Dateien nicht notwendigerweise mit Rsync abgeglichen werden
können, außer wenn die alte und neue Datei mit der gleichen xz-Version
erzeugt wurden. Das Problem kann beseitigt werden, wenn ein Teil der
Encoder-Implementierung eingefroren wird, um die mit Rsync abgleichbare
Ausgabe über xz-Versionsgrenzen hinweg stabil zu halten.
Eingebettete .xz-Dekompressoren
Eingebettete
.xz-Dekompressor-Implementierungen wie XZ Embedded
unterstützen nicht unbedingt Dateien, die mit anderen Integritätsprüfungen
(
Prüfung-Typen) als
none und
crc32 erzeugt wurden. Da
--check=crc64 die Voreinstellung ist, müssen Sie
--check=none oder
--check=crc32 verwenden, wenn Sie Dateien für eingebettete Systeme
erstellen.
Außerhalb eingebetteter Systeme unterstützen die Dekompressoren des
.xz-Formats alle Prüfung-Typen oder sind mindestens in der Lage, die
Datei zu dekomprimieren, ohne deren Integrität zu prüfen, wenn die bestimmte
Prüfung nicht verfügbar ist.
XZ Embedded unterstützt BCJ-Filter, aber nur mit dem vorgegebenen
Startversatz.
BEISPIELE
Grundlagen
Komprimiert die Datei
foo mit der Standard-Kompressionsstufe (
-6) zu
foo.xz und entfernt
foo nach erfolgreicher Kompression:
-
xz foo
bar.xz in bar dekomprimieren und bar.xz selbst dann nicht löschen,
wenn die Dekompression erfolgreich war:
-
xz -dk bar.xz
baz.tar.xz mit der Voreinstellung -4e (-4 --extreme) erzeugen, was
langsamer ist als beispielsweise die Vorgabe -6, aber weniger Speicher
für Kompression und Dekompression benötigt (48 MiB beziehungsweise 5 MiB):
-
tar cf - baz | xz -4e > baz.tar.xz
Eine Mischung aus komprimierten und unkomprimierten Dateien kann mit einem
einzelnen Befehl dekomprimiert in die Standardausgabe geschrieben werden:
-
xz -dcf a.txt b.txt.xz c.txt d.txt.lzma > abcd.txt
Parallele Kompression von vielen Dateien
Auf GNU- und *BSD-Systemen können
find(1) und
xargs(1) zum
Parallelisieren der Kompression vieler Dateien verwendet werden:
-
find . -type f \! -name '*.xz' -print0 \
| xargs -0r -P4 -n16 xz -T1
Die Option -P von xargs(1) legt die Anzahl der parallelen
xz-Prozesse fest. Der beste Wert für die Option -n hängt davon ab, wie
viele Dateien komprimiert werden sollen. Wenn es sich nur um wenige Dateien
handelt, sollte der Wert wahrscheinlich 1 sein; bei Zehntausenden von
Dateien kann 100 oder noch mehr angemessener sein, um die Anzahl der
xz-Prozesse zu beschränken, die xargs(1) schließlich erzeugen wird.
Die Option -T1 für xz dient dazu, den Einzelthread-Modus zu erzwingen,
da xargs(1) zur Steuerung des Umfangs der Parallelisierung verwendet
wird.
Roboter-Modus
Berechnen, wie viel Byte nach der Kompression mehrerer Dateien insgesamt
eingespart wurden:
-
xz --robot --list *.xz | awk '/^totals/{print $5-$4}'
Ein Skript könnte abfragen wollen, ob es ein xz verwendet, das aktuell
genug ist. Das folgende sh(1)-Skript prüft, ob die Versionsnummer des
Dienstprogramms xz mindestens 5.0.0 ist. Diese Methode ist zu alten
Beta-Versionen kompatibel, welche die Option --robot nicht unterstützen:
-
if ! eval "$(xz --robot --version 2> /dev/null)" ||
[ "$XZ_VERSION" -lt 50000002 ]; then
echo "Ihre Version von Xz ist zu alt."
fi
unset XZ_VERSION LIBLZMA_VERSION
Eine Speicherbedarfsbegrenzung für die Dekompression mit XZ_OPT setzen,
aber eine bereits gesetzte Begrenzung nicht erhöhen:
-
NEWLIM=$((123 << 20)) # 123 MiB
OLDLIM=$(xz --robot --info-memory | cut -f3)
if [ $OLDLIM -eq 0 -o $OLDLIM -gt $NEWLIM ]; then
XZ_OPT="$XZ_OPT --memlimit-decompress=$NEWLIM"
export XZ_OPT
fi
Benutzerdefinierte Filterketten für die Kompression
Der einfachste Anwendungsfall für benutzerdefinierte Filterketten ist die
Anpassung von LZMA2-Voreinstellungsstufen. Das kann nützlich sein, weil die
Voreinstellungen nur einen Teil der potenziell sinnvollen Kombinationen aus
Kompressionseinstellungen abdecken.
Die KompCPU-Spalten der Tabellen aus den Beschreibungen der Optionen -0 …
-9 und --extreme sind beim Anpassen der LZMA2-Voreinstellungen
nützlich. Diese sind die relevanten Teile aus diesen zwei Tabellen:
-
Voreinstellung | KompCPU
|
-0 | 0
|
-1 | 1
|
-2 | 2
|
-3 | 3
|
-4 | 4
|
-5 | 5
|
-6 | 6
|
-5e | 7
|
-6e | 8
|
Wenn Sie wissen, dass eine Datei für eine gute Kompression ein etwas
größeres Wörterbuch benötigt (zum Beispiel 32 MiB), aber Sie sie schneller
komprimieren wollen, als dies mit xz -8 geschehen würde, kann eine
Voreinstellung mit einem niedrigen KompCPU-Wert (zum Beispiel 1) dahingehend
angepasst werden, ein größeres Wörterbuch zu verwenden:
-
xz --lzma2=preset=1,dict=32MiB foo.tar
Mit bestimmten Dateien kann der obige Befehl schneller sein als xz -6,
wobei die Kompression deutlich besser wird. Dennoch muss betont werden, dass
nur wenige Dateien von einem größeren Wörterbuch profitieren, wenn der
KompCPU-Wert niedrig bleibt. Der offensichtlichste Fall, in dem ein größeres
Wörterbuch sehr hilfreich sein kann, ist ein Archiv, das einander sehr
ähnliche Dateien enthält, die jeweils wenigstens einige Megabyte groß
sind. Das Wörterbuch muss dann deutlich größer sein als die einzelne Datei,
damit LZMA2 den größtmöglichen Vorteil aus den Ähnlichkeiten der aufeinander
folgenden Dateien zieht.
Wenn hoher Speicherbedarf für Kompression und Dekompression kein Problem ist
und die zu komprimierende Datei mindestens einige Hundert Megabyte groß ist,
kann es sinnvoll sein, ein noch größeres Wörterbuch zu verwenden, als die 64
MiB, die mit xz -9 verwendet werden würden:
-
xz -vv --lzma2=dict=192MiB big_foo.tar
Die Verwendung von -vv (--verbose --verbose) wie im obigen Beispiel
kann nützlich sein, um den Speicherbedarf für Kompressor und Dekompressor zu
sehen. Denken Sie daran, dass ein Wörterbuch, das größer als die
unkomprimierte Datei ist, Speicherverschwendung wäre. Daher ist der obige
Befehl für kleine Dateien nicht sinnvoll.
Manchmal spielt die Kompressionszeit keine Rolle, aber der Speicherbedarf
bei der Dekompression muss gering gehalten werden, zum Beispiel um die Datei
auf eingebetteten Systemen dekomprimieren zu können. Der folgende Befehl
verwendet -6e (-6 --extreme) als Basis und setzt die Wörterbuchgröße
auf nur 64 KiB. Die sich ergebende Datei kann mit XZ Embedded (aus diesem
Grund ist dort --check=crc32) mit nur etwa 100 KiB Speicher
dekomprimiert werden.
-
xz --check=crc32 --lzma2=preset=6e,dict=64KiB foo
Wenn Sie so viele Byte wie möglich herausquetschen wollen, kann die
Anpassung der Anzahl der literalen Kontextbits (lc) und der Anzahl der
Positionsbits (pb) manchmal hilfreich sein. Auch die Anpassung der Anzahl
der literalen Positionsbits (lp) könnte helfen, aber üblicherweise sind
lc und pb wichtiger. Wenn ein Quellcode-Archiv zum Beispiel
hauptsächlich ASCII-Text enthält, könnte ein Aufruf wie der folgende eine
etwas kleinere Datei (etwa 0,1 %) ergeben als mit xz -6e (versuchen Sie
es auch lc=4):
-
xz --lzma2=preset=6e,pb=0,lc=4 Quellcode.tar
Die Verwendung eines anderen Filters mit LZMA2 kann die Kompression bei
verschiedenen Dateitypen verbessern. So könnten Sie eine gemeinsam genutzte
Bibliothek der Architekturen x86-32 oder x86-64 mit dem BCJ-Filter für x86
komprimieren:
-
xz --x86 --lzma2 libfoo.so
Beachten Sie, dass die Reihenfolge der Filteroptionen von Bedeutung
ist. Falls --x86 nach --lzma2 angegeben wird, gibt xz einen Fehler
aus, weil nach LZMA2 kein weiterer Filter sein darf und auch weil der
BCJ-Filter für x86 nicht als letzter Filter in der Filterkette gesetzt
werden darf.
Der Delta-Filter zusammen mit LZMA2 kann bei Bitmap-Bildern gute Ergebnisse
liefern. Er sollte üblicherweise besser sein als PNG, welches zwar einige
fortgeschrittene Filter als ein simples delta bietet, aber für die
eigentliche Kompression »Deflate« verwendet.
Das Bild muss in einem unkomprimierten Format gespeichert werden, zum
Beispiel als unkomprimiertes TIFF. Der Abstandsparameter des Delta-Filters
muss so gesetzt werden, dass er der Anzahl der Bytes pro Pixel im Bild
entspricht. Zum Beispiel erfordert ein 24-Bit-RGB-Bitmap dist=3, außerdem
ist es gut, pb=0 an LZMA2 zu übergeben, um die 3-Byte-Ausrichtung zu
berücksichtigen:
-
xz --delta=dist=3 --lzma2=pb=0 foo.tiff
Wenn sich mehrere Bilder in einem einzelnen Archiv befinden (zum Beispiel
.tar), funktioniert der Delta-Filter damit auch, sofern alle Bilder im
Archiv die gleiche Anzahl Bytes pro Pixel haben.
SIEHE AUCH
xzdec(1),
xzdiff(1),
xzgrep(1),
xzless(1),
xzmore(1),
gzip(1),
bzip2(1),
7z(1)
XZ Utils: <https://tukaani.org/xz/>
XZ Embedded: <https://tukaani.org/xz/embedded.html>
LZMA-SDK: <http://7-zip.org/sdk.html>