- Die Untersuchung begann, weil das Entpacken von 518GiB
tar.gz extrem langsam wurde
- Erklärung des Tar-Formats und Beschreibung anhand eines selbst geschriebenen schnellen Tar-Extractors
Das originale Tar-Dateiformat
- Tar ist als Archivformat sehr ungewöhnlich
→ Es gibt keinen Archiv-Header, keinen Dateiindex für die Suche, keine Magic Bytes zur Erkennung als Tar, keinen Footer und keine Metadaten
→ In Tar gibt es nur einen einzigen Typ von Dateiobjekten
- Dateitypen: 0 (normale Datei), 1 (Hardlink), 2 (symbolischer Link)
- Erklärung der Struktur des 512-Byte-Headers eines Dateiobjekts
→ Die größte Einschränkung ist, dass Dateipfade nur 100 Zeichen lang sein dürfen. Außerdem ist die Dateigröße auf maximal 8GiB begrenzt
UStar-Erweiterungsdatei
- Dateipfade sind nun bis zu 256 Zeichen lang, und es wurden neue Dateitypen hinzugefügt
- Der Header wurde erweitert und um Magic Bytes sowie ein
prefix-Feld ergänzt
- Hinzugefügte Dateitypen: 3 (Character Device), 4 (Block Device), 5 (Verzeichnis), 6 (FIFO-Datei), 7 (zusammenhängende Datei)
- Die Größenbegrenzung von 8GiB bleibt jedoch bestehen
Pax-Dateiformat
- Erweiterung des Tar-Formats über das
pax-CLI im Standard POSIX.1-2001
- Entspricht UStar, ergänzt aber die Dateiformate x und g
→ Als erweiterte Header-Records gilt x nur für die nächste Datei, g hingegen für alle folgenden Dateien
GNU-Tar-Dateiformat
- Das eigene Format ist
gnu und unterscheidet sich von pax
- Ähnlich wie pax auf UStar basierend, nutzt aber andere Methoden zur Kodierung von Pfaden und großen Dateien
→ Typ L: Die Payload des nächsten Dateiobjekts stellt file_path dar
→ Typ K: Die Payload des nächsten Dateiobjekts stellt link_path dar
→ Beide können nacheinander angewendet werden
→ Ist eine Datei größer als 8GiB, wird das High Bit des ersten Zeichens von file_size gesetzt. Der Rest der Zeichenkette wird dann als Base-256 geparst (95-Bit-Integer)
Warum dekomprimiert GNU tar so langsam?
- Wenn im Header einer Datei ein Wert wie
file_path="../hello.txt" steht, entsteht ein Sicherheitsproblem. Es ist jedoch nicht einfach, das zu verhindern
- GNU tar erstellt bei
link_path mit .. einen Platzhalter und verarbeitet ihn verzögert
- Bei Hardlinks ohne
.. würde man sie eigentlich direkt anlegen wollen, doch wegen bereits vorhandener Platzhalter ist das nicht möglich
- Um also einen Hardlink anzulegen, muss zunächst vollständig geprüft werden, ob es sich um einen verzögerten Link handelt; falls ja, muss auch der neue Link verzögert verarbeitet werden
→ Für alle Hardlinks müssen also verzögerte Links durchsucht werden. Warum auch immer, in der Praxis geschieht diese Suche sogar zweimal
- Im Tar des Autors gab es über 800.000 Links mit
.. und mehr als 5,4 Millionen Hardlinks, weshalb das Entpacken langsam wurde
- Um das zu vermeiden, sollte man tar die Option
--absolute-paths oder -P hinzufügen
→ Diese Option speichert absolute Pfade und weist .. zurück
→ Mit der Option -P wird also der Mechanismus für verzögerte Verlinkung deaktiviert
1 Kommentare
Artikel rund um Tar sind immer interessant..
hop - ein 10-mal schnelleres Archivformat als tar
Warum ist eine mit Python erstellte tar.xz-Datei kleiner als eine mit dem Standard-tar erstellte Datei?