Aller au contenu

C04 – Automatiser une sauvegarde avec un script Bash

1. Principes

Principe Application
Automatiser Ne pas dépendre d'un oubli
Contrôler les erreurs Un script qui échoue silencieusement est dangereux
Dater Pouvoir retrouver une version précise
Limiter la rétention Ne pas saturer le disque
Séparer La sauvegarde ne doit pas rester sur la même machine (règle du 3-2-1)
Tester la restauration Une sauvegarde non testée n'est pas une sauvegarde

2. Le script

À enregistrer sous sav.sh puis rendre exécutable (chmod +x sav.sh). À tester dans le laboratoire.

#!/bin/bash
# Sauvegarde datée avec conservation des 7 dernières archives
set -u
SRC="${1:-}"
DEST="${2:-}"
KEEP=7
if [ -z "$SRC" ] || [ -z "$DEST" ]; then
  echo "Usage : $0 <dossier_source> <dossier_destination>" >&2
  exit 1
fi
if [ ! -d "$SRC" ]; then
  echo "Erreur : source introuvable : $SRC" >&2
  exit 2
fi
mkdir -p "$DEST" || exit 3
ARCHIVE="$DEST/sauvegarde-$(date +%Y-%m-%d_%H%M%S).tar.gz"
if tar -czf "$ARCHIVE" -C "$SRC" . ; then
  echo "OK : $ARCHIVE"
else
  echo "Erreur : échec de l'archive" >&2
  exit 4
fi
ls -1t "$DEST"/sauvegarde-*.tar.gz 2>/dev/null | tail -n +$((KEEP+1)) | while read -r f; do
  rm -- "$f" && echo "Supprimé (ancien) : $f"
done

Je comprends

Ligne Rôle
set -u Erreur si une variable n'est pas définie
SRC, DEST Arguments : dossier à sauvegarder et dossier de destination
Tests -z et -d Vérifier les arguments et l'existence de la source
exit 1 à 4 Codes de sortie distincts pour savoir ce qui a échoué
date +%Y-%m-%d_%H%M%S Nom daté, triable
tar -czf Archive compressée du contenu de la source
ls -1t puis tail -n +8 ls -1t liste les archives de la plus récente à la plus ancienne ; tail -n +8 ne retient que celles au-delà des 7 plus récentes, qui sont supprimées par la boucle

Tests à réaliser

Test Attendu
./sav.sh sans argument Message d'usage, code de sortie 1
./sav.sh /dossier/inexistant /tmp/sauv Erreur « source introuvable », code 2
Lancer 9 fois avec un dossier valide Il reste 7 archives

Pour lire le code de sortie : echo $? juste après la commande.

3. Planification

La planification se fait avec cron. La commande crontab -e ouvre la table de l'utilisateur ; la ligne suivante lance la sauvegarde chaque jour à 2 h :

0 2 * * * /usr/local/bin/sav.sh /srv/donnees /srv/sauvegardes >> /var/log/sav.log 2>&1

Les cinq champs sont : minute, heure, jour du mois, mois, jour de la semaine. Le journal /var/log/sav.log permet de vérifier l'exécution.

4. Test de restauration

Étape Commande
Lister le contenu d'une archive tar -tzf <archive>
Restaurer dans un dossier de test mkdir /tmp/restau && tar -xzf <archive> -C /tmp/restau
Comparer avec la source diff -r <source> /tmp/restau

Aucune différence affichée signifie que la restauration est conforme.

Warning

Ne restaure jamais par-dessus les données de production sans l'avoir testé ailleurs. Une sauvegarde qui reste sur le même disque que la source ne protège pas d'une panne du disque : prévoir une copie sur un autre support ou un autre site.

5. Documenter

Pour le portfolio : besoin, choix (rétention de 7, heure, destination), journal des tests, preuve de restauration (capture du diff vide), procédure de reprise.

Grille d'évaluation (20 points)

Critère Points Auto-évaluation
Script exécuté, erreurs gérées 5
Rétention vérifiée (7 archives) 4
Planification correcte 3
Restauration prouvée 5
Documentation et limites (même disque) 3
Total 20