La compression avec xz sous Linux

I. Présentation

Il y a maintenant quelques années (le 17 avril 2015 très exactement) Mickael avait édité un billet concernant un outil de compression, aujourd'hui devenu un quasi-standard : xz. Dans le présent tutoriel, je vais reprendre les grandes lignes de l’utilisation de cet outil mais en développant un point essentiel de la vie des administrateurs système : la compression du noyau linux lui-même.

II. L'outil xz

Comme il a déjà été dit, xz est un utilitaire de compression de données en ligne de commande, assez similaire à ce que sait faire gzip ou bzip2. Il peut être utilisé pour compresser (ou décompresser) un fichier en fonction du mode opératoire. L’outil supporte des formats variés permettant de compresser ou décompresser les fichiers sous GNU/Linux, y compris les archives .tar.

 

REMARQUE: xz utilise l’algorithme LZMA2 qui est le descendant de LZMA (Lempel-Ziv-Markov chain Algorithm) permettant d’avoir des taux de compression très impressionnant.

La sélection d’un outil de compression dépend principalement de deux facteurs essentiels :

  • la vitesse de compression
  • le taux de compression

Contrairement à ses concurrents, xz n’est pas fréquemment utilisé, mais il possède la meilleure compression qui soit. La façon de compresser un fichier est d’utiliser l’une des deux possibilités équivalentes suivantes:

  • utiliser l’option -z
  • utiliser l’option --compress

Exemple: pour compresser un fichier d’archive sample.tar

# tar cvf sample.tar `ls /tmp`
# xz -z sample.tar

A l’opposé, pour décompresser un fichier, il suffit simplement d’utiliser l’une des possibilités ci-dessous :

  • option -d
  • commande unxz

Exemple: décompression du fichier sample.tar.xz

# unxz sample.tar.xz

Si l’on souhaite conserver le ou les fichier(s) d’origine tout en générant un fichier .xz compressé, on doit utiliser l’option -k:

# xz -k sample.tar
REMARQUE: lorsque l’opération de compression échoue pour quelque raison que ce soit, on peut malgré tout forcer le fichier compressé à être généré en utilisant l’option -f.

Outre ses capacités de compression/décompression, l’utilitaire xz possède également différents niveaux prédéfinis de compression, allant de 0 à 9 (le niveau par défaut étant 6). On peut aussi utiliser l’un des deux alias :

  • --fast pour le niveau 0 (compression minimale)
  • --best pour le niveau 9 (compression maximale)

Exemple: pour un niveau de compression 8 :

$ xz -8 sample.tar
$ xz --fast sample.tar

De plus, lorsque l’on souhaite compresser un fichier très volumineux et que la taille mémoire est assez restreinte, on peut utiliser l’option --memlimit-compress de la façon suivante :

$ xz -5 --memlimit-compress=15% sample.tar

On peut également utiliser l’option --memlimit (ou l’option -M), et exprimer la valeur en MiB plutôt qu’en pourcentage, comme décrit ci-dessus.

REMARQUE: on peut d’ailleurs séparément fixer la limite mémoire pour l’opération de compression (avec --memlimit-compress) et celle de décompression (avec --memlimit-decompress). Lorsque l’utilisation mémoire (pour l’une ou l’autre des opérations de compression ou décompression) est dépassée, celle-ci échoue et un message d’erreur est alors affiché.
ATTENTION : si l’on positionne la limite de mémoire à zéro, cela a pour effet de réinitialiser le seuil de mémoire utilisée à son standard par défaut (c’est-à-dire au seuil maximum donc pas de limite d’utilisation de mémoire). On peut aussi utiliser plus de ressources CPU en mentionnant l’option -e (extreme), afin d’augmenter le taux de compression tout en prenant un peu plus de temps lors de cette opération.

On peut effectuer l’opération de compression en mode silencieux grâce à l’option -q ou au contraire activer le mode verbeux via l’option -v. Il est tout à fait possible d’utiliser xz pour compresser une archive de l’une des façons suivantes :

$ tar -cf - *.txt | xz -7 > sample.tar.xz

Ou

$ tar -cJf sample.tar.xz *.txt

Afin de vérifier l’intégrité d’un fichier compressé il faut utiliser l’option -t. De même, lorsque l’on souhaite récolter des informations  à propos d’un fichier compressé, il faut utiliser l’option -l:

Si l’on souhaite modifier le suffixe par défaut .xz, il suffit de mentionner le nouveau suffixe via l’option -S (ou --suffix). Par ailleurs, via l’option -C on peut aussi spécifier le type de vérification d’intégrité effectuée : none, crc32, crc64 ou sha256. A contrario, si l’on ne souhaite pas activer la vérification d’intégrité, il suffit de mentionner l’option --ignore-check.

Afin d’optimiser le temps de traitement de l’opération (compression ou décompression), il est aussi possible d’activer plusieurs threads simultanément grâce à l’option --threads ou -T. Cela permet de scinder le fichier d’origine en blocs équivalents et de les compresser de façon indépendante les uns des autres en parallèle:

# xz -6ve --threads=4 sample.tar

III. Application au noyau linux

Si l’on applique cela aux fichiers d’instance du noyau linux, cela peut s’avérer très intéressant, non seulement à cause du taux de compression (et donc du gain de place) mais, également pour uniformiser les fichiers de noyau linux.

Prenons l’exemple d’un noyau linux 3.16 que l’on souhaite récupérer sur sa distribution. On devra se connecter en tant qu’utilisateur sur sa machine et se positionner dans /usr/src (par exemple). On peut alors récupérer l’archive compressée du noyau linux :

# wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.16.1.tar.xz

Il faut alors décompresser ce fichier .xz :

# tar -xJvf linux-3.16.1.tar.xz

