Cours Linux / Créer une sauvegarde tar.gz et vérifier sa restauration

Une sauvegarde tar.gz n’est utile que si vous pouvez la restaurer et vérifier le résultat. Créez l’archive avec des chemins relatifs, contrôlez sa somme SHA-256, extrayez-la dans un dossier distinct et comparez les fichiers et droits nécessaires avant de compter dessus. La compression seule ne crée ni copie indépendante ni garantie de récupération.

Cette pratique crée de petits fichiers neufs dans votre répertoire personnel sur Ubuntu 26.04 LTS ou Rocky Linux 9. Elle n’accède ni à vos fichiers de production ni à un serveur distant. Le cours sur disque et système de fichiers aide à distinguer un dossier différent d’un support réellement indépendant.

Distinguer archive, compression, synchronisation et sauvegarde

Opération Ce qu’elle apporte Ce qu’elle ne garantit pas
Archivage Regroupe plusieurs fichiers et certaines métadonnées. Une restauration utilisable sans contrôle des droits et de l’application.
Compression Réduit éventuellement l’espace occupé par les données. Le chiffrement, une autre copie ou une économie de taille pour tout fichier.
Synchronisation Rapproche l’état actuel d’une source et d’une destination. La conservation d’un état antérieur : une erreur peut se propager.
Sauvegarde Préserve un état récupérable selon une politique de conservation. La disponibilité tant qu’une restauration réelle n’a pas été testée.

Une copie située sur le même disque peut sauver un fichier écrasé par erreur, mais peut disparaître avec le disque. Pour une vraie stratégie de sauvegarde, choisissez un stockage indépendant, plusieurs points de reprise et des droits empêchant les identifiants de production de modifier immédiatement toutes les copies. Si les archives contiennent des données sensibles, protégez-les avec un chiffrement adapté et conservez la clé et la procédure de récupération séparément. Évaluez aussi le temps nécessaire à une restauration.

Préparer un atelier isolé et exécuter la sauvegarde

Vérifiez la présence de Bash, de tar, de sha256sum et des outils de base. Sur une installation minimale, recherchez le paquet manquant avec le gestionnaire APT ou DNF avant l’exercice. Copiez le bloc entier dans backup-lab.sh avec des fins de ligne LF, puis lancez bash backup-lab.sh comme utilisateur ordinaire. Le script s’arrête au premier échec et conserve le dossier pour inspection ; il ne supprime aucun fichier.

#!/usr/bin/env bash
set -euo pipefail
for tool in mktemp mkdir printf chmod tar sha256sum diff stat cat; do
  command -v "$tool" >/dev/null || { printf 'Outil absent : %s\n' "$tool" >&2; exit 1; }
done

lab=$(mktemp -d "$HOME/linux-backup-lab.XXXXXX")
printf 'Dossier de pratique : %s\n' "$lab"
mkdir -- "$lab/source" "$lab/archives" "$lab/restore"
mkdir -- "$lab/source/docs"
printf 'version 1\n' > "$lab/source/docs/note.txt"
printf 'enabled=yes\n' > "$lab/source/settings.conf"
chmod 600 "$lab/source/settings.conf"

tar -czf "$lab/archives/source.tar.gz" -C "$lab" source
tar -tzf "$lab/archives/source.tar.gz"
(
  cd "$lab/archives"
  sha256sum source.tar.gz > source.tar.gz.sha256
  sha256sum -c source.tar.gz.sha256
)

tar -xzf "$lab/archives/source.tar.gz" -C "$lab/restore"
diff -r "$lab/source" "$lab/restore/source"
source_mode=$(stat -c '%a' "$lab/source/settings.conf")
restored_mode=$(stat -c '%a' "$lab/restore/source/settings.conf")
printf 'Modes source/restauration : %s / %s\n' "$source_mode" "$restored_mode"
if [[ "$source_mode" != 600 || "$restored_mode" != "$source_mode" ]]; then
  printf 'Mode 600 absent ou non préservé ; examiner la restauration\n' >&2
  exit 1
fi
cat "$lab/restore/source/docs/note.txt"

printf 'version 2\n' > "$lab/source/docs/note.txt"
if diff -r "$lab/source" "$lab/restore/source"; then
  printf 'Différence attendue absente : arrêter et examiner les chemins\n' >&2
  exit 1
else
  comparison_status=$?
  if (( comparison_status != 1 )); then
    printf 'Échec de comparaison (état %s)\n' "$comparison_status" >&2
    exit "$comparison_status"
  fi
fi
printf 'La restauration garde version 1 ; le dossier est conservé : %s\n' "$lab"

Le répertoire créé par mktemp -d change de nom à chaque exécution. Les dossiers source, archives et restore sont distincts : l’archive ne se trouve donc pas dans la source qu’elle sauvegarde. Le fichier settings.conf est créé avec le mode 600, c’est-à-dire lisible et modifiable normalement par son propriétaire uniquement dans le modèle classique des permissions Unix. Sur un système où les ACL ou la politique de sécurité ajoutent des règles, cette notation seule ne résume pas tous les accès.

