Warum extrahiert GNU tar so langsam?
(mort.coffee)- Die Untersuchung begann, weil das Entpacken von 518GiB
tar.gzextrem 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
gnuund unterscheidet sich von pax - Ähnlich wie pax auf UStar basierend, nutzt aber andere Methoden zur Kodierung von Pfaden und großen Dateien
→ TypL: Die Payload des nächsten Dateiobjekts stelltfile_pathdar
→ TypK: Die Payload des nächsten Dateiobjekts stelltlink_pathdar
→ Beide können nacheinander angewendet werden
→ Ist eine Datei größer als 8GiB, wird das High Bit des ersten Zeichens vonfile_sizegesetzt. 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_pathmit..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-pathsoder-Phinzufügen
→ Diese Option speichert absolute Pfade und weist..zurück
→ Mit der Option-Pwird 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?