Aller au contenu
Administration Linux medium

tar avancé : backups, compression et restauration sélective

30 min de lecture

Tout le monde sait créer un .tar.gz. Le niveau RHCSA et LFCS exige davantage. Sauvegardes incrémentales après minuit, exclusion des /proc et des caches, transfert direct vers un serveur de backup via SSH sans créer de fichier intermédiaire, restauration d'un seul fichier dans une archive de 50 Go, ce sont ces gestes que ce guide couvre.

Ce sujet est un objectif direct RHCSA ("Archive, compress, unpack, and uncompress files using tar, star, gzip, and bzip2") et LFCS ("Archive, backup, compress, unpack, and decompress files").

  • Créer une sauvegarde complète puis des sauvegardes incrémentales avec --listed-incremental
  • Exclure des répertoires ou patterns avec --exclude et --exclude-from
  • Choisir entre gzip, bzip2, xz et zstd selon le compromis vitesse/taux
  • Extraire un fichier précis d'une grande archive sans tout décompresser
  • Transférer une archive via SSH en un pipeline sans fichier temporaire
  • Vérifier l'intégrité d'une archive avant restauration

Le tableau ci-dessous fait le lien entre une situation d'exploitation réelle et l'option tar qui la résout. Lisez-le de gauche à droite : la colonne de droite donne le mot-clé à retenir, pas la commande complète. Chaque technique est détaillée plus bas avec sa commande de vérification, car une sauvegarde qu'on n'a jamais relue n'est pas une sauvegarde.

SituationTechnique tar
Backup quotidien d'un répertoire de config--listed-incremental
Sauvegarder /home sans les caches et .git--exclude
Archiver un gros répertoire sur un serveur limité en espacexz ou zstd
Restaurer un seul fichier /etc/nginx.conf depuis une archiveextraction sélective
Envoyer un backup vers un serveur distant sans monter de NFStar + ssh pipeline
Vérifier qu'une archive de sauvegarde est lisibletar -tvf ou --compare

Une seule règle de syntaxe évite la majorité des erreurs de débutant : l'option -f doit être la dernière lettre du groupe, parce que c'est elle qui consomme l'argument suivant comme nom d'archive. Taper tar -fcz archive.tar.gz fait lire cz comme nom de fichier, et tar répond You must specify one of the '-Acdtrux' … options. Les autres lettres se répartissent en deux familles : le mode d'action (-c, -x, -t), dont une seule est autorisée par commande, et le codec de compression (-z, -j, -J, --zstd).

Fenêtre de terminal
# Créer une archive compressée gzip
tar -czf archive.tar.gz /repertoire/
# Lister le contenu
tar -tvf archive.tar.gz
# Extraire
tar -xzf archive.tar.gz -C /destination/

-c créer · -x extraire · -t lister · -v verbose · -f fichier · -z gzip · -j bzip2 · -J xz · --zstd zstd


Sauvegardes incrémentales avec --listed-incremental

Section intitulée « Sauvegardes incrémentales avec --listed-incremental »

Une sauvegarde complète archive tout. Une sauvegarde incrémentale n'archive que les fichiers modifiés ou créés depuis la dernière sauvegarde. C'est la base de tout plan de backup sérieux.

tar gère cela nativement via un fichier snapshot (.snar) qui enregistre l'état du répertoire au moment du backup.

Le premier appel a deux effets simultanés : il produit l'archive complète et il crée le fichier snapshot. Placez ce .snar hors du répertoire sauvegardé, sinon il finit dans sa propre archive et change à chaque exécution. Le répertoire /var/backup/ doit exister au préalable : tar ne crée pas l'arborescence du snapshot et s'arrête sur Cannot open.

Fenêtre de terminal
tar --listed-incremental=/var/backup/home.snar \
-czf /var/backup/home-full-$(date +%F).tar.gz \
/home/bob/
  • --listed-incremental=/var/backup/home.snar : crée ou met à jour le fichier snapshot
  • Au premier appel, le .snar n'existe pas → tar archive tout
Fenêtre de terminal
tar --listed-incremental=/var/backup/home.snar \
-czf /var/backup/home-incr-$(date +%F-%H%M).tar.gz \
/home/bob/

La deuxième fois, tar lit le snapshot et n'inclut que les fichiers modifiés depuis la dernière exécution.