Vérifier l’archive et sa somme de contrôle

tar -czf crée une archive compressée par gzip et -C "$lab" source enregistre des membres sous source/…, sans chemin absolu. tar -tzf doit montrer le dossier et les deux fichiers docs/note.txt et settings.conf. Lisez cette liste avant toute extraction d’une archive étrangère. Le manuel officiel de GNU tar décrit la création, l’inspection et l’extraction des archives.

sha256sum calcule une empreinte SHA-256 de l’archive ; sha256sum -c compare ensuite les octets au manifeste enregistré et doit afficher source.tar.gz: OK. Cette comparaison détecte une différence entre l’archive et son manifeste. Si un attaquant peut remplacer les deux, elle ne prouve pas l’origine de l’archive. Conservez donc le manifeste dans un contexte de confiance adapté à votre besoin. La documentation GNU des utilitaires SHA-2 précise le format et le contrôle.

Restaurer ailleurs, puis comparer deux états

Le script extrait l’archive uniquement dans le répertoire restore neuf et compare récursivement les fichiers avec diff -r. Une absence de sortie avec un état 0 signifie que les contenus parcourus correspondent. stat -c '%a' relève le mode des deux copies de settings.conf : le script exige 600 pour la source et le même mode pour la restauration. cat doit lire version 1 dans la note restaurée. Si un de ces contrôles échoue, le script s’arrête et laisse tous les éléments dans le chemin annoncé.

Le script modifie ensuite uniquement la note source en version 2. Cette fois, diff doit trouver une différence et renvoyer l’état 1 ; un état supérieur indique une erreur de comparaison et arrête l’exercice. L’archive et la copie restaurée conservent version 1. Ce résultat concret montre pourquoi une sauvegarde d’un instant donné diffère d’une synchronisation de l’état courant.

Comparer le contenu et un mode ne vérifie pas toute la restauration. Selon l’application, il peut aussi falloir préserver propriétaire, listes de contrôle d’accès (ACL), attributs étendus, liens, chemins et configuration. Testez que le service peut utiliser les données restaurées dans un environnement de reprise approprié ; une comparaison de fichiers seule ne démontre pas une reprise fonctionnelle.

Examiner les archives inconnues et les données en cours d’écriture

Une archive reçue d’une source inconnue peut contenir des chemins ou liens inattendus, beaucoup de fichiers ou des tailles très élevées. Inspectez son inventaire, puis, si l’extraction est nécessaire, utilisez un compte sans privilège dans un dossier neuf isolé des données importantes. Le simple affichage de la liste ne garantit pas l’innocuité de tous les contenus ; ne restaurez pas une archive inconnue à la racine du système avec des droits administrateur.

Une base de données en fonctionnement peut modifier plusieurs fichiers entre le début et la fin d’une copie tar. Utilisez les procédures de sauvegarde logique ou physique prises en charge par ce moteur et les conditions de cohérence qu’il exige, telles qu’un arrêt contrôlé ou un instantané coordonné. Définissez la perte de données admissible et le délai de reprise, puis vérifiez-les avec une restauration effective. Cet atelier de deux petits fichiers ne simule pas cette cohérence.

Prévisualiser une synchronisation avec rsync

Si rsync est installé, la commande suivante affiche les changements prévus dans les dossiers de l’atelier, sans les appliquer. Exécutez-la après le script, dans le même terminal seulement si vous avez copié le chemin affiché dans une variable lab contrôlée ; le script enfant ne transmet pas sa variable à votre shell. Remplacez le chemin d’exemple par le dossier réellement annoncé et vérifiez qu’il contient les trois sous-dossiers attendus.

lab="$HOME/linux-backup-lab.REPLACE_WITH_ACTUAL_SUFFIX"
test -d "$lab/source" && test -d "$lab/restore/source" && \
  rsync -av --dry-run "$lab/source/" "$lab/restore/source/"

Le suffixe d’exemple n’est pas une valeur à lancer telle quelle. Le manuel officiel de rsync explique que le / final de la source copie son contenu dans la cible plutôt que d’ajouter un niveau de dossier. --dry-run reste une prévisualisation : les fichiers peuvent changer avant une véritable exécution. --delete pourrait effacer des fichiers présents uniquement à la destination ; cet exercice ne l’emploie pas. Une synchronisation n’est pas un substitut à des points de sauvegarde indépendants.

Conservez le dossier de pratique tant que vous examinez les résultats. Lorsque vous n’en avez plus besoin, vérifiez son chemin exact, l’absence de processus qui l’utilise et le contenu de ses trois sous-dossiers avant de retirer uniquement les fichiers de cet atelier. Le script ne supprime rien et une relance crée un autre dossier neuf.