Pourquoi GNU tar est-il si lent à extraire ?
(mort.coffee)- L’enquête a commencé en constatant un ralentissement énorme lors de l’extraction d’un
tar.gzde 518GiB - Explication du format tar et présentation, en parallèle, d’un code d’extracteur tar rapide
Format de fichier Tar original
- Tar est très atypique pour un fichier d’archive
→ Il n’y a pas d’en-tête d’archive, pas d’index de fichiers pour la recherche, pas de magic bytes permettant d’identifier qu’il s’agit d’un tar, pas de footer, ni de métadonnées
→ Dans un tar, il n’existe qu’un seul type d’objet : le fichier - Types de fichiers : 0 (fichier ordinaire), 1 (lien physique), 2 (lien symbolique)
- Explication de la structure de l’en-tête d’objet fichier de 512 octets
→ La plus grande limite est que le chemin de fichier ne peut faire que 100 caractères. De plus, la taille maximale d’un fichier est de 8GiB
Fichier étendu UStar
- La longueur maximale du chemin de fichier passe à 256 et de nouveaux types de fichiers sont ajoutés
- Extension de l’en-tête avec ajout de magic bytes et d’un champ
prefix - Types de fichiers ajoutés : 3 (périphérique caractère), 4 (périphérique bloc), 5 (répertoire), 6 (fichier FIFO), 7 (fichier contigu)
- Mais la limite de 8GiB reste inchangée
Format de fichier Pax
- Le format tar est étendu via la CLI pax dans la norme POSIX.1-2001
- Identique à UStar, mais avec ajout des formats de fichiers x et g
→ En tant qu’enregistrements d’en-tête étendus,xne s’applique qu’au fichier suivant, tandis quegs’applique à tous les fichiers qui suivent
Format de fichier GNU Tar
- Son format propre est
gnu, différent de pax - Comme pax, il repose sur UStar, mais utilise une autre méthode pour encoder les chemins et les gros fichiers
→ TypeL: la charge utile de l’objet fichier suivant représente"file_path"
→ TypeK: la charge utile de l’objet fichier suivant représente"link_path"
→ Il est possible d’appliquer les deux à la suite
→ Si un fichier dépasse 8GiB, le bit de poids fort du premier caractère defile_sizeest activé. Le reste de la chaîne est alors analysé en base 256 (entier sur 95 bits)
Pourquoi GNU tar est-il lent à décompresser ?
- Si l’on place dans l’en-tête d’un fichier une valeur comme
file_path="../hello.txt", cela crée un problème de sécurité. Mais il n’est pas simple de l’empêcher - GNU tar crée un placeholder lorsqu’il rencontre
".."danslink_path, puis traite cela en différé - Cependant, dans le cas d’un lien physique sans
"..", il voudrait le créer directement, mais c’est impossible car un placeholder existe déjà - Autrement dit, pour créer un lien physique, il faut d’abord vérifier s’il correspond à un lien différé ; et si c’est le cas, le nouveau lien doit lui aussi être traité en différé
→ GNU tar doit donc rechercher les liens différés pour tous les liens physiques. Pour une raison inconnue, il effectue en pratique cette recherche deux fois - Dans le fichier tar de l’auteur, il y avait plus de 800 000 liens contenant
".."et plus de 5,4 millions de liens physiques, ce qui a ralenti l’extraction - Pour éviter cela, il faut ajouter à tar l’option
--absolute-pathsou-P
→ Cette option enregistre des chemins absolus et refuse".."
→ En d’autres termes, l’option-Pdésactive le mécanisme de liens différés
1 commentaires
Les articles sur tar sont toujours intéressants..
hop - un format d’archive 10 fois plus rapide que tar
Pourquoi un fichier tar.xz créé avec Python est-il plus petit qu’un fichier créé avec tar par défaut ?