Cours Ubuntu 26.04 / Sauvegarder les configurations, paquets et données utilisateur
Une sauvegarde Ubuntu doit couvrir les fichiers nécessaires, rester disponible en cas de panne de l’original et permettre une restauration vérifiée. Une liste de paquets ou un instantané de VM ne suffit pas à lui seul ; ce cours prépare les inventaires puis restaure des archives dans un emplacement séparé, sans remplacer les fichiers actifs.
Définir ce que la restauration doit rendre utilisable
| Périmètre | Éléments à conserver et à vérifier |
|---|---|
| Configuration | Fichiers modifiés, raisons des choix, versions et dépendances ; protection des secrets. |
| Données utilisateur | Chemins réels, contenu, identifiants numériques UID/GID, permissions et attributs nécessaires. |
| Applications | Exports de bases, volumes, fichiers déposés et procédure de cohérence entre ces données. |
| Paquets | Installation manuelle APT, versions, applications Snap, dépôts et clés associés. |
| Moyens de reprise | Console, média de démarrage, clés de déchiffrement et personne capable de les obtenir. |
Définissez la perte de modifications acceptable et le délai de remise en service. Ces deux objectifs déterminent la fréquence, les générations conservées et les moyens de restauration. Un instantané sur le même stockage facilite certains retours, mais reste vulnérable à la perte de ce stockage.
Copier les fichiers d’une base en cours d’écriture peut produire un ensemble incohérent. Utilisez son export pris en charge ou une procédure coordonnée d’arrêt ou de gel. Pour les ACL, listes de contrôle d’accès, et les attributs étendus, vérifiez la conservation à l’aller comme au retour sur les systèmes de fichiers réels.
Enregistrer les paquets et les particularités du serveur
Ce bloc crée un répertoire privé neuf sous le dossier personnel, sans installer ni retirer de paquet. Il conserve des listes, pas le contenu des réglages ni des documents :
(
set -eu
umask 077
inventory_dir=$(mktemp -d "$HOME/ubuntu-inventory.XXXXXX")
apt-mark showmanual > "$inventory_dir/apt-manual.txt"
dpkg-query -W -f='${binary:Package}\t${Version}\n' > "$inventory_dir/dpkg-versions.tsv"
if command -v snap >/dev/null 2>&1; then
snap list > "$inventory_dir/snap-list.txt"
fi
cat /etc/os-release > "$inventory_dir/os-release.txt"
printf "%s\n" "$inventory_dir"
)
Ajoutez à votre inventaire les chemins des configurations modifiées et les sources APT réellement employées. Une adresse de dépôt ou un nom d’utilisateur peut constituer une information d’exploitation à protéger. Une version ancienne présente dans la liste n’est pas nécessairement encore disponible ou adaptée au système de destination.
Réinstaller tous les noms sans examen peut introduire des paquets devenus inutiles ou incompatibles. Distinguez aussi la récupération du même serveur et le clonage d’un nouveau serveur : machine-id, clés hôtes SSH et adresses statiques ne doivent pas être dupliqués sans décision explicite.
Faire un premier aller-retour sur des fichiers de test
Enregistrez ce script complet dans ~/backup-roundtrip-lab.sh et lancez bash ~/backup-roundtrip-lab.sh. Il nécessite tar, sha256sum et cmp, utilise des fichiers neufs dans un répertoire temporaire et ne demande pas sudo :
set -eu
umask 077
lab_dir=$(mktemp -d)
mkdir "$lab_dir/source" "$lab_dir/restored"
printf "original data\n" > "$lab_dir/source/note with spaces.txt"
tar -C "$lab_dir/source" -cpf "$lab_dir/data.tar" .
(
cd "$lab_dir"
sha256sum data.tar > data.tar.sha256
sha256sum -c data.tar.sha256
)
tar -tf "$lab_dir/data.tar"
tar -C "$lab_dir/restored" -xpf "$lab_dir/data.tar"
cmp "$lab_dir/source/note with spaces.txt" "$lab_dir/restored/note with spaces.txt"
printf "Round trip passed: %s\n" "$lab_dir"
Attendez data.tar: OK, la présence du fichier dont le nom contient des espaces, puis Round trip passed. Le contrôle SHA-256 compare les octets de l’archive à la somme enregistrée ; cmp compare le fichier restauré à l’original du test. Une liste d’archive correcte ne suffit pas à démontrer cette restauration.
Ce test sur le même disque vérifie le contenu de ce petit exemple. Il n’établit ni l’indépendance du support, ni le déchiffrement, ni la restauration des droits Linux ou le redémarrage d’une application. Le guide Ubuntu des sauvegardes par script montre aussi l’intérêt d’une extraction de contrôle dans un autre répertoire.
Préparer un support indépendant et un ensemble réel
Le second exemple sauvegarde /etc/nginx du laboratoire Nginx et un dossier de documents ordinaires situé dans votre home. Arrêtez les modifications, synchronisations et écritures concernées pendant la copie. Les volumes Docker et bases actives exigent leurs propres procédures de cohérence.
Vérifiez le support de destination et son UUID en suivant le cours de montage persistant par fstab. Un UUID différent prouve une identité de système de fichiers différente, pas un disque physique indépendant : deux partitions ou deux disques virtuels sur le même stockage peuvent tomber ensemble. Examinez le disque sous-jacent et prévoyez aussi des copies hors de la machine ou hors ligne selon le besoin.
Enregistrez tout le script suivant dans ~/backup-course-data.sh. Il nécessite Bash, GNU tar, findmnt et les outils coreutils. Passez un dossier réel sous votre home, le point de montage exact du système de fichiers de sauvegarde et son UUID vérifié. Les noms de paramètres dans la ligne d’usage doivent être remplacés par ces valeurs :
set -eu
umask 077
if [ "$#" -ne 3 ]; then
printf 'Usage: bash backup-course-data.sh SOURCE_DIR BACKUP_MOUNT EXPECTED_UUID\n' >&2; exit 2
fi
source_dir=$(realpath -e -- "$1")
backup_mount=$(realpath -e -- "$2")
expected_uuid=$3
case "$source_dir" in
"$HOME"/*) ;;
*) printf 'Choose a specific ordinary-data folder inside your home.\n' >&2; exit 1 ;;
esac
test -d "$source_dir"
if [[ ! "$expected_uuid" =~ ^[A-Za-z0-9-]+$ ]] || [ "$expected_uuid" = REPLACE_WITH_VERIFIED_UUID ]; then
printf 'Record the actual backup filesystem UUID first.\n' >&2; exit 1
fi
if ! actual_uuid=$(findmnt -rn --mountpoint "$backup_mount" -o UUID); then
printf 'Cannot verify the backup mount; stop.\n' >&2; exit 1
fi
if [ "$actual_uuid" != "$expected_uuid" ]; then
printf 'Expected backup filesystem is not mounted; stop.\n' >&2; exit 1
fi
for original in "$source_dir" /etc/nginx; do
original_uuid=$(findmnt -rn --target "$original" -o UUID)
if [ -z "$original_uuid" ] || [ "$original_uuid" = "$actual_uuid" ]; then
printf 'Use a separate verified backup filesystem.\n' >&2; exit 1
fi
done
case "$backup_mount/" in
"$source_dir/"*) printf 'Backup must be outside the source tree.\n' >&2; exit 1 ;;
esac
sudo test -d /etc/nginx
df -h "$source_dir" "$backup_mount"
set_dir=$(sudo mktemp -d "$backup_mount/ubuntu-course-backup.XXXXXX")
sudo chmod 0700 "$set_dir"
sudo tar --acls --xattrs --numeric-owner -C / -cpf "$set_dir/nginx.tar" etc/nginx
sudo tar --acls --xattrs --numeric-owner -C "$source_dir" -cpf "$set_dir/user-data.tar" .
sudo sh -c 'cd "$1" && sha256sum nginx.tar user-data.tar > SHA256SUMS && sha256sum -c SHA256SUMS' sh "$set_dir"
printf 'Backup set: %s\n' "$set_dir"
Par exemple, après avoir créé et rempli votre vrai dossier ~/Documents/course-data, utilisez bash ~/backup-course-data.sh "$HOME/Documents/course-data" /srv/backup avec l’UUID réel comme troisième argument. Le contrôle findmnt --mountpoint exige ce point de montage précis ; --target, utilisé pour les sources, recherche leur système de fichiers contenant.
Le script s’arrête avant création de l’ensemble si le montage ne peut pas être vérifié ou si son UUID diffère. Une absence, une sortie vide ou plusieurs UUID ne correspondent pas à la valeur unique attendue. Il refuse aussi une destination située sous les données source. Maintenez le montage stable pendant toute l’opération : une vérification préalable ne rend pas impossible un démontage ultérieur par un autre administrateur.
En cas de réussite, notez le chemin du nouvel ensemble et les deux résultats OK. Toute erreur tar ou manque d’espace laisse un ensemble potentiellement incomplet : ne le classez pas comme réussi. Le mode 0700 limite l’accès par les autres utilisateurs, mais ne chiffre pas un disque perdu ou volé.
L’archive /etc/nginx contient ses liens symboliques, sans copier automatiquement leurs cibles extérieures. Par exemple, les certificats et clés sous /etc/letsencrypt nécessitent une sauvegarde protégée séparée. Identifiez les autres dépendances au lieu de supposer qu’un répertoire de configuration contient tout le service.
Restaurer les archives dans des répertoires vides
Utilisez uniquement l’ensemble de confiance que vous venez de créer. Enregistrez ce script dans ~/restore-course-data.sh et exécutez bash ~/restore-course-data.sh avec le chemin exact de l’ensemble. Assurez-vous de disposer d’assez d’espace dans /var/tmp ; le script ne restaure pas directement dans /etc/nginx ou le dossier source :
set -eu
if [ "$#" -ne 1 ]; then
printf 'Usage: bash restore-course-data.sh BACKUP_SET_DIRECTORY\n' >&2; exit 2
fi
set_dir=$(realpath -- "$1")
sudo test -f "$set_dir/SHA256SUMS"
sudo sh -c 'cd "$1" && sha256sum -c SHA256SUMS' sh "$set_dir"
restore_dir=$(sudo mktemp -d /var/tmp/ubuntu-course-restore.XXXXXX)
sudo chmod 0700 "$restore_dir"
sudo mkdir "$restore_dir/config" "$restore_dir/data"
sudo tar --acls --xattrs --same-owner -C "$restore_dir/config" -xpf "$set_dir/nginx.tar"
sudo tar --acls --xattrs --same-owner -C "$restore_dir/data" -xpf "$set_dir/user-data.tar"
sudo ls -ldn "$restore_dir/config/etc/nginx" "$restore_dir/data"
printf 'Isolated restore: %s\n' "$restore_dir"
La réussite des sommes est une condition préalable, puis chaque archive est extraite dans un emplacement neuf. Ne lancez pas ce script en root sur une archive inconnue. Une archive malveillante, ou des liens et types de fichiers inattendus, exige un traitement isolé adapté ; un simple nom de dossier de destination ne rend pas tout contenu inoffensif.
Les options --acls et --xattrs demandent la prise en charge de métadonnées par GNU tar. Le manuel tar d’Ubuntu décrit aussi les options de propriétaire et de permissions. La sélection des espaces d’attributs restaurés peut demander des options supplémentaires ; vérifiez notamment les exigences de sécurité de l’application au lieu de promettre que tous les attributs sont identiques.
Remplacez le chemin de restauration ci-dessous par celui affiché et le dossier source par celui réellement sauvegardé :
restore_dir=/var/tmp/REPLACE_WITH_PRINTED_RESTORE_DIRECTORY
source_dir="$HOME/Documents/course-data"
sudo diff --no-dereference -r /etc/nginx "$restore_dir/config/etc/nginx"
sudo diff --no-dereference -r "$source_dir" "$restore_dir/data"
Avec une source inchangée depuis la sauvegarde, diff sans différence renvoie 0 ; un état 1 signale des différences et un autre état une erreur à examiner. --no-dereference compare les liens comme liens : des liens absolus restaurés sous le répertoire de test pourraient sinon suivre des cibles du système actif.
Comparez les fichiers importants, les nombres de fichiers, les modes et propriétaires numériques avec ls -ln et, si nécessaire, les ACL et attributs avec getfacl et getfattr des paquets acl et attr. Un écart après une modification volontaire de l’original ne prouve pas une corruption de la sauvegarde. Testez les identités UID/GID sur le serveur de récupération avant de rendre les données accessibles.
Organiser les générations et les alertes à partir d’un test réussi
Automatisez avec une planification contrôlée après une restauration manuelle réussie. Consignez le dernier succès complet, le code de sortie, la place libre, les générations conservées et le destinataire des alertes. Déclenchez un échec de test sur une copie du laboratoire pour vérifier que l’alerte arrive réellement.
Choisissez une rétention qui permette de revenir avant une suppression ou une corruption découverte tardivement. Les ensembles nouveaux de ce cours évitent l’écrasement automatique d’une génération, mais consomment de l’espace : une politique de nettoyage doit identifier les ensembles réussis et les obligations de conservation avant de retirer une copie.
Une somme stockée à côté d’une archive modifiable ne protège pas contre un attaquant capable de remplacer les deux. Selon le risque, prévoyez des vérifications conservées ailleurs, des copies hors ligne ou un stockage dont les règles empêchent la modification des anciennes générations. Protégez les clés de déchiffrement tout en permettant leur récupération par la personne responsable.
Valider la reprise par les données et le service
Une extraction réussie est une étape de récupération. Sur une machine de reprise séparée, contrôlez les configurations, démarrez les services prévus et vérifiez les lectures, écritures et authentifications utiles. Selon le périmètre, vérifiez également DNS, certificats, partages et reprise de la sauvegarde elle-même.
Notez le temps nécessaire et les modifications absentes de la dernière copie utilisable. Si ces résultats dépassent la perte ou la durée acceptables, modifiez la fréquence ou la méthode avant de compter sur cette procédure. Préservez le support défaillant tant que les données et éléments nécessaires à l’analyse n’ont pas été récupérés.