Fenêtre de terminal
# Compter les fichiers dans chaque backup
tar -tvf /var/backup/home-full-2026-04-09.tar.gz | wc -l
tar -tvf /var/backup/home-incr-2026-04-09-0200.tar.gz | wc -l

Le backup incrémental doit contenir beaucoup moins de fichiers que le backup complet. Ne vous étonnez pas d'y retrouver tous les répertoires de l'arborescence, même ceux qui n'ont pas bougé : tar les réinscrit à chaque niveau pour pouvoir rejouer les suppressions à la restauration. Ce sont les lignes commençant par -rw qu'il faut compter, pas celles en drwx.

La restauration se fait dans l'ordre : backup complet, puis chaque incrémental dans l'ordre chronologique.

Fenêtre de terminal
# 1. Extraire le backup complet
tar --listed-incremental=/dev/null \
-xzf /var/backup/home-full-2026-04-09.tar.gz \
-C /restore/
# 2. Appliquer l'incrémental du lendemain
tar --listed-incremental=/dev/null \
-xzf /var/backup/home-incr-2026-04-10-0200.tar.gz \
-C /restore/

--listed-incremental=/dev/null lors de l'extraction indique à tar d'appliquer les suppressions enregistrées dans le snapshot (fichiers effacés entre deux backups).


Sauvegarder /home en incluant les caches de navigateur, les .git et les répertoires node_modules est un gaspillage. tar offre deux mécanismes d'exclusion.

Un --exclude mal placé ne sert à rien : l'option doit apparaître avant le chemin à archiver sur la ligne de commande, faute de quoi GNU tar l'applique seulement aux arguments qui la suivent. Pensez aussi à quoter chaque motif, sinon le shell l'expanse avant que tar le reçoive et l'exclusion ne portera que sur les fichiers présents dans le répertoire courant.

Fenêtre de terminal
tar -czf /var/backup/home-clean.tar.gz \
--exclude='.cache' \
--exclude='.local/share/Trash' \
--exclude='**/node_modules' \
--exclude='**/.git' \
/home/bob/
  • Les patterns sont relatifs au répertoire archivé
  • On peut cumuler plusieurs --exclude
  • Les ** (globbing) fonctionnent avec GNU tar

Au-delà de trois ou quatre motifs, la ligne de commande devient illisible et surtout impossible à versionner. Un fichier d'exclusions se relit et se partage entre plusieurs scripts de sauvegarde. Deux contraintes de format : un motif par ligne, sans guillemets (c'est tar qui lit le fichier, pas le shell), et aucun commentaire, car GNU tar traite une ligne commençant par # comme un motif ordinaire qui ne correspondra à rien.

Contenu de /etc/backup/exclusions.txt :

.cache
.local/share/Trash
**/node_modules
**/.git
**/tmp
*.log
*.pid
/proc
/sys
/dev
/run
Fenêtre de terminal
tar -czf /var/backup/systeme.tar.gz \
--exclude-from=/etc/backup/exclusions.txt \
/

Le choix d'un codec est un arbitrage entre le temps CPU passé à compresser et l'espace disque économisé. Deux colonnes du tableau comptent vraiment : la vitesse, qui détermine si la sauvegarde tient dans sa fenêtre nocturne, et le taux, qui décide de la place occupée sur le serveur de backup. La compression n'est pas intégrée à tar : l'option délègue à un programme externe (gzip, bzip2, xz, zstd). Le codec doit donc être installé sur la machine qui relit l'archive, pas seulement sur celle qui la crée. Une sauvegarde en .tar.zst illisible sur le serveur de restauration est un incident classique.

CodecOption tarExtensionTauxVitesseQuand l'utiliser
gzip-z.tar.gzMoyenTrès rapidePar défaut, logs, configs, transferts fréquents
bzip2-j.tar.bz2BonLentArchivage longue durée, espace prioritaire
xz-J.tar.xzExcellentTrès lentDistributions, sources, taille minimale
zstd--zstd.tar.zstTrès bonRapideBackups modernes, meilleur ratio vitesse/taux

Repérez l'extension utilisée dans chaque commande : elle n'a aucun effet technique (tar détecte seul le format à la lecture), mais elle documente le codec pour l'administrateur qui trouvera le fichier dans six mois. Notez aussi que --zstd est une option longue et ne se groupe pas avec les autres lettres : on écrit tar --zstd -cf, jamais tar -c--zstdf.