Cela permet de créer l’arborescence linux-3.16.1, dans laquelle on va retrouver les différents fichiers ci-dessous :

REMARQUE: ici, l’option -J permet de décompresser une image compressée au format .xz. Associée à l’option -c, on peut ainsi créer une archive compressée et avec l’option -x, la décompresser. Les noyaux linux depuis la version 3.2.54 ne sont plus diffusées qu’au format tar.gz et tar.xz. Avec le tiret '-', l'ordre est très important. C'est pourquoi -J apparaît en seconde position.

Afin d’obtenir de l’information quant à la nature de l’archive compressée ou du noyau compressé, on peut exécuter la commande ci-dessous fournissant le taux de compression ainsi que le ratio et l’algorithme de vérification d’intégrité :

# xz -l linux-3.16.1.tar.xz
Strms  Blocks   Compressed Uncompressed  Ratio  Check   Filename
  3       3      76,8 MiB    497,9 MiB   0,140  CRC64   linux-3.16.1.tar.xz

Lorsque l’on décompresse ce type de fichier on se retrouve inexorablement avec une archive .tar:

# unxz linux-3.16.1.tar.xz
# ls
linux-3.16.1.tar

On peut alors éclater cette archive afin de pouvoir naviguer au sein de l’arborescence:

# tar xvf linux-3.16.1.tar

Si l’on regarde le contenu de l’arborescence ainsi obtenue, on constate que l’on est bien en présence d’une image noyau linux comme décrite ci-dessus:

ATTENTION : parfois, dans certains de ces fichiers il nous est donné également de trouver des modules noyau (dont le suffixe est .ko pour kernel objects). Ces mêmes fichiers peuvent eux aussi être compressés au format xz. Pour s’en assurer on peut également utiliser la commande précédente xz -l. Ceci vaut aussi pour les patches noyau pouvant eux aussi être au format xz.
# xz -dc ./patch-3.16.1.xz | patch -p1

Dès que l'archive est décompressée, on peut alors effectuer la compilation et l'édition de lien normale pour un noyau linux.

IV. Conclusion

L’utilitaire xz, outre ses capacités, permet également d’appliquer sa formidable compression à des fichiers volumineux et peut également s’appliquer alors au noyau linux ou aux patches. Il est vrai qu’encore il n’y a pas si longtemps, cet outil était confidentiel. J’espère qu’avec l’édition de ce billet, beaucoup d’entre vous vont promouvoir cet extraordinaire outil de compression, afin qu’il puisse être généralisé (voire supplanter les anciennes générations d’utilitaires) et, pourquoi pas, permettre une certaine standardisation.

A noter que le package xz fournit également quelques commandes supplémentaires bien utiles (qui pourront faire l’objet d’un autre billet), permettant de travailler sur des fichiers compressés .xz ainsi que leur contenu:

  • xzcat
  • xzgrep
  • xzless
  • xzmore

Ce qu’il faut retenir, c’est que lorsque l’on compresse des fichiers de façon interactive à la volée, on peut facilement le faire avec gzip -6 ou xz -1. Par contre, pour la configuration de journaux de logs en rotation automatique, exécutée généralement à un moment où il est possible d’utiliser plus de ressources CPU, on envisagera l’utilisation de xz -9 afin de préserver le maximum d’espace disque possible, et en effectuant des compressions maximales.

C’est l’une des raisons pour lesquelles on a utilisé xz pour la compression du noyau linux. En effet, il vaut mieux passer du temps à forcer une compression maximale pour un fichier qui sera ensuite téléchargé et décompressé des centaines, voire des milliers de fois. Au final, cela résulte en un gain de bande passante, en respectant une vitesse de décompression tout à fait raisonnable.

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Philippe PIERRE

A exercé de nombreuses années en tant qu'administrateur de base de données et comme administrateur Système Unix/Linux. Il a enseigné les réseaux au CNAM (Paris). Aujourd'hui, employé en tant qu'ingénieur infrastructure, au sein d'un laboratoire pharmaceutique et administrant un cluster de calculs HPC, il connaît parfaitement les environnements GNU/Linux dans le cadre d'une entreprise et des systèmes de haute disponibilité. Il aime partager son expérience.

Nombre de posts de cet auteur : 69.Voir tous les posts

4 thoughts on “La compression avec xz sous Linux

  • Bonjour ! merci pour cette article, mais il doit avoir une erreur quelque part au Chapitre 3 au moment de la décompression de noyaux Linux « tar -xvfJ linux-3.16.1.tar.xz ».
    j’ai essayer un copier coller
    La réponse;
    tar: J : open impossible: Aucun fichier ou dossier de ce type
    tar: Error is not recoverable: exiting now
    ou bien c’est moi qui a manqué un truc !

    Répondre
    • Bonjour. Non ce n’est pas vous, mais moi qui est mal écrit la commande. Avec le ‘-‘ l’ordre des options est important. Or, le -J doit apparaître en second: -cJf (compression) et -xJvf (décompression). Encore désolé pour la mauvaise notation.

      Répondre
  • Bonjour !

    Après un copier coller de la décompression du noyaux au chapitre III « tar -xvfJ linux-3.16.1.tar.xz », j’ai une erreur.
    J’ai peut être fait quelque chose d’incorrect aussi.

    Bon article et merci pour le partage

    Répondre
  • Bonjour
    Effectivement, j’ai mal écrit la commande. En effet, l’ordre des options llorsqu’on utilise le tiret : -cJf (pour la compression) et -xJvf (pour la décompression) est important.
    Le J apparaît en seconde position. Donc, la bonne syntaxe est : -xJvf
    Encore désolé pour cette erreur. Ceci dit, j’ai plus l’habitude d’utiliser unxz.
    Bonne journée.

    Répondre

Répondre à Philippe PIERRE Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.