Fenêtre de terminal
# gzip : usage quotidien (défaut)
tar -czf logs-$(date +%F).tar.gz /var/log/nginx/
# bzip2 : archivage longue durée
tar -cjf archives-2025.tar.bz2 /var/archive/2025/
# xz : distribution de sources
tar -cJf mon-projet-1.0.tar.xz ./mon-projet/
# zstd : backup rapide avec bon taux
tar --zstd -cf backup-$(date +%F).tar.zst /home/

Les taux annoncés dans le tableau sont des ordres de grandeur : le gain réel dépend entièrement de vos données. Des logs texte se compressent à plus de 90 %, des images JPEG ou des archives déjà compressées ne gagnent rien et coûtent du temps CPU pour rien. Mesurez sur votre jeu de données avant de figer un codec dans un script de production, en comparant la taille des archives à celle de la source.

Fenêtre de terminal
ls -lh /var/backup/home-full-2026-04-09.tar.{gz,zst,bz2,xz}
du -sh /home/bob/

Extraction sélective, un seul fichier d'une grande archive

Section intitulée « Extraction sélective, un seul fichier d'une grande archive »

Inutile de décompresser 50 Go pour récupérer un seul fichier de configuration.

L'extraction sélective échoue presque toujours pour la même raison : le chemin demandé ne correspond pas à celui stocké dans l'archive. Commencez donc par lister, puis copiez-collez le chemin affiché. Sur une archive volumineuse, cette lecture décompresse quand même tout le flux ; comptez plusieurs minutes sur plusieurs dizaines de gigaoctets, et filtrez avec grep plutôt que de faire défiler la sortie.

Fenêtre de terminal
tar -tvf /var/backup/home-full-2026-04-09.tar.gz | grep nginx.conf
-rw-r--r-- bob/bob 2847 2026-04-08 22:13 home/bob/.config/nginx/nginx.conf
Fenêtre de terminal
tar -xzf /var/backup/home-full-2026-04-09.tar.gz \
-C /tmp/restore/ \
home/bob/.config/nginx/nginx.conf

Le chemin doit correspondre exactement à ce que tar -tvf affiche (sans / initial dans la plupart des cas).

Le même principe s'applique à un répertoire : passez son chemin sans le / initial et tar restaure toute la sous-arborescence, permissions et dates comprises. Le répertoire de destination passé à -C doit exister, tar ne le crée pas et s'arrête sur Cannot open. L'arborescence complète du chemin est recréée sous cette destination.

Fenêtre de terminal
tar -xzf /var/backup/home-full-2026-04-09.tar.gz \
-C /tmp/restore/ \
home/bob/.config/
Fenêtre de terminal
tar -xzf /var/backup/home-full-2026-04-09.tar.gz \
--strip-components=2 \
-C /tmp/restore/ \
home/bob/.config/

--strip-components=2 supprime les 2 premiers niveaux du chemin dans l'archive (home/bob/) pour extraire directement dans /tmp/restore/.


L'un des gestes les plus élégants de tar : créer une archive sur la sortie standard, la passer directement dans SSH, et l'extraire sur le serveur distant, tout en un seul pipeline.

Le - qui suit -czf remplace le nom de fichier par la sortie standard : tar n'écrit rien sur le disque local, le flux part directement dans le tube vers ssh. Attention à l'endroit où $(date +%F) est évalué : entre guillemets doubles, la substitution a lieu sur la machine locale avant l'envoi, ce qui est généralement le comportement voulu pour dater l'archive selon l'horloge de la source.

Fenêtre de terminal
# Archiver localement, extraire sur le serveur distant
tar -czf - /home/bob/projets/ | ssh bob@serveur-backup "cat > /backup/projets-$(date +%F).tar.gz"

Copier une arborescence en préservant les permissions

Section intitulée « Copier une arborescence en préservant les permissions »
Fenêtre de terminal
# Archiver et extraire immédiatement sur le serveur distant
tar -czf - /etc/ | ssh bob@serveur-backup "tar -xzf - -C /backup/etc/"

Ce pipeline préserve les permissions, les UID, les GID, les liens symboliques et les dates, ce que scp -r ne fait pas toujours correctement.

Le sens inverse fonctionne aussi : c'est tar qui s'exécute à distance et écrit sur sa sortie standard, que ssh rapatrie et qu'une redirection locale enregistre. Utile quand le serveur source manque d'espace disque pour héberger l'archive intermédiaire. Vérifiez toujours l'archive reçue avec tar -tvf avant de supprimer quoi que ce soit à la source : une coupure réseau produit un fichier tronqué qui a l'air normal jusqu'à ce qu'on tente de le lire.

Fenêtre de terminal
ssh bob@serveur-source "tar -czf - /var/www/html/" > /backup/html-$(date +%F).tar.gz

Un backup inutilisable est pire qu'aucun backup. Toujours vérifier avant de se retrouver dans une situation d'urgence. Gardez en tête la limite du format : une archive tar ne porte aucune somme de contrôle globale. Une lecture complète détecte une troncature au milieu d'un fichier, mais une archive coupée pile sur une frontière de bloc peut se lister sans erreur. Pour une garantie réelle, stockez un sha256sum de l'archive à côté d'elle.

Fenêtre de terminal
tar -tvf /var/backup/home-full-2026-04-09.tar.gz > /dev/null && echo "Archive OK"

Si tar renvoie un code de retour non-nul, l'archive est corrompue.

Le piège se cache dans le tube : $? renvoie le code du dernier élément du pipeline, donc celui de tail, qui réussit même quand tar a échoué avant lui. Un script de supervision écrit ainsi déclare toutes ses archives valides. Deux parades en bash : tester tar seul, ou lire ${PIPESTATUS[0]} immédiatement après le pipeline.

Fenêtre de terminal
# Mauvais : $? contient le code de tail, toujours 0
tar -tvf /var/backup/home-full-2026-04-09.tar.gz | tail -5
echo "Code retour : $?"
# Correct : on lit le code de tar lui-même
tar -tvf /var/backup/home-full-2026-04-09.tar.gz | tail -5
echo "Code retour tar : ${PIPESTATUS[0]}"

Une archive tronquée, par exemple parce que le disque s'est rempli pendant la sauvegarde, se signale par tar: Unexpected EOF in archive ou par une erreur remontée du décompresseur, et tar sort avec le code 2.

Fenêtre de terminal
tar --compare -f sauvegarde.tar.gz -C / 2>&1 | head -20

Cette commande compare le contenu de l'archive existante avec le système de fichiers actuel, et affiche les différences (taille, date, contenu). L'option -C / indique depuis quelle racine comparer les chemins de l'archive.


Les erreurs de tar sont laconiques et la cause réelle est rarement celle qu'annonce le message. Avant de chercher plus loin, distinguez trois familles : un problème d'archive (corrompue, tronquée), un problème d'environnement (codec absent, disque plein) et un problème de chemin (snapshot égaré, / initial retiré). Le tableau ci-dessous associe le message affiché à la famille concernée et à l'action corrective.

SymptômeCause probableSolution
tar: Error is not recoverable: exiting nowArchive corrompue ou tronquéeVérifier le fichier source, retester avec -tvf
tar: Removing leading '/' from member namesChemins absolus dans l'archiveNormal avec -C / à l'extraction. Utiliser --strip-components si besoin
Backup incrémental archive tout malgré le .snarFichier .snar absent ou corrompuSupprimer le .snar et refaire un backup complet
xz: Cannot exec: No such file or directoryxz non installéapt install xz-utils ou dnf install xz
zstd: command not foundzstd non installéapt install zstd ou dnf install zstd
Extraction coupée à mi-cheminEspace disque insuffisantdf -h pour vérifier, libérer de l'espace

Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

6 questions
6 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

  • --listed-incremental est le mécanisme natif de tar pour les backups incrémentaux : backup complet au premier appel, incrémental ensuite.
  • --exclude et --exclude-from évitent d'archiver les caches, .git et node_modules.
  • zstd est le meilleur choix pour les backups modernes : taux comparable à bzip2, vitesse proche de gzip.
  • L'extraction sélective (tar -xzf archive.tar.gz chemin/dans/archive) évite de tout décompresser.
  • Le pipeline tar | ssh transfère une arborescence complète sans fichier temporaire et préserve les permissions.
  • Toujours tester une archive avec tar -tvf avant d'en avoir besoin.
  • Synchroniser avec rsync : Synchronisation intelligente (delta) vers un serveur distant, l'outil complémentaire de tar pour les backups continus.
  • Vérifier l'intégrité d'un fichier : sha256sum, md5sum et signatures GPG pour s'assurer qu'une archive n'a pas été altérée.
  • Copier avec SCP : Copie rapide one-shot via SSH, l'alternative simple à tar+ssh pour les fichiers individuels.
  • Référence tar : Toutes les options tar classées par usage, cheatsheet complète.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn