Avancé

Snapshots BTRFS

Formater la partition racine de Debian en BTRFS et utiliser Snapper pour annuler instantanément une mise à jour ratée ou un mauvais changement de config, en complément local des sauvegardes 3-2-1 hors site de Backrest.

BTRFS est un système de fichiers Linux avec une fonctionnalité redoutable pour un homelab : les snapshots. Un snapshot fige l'état exact d'un système de fichiers en un instant, à coût quasi nul, sans copier le moindre octet de données au départ. Cassez quelque chose dix minutes après un apt full-upgrade, ou écrasez le mauvais fichier .env, et vous pouvez revenir exactement à l'état d'avant, sans toucher à une sauvegarde.

Ce n'est pas le rôle de Backrest et de la règle 3-2-1, donc autant être précis sur la différence avant de mettre quoi que ce soit en place.

Un snapshot n'est pas une sauvegarde

Un snapshot vit sur le même disque que les données qu'il protège. Il est instantané, ne demande aucun réseau, et il est parfait pour annuler une bêtise que vous venez de faire, mais il ne sert strictement à rien le jour où ce disque lâche, se fait voler, ou où votre serveur part en fumée. C'est le rôle d'une vraie sauvegarde 3-2-1 : une copie sur un support différent, idéalement hors site.

Voyez ça comme ça :

  • Snapshot = un bouton annuler. Instantané, local, gratuit, utile seulement tant que le disque est vivant.
  • Sauvegarde = une assurance. Plus lente, hors site, la seule chose qui survit à la mort du disque lui-même.

Gardez les deux. Les snapshots vous rendent serein face aux mises à jour et aux expérimentations, les sauvegardes garantissent qu'un disque mort reste un désagrément plutôt qu'une catastrophe.

Ce guide suppose que la partition racine a été formatée en Btrfs pendant l'installation de Debian. Btrfs ne peut pas être ajouté proprement à un / déjà en ext4 après coup, c'est donc un choix à faire une seule fois, à l'installation.

Formater la partition racine en BTRFS

Le partitionnement Assisté de Debian ne propose que de l'ext4. Pour obtenir du Btrfs, choisissez plutôt le partitionnement Manuel, à la même étape que décrit le guide d'installation principal :

Sélectionner le partitionnement manuel

Sur l'écran de méthode de partitionnement, choisissez Manuel plutôt que Assisté, utiliser un disque entier.

Créer une table de partitions

Sélectionnez le disque, confirmez la création d'une nouvelle table de partitions vide, puis sélectionnez l'ESPACE LIBRE obtenu et choisissez Créer une nouvelle partition.

Définir la taille et le type de la partition

Donnez à la partition le reste du disque (moins une petite partition EFI si vous êtes en UEFI, gérée comme dans une installation Assistée), et réglez Utiliser comme sur Système de fichiers journalisé Btrfs, avec comme point de montage /.

Terminer le partitionnement

Terminer le partitionnement et appliquer les changements, puis confirmez avec Oui.

Terminé !

Tout le reste de l'installeur reste identique.

Installer Snapper

Plutôt que de jongler à la main avec des commandes btrfs subvolume brutes, Snapper est un petit outil qui gère tout le cycle de vie des snapshots : les créer, les ranger proprement, supprimer les anciens, et encadrer automatiquement chaque opération apt d'une paire de snapshots.

Terminal
sudo apt install snapper
sudo snapper -c root create-config /

create-config enregistre une configuration nommée root pour le système de fichiers /, et crée un sous-volume .snapshots dédié en dessous pour y stocker chaque snapshot, verrouillé pour root uniquement. Pas besoin de découpage @/@home, ça fonctionne très bien sur le layout à sous-volume unique que le partitionnement manuel vient de créer.

Activez la configuration en éditant /etc/default/snapper :

/etc/default/snapper
SNAPPER_CONFIGS="root"

Puis activez les timers qui exécutent les snapshots périodiques et le nettoyage de Snapper :

Terminal
sudo systemctl enable --now snapper-timeline.timer snapper-cleanup.timer

snapper-timeline.timer se déclenche toutes les heures par défaut, c'est fixé par l'unité elle-même, pas par une option de configuration. Chaque exécution prend un snapshot et le range dans la bonne catégorie (horaire, quotidien, mensuel, annuel) ; les réglages TIMELINE_LIMIT_* vus plus bas ne contrôlent que combien de snapshots de chaque catégorie survivent, pas la fréquence à laquelle ils sont pris. snapper-cleanup.timer tourne une fois par jour (plus une fois 10 minutes après le démarrage) pour appliquer ces limites.

✨ Pour prendre des snapshots de chronologie à une fréquence différente, par exemple toutes les 6 heures plutôt que toutes les heures, surchargez le timer plutôt que de modifier directement le fichier d'unité du paquet :
Terminal
sudo systemctl edit snapper-timeline.timer
override.conf
[Timer]
OnCalendar=
OnCalendar=*-*-* 0/6:00:00
La ligne OnCalendar= vide efface d'abord la valeur hourly du paquet, puisque systemd ajoute sinon les nouvelles lignes OnCalendar à celles déjà présentes au lieu de les remplacer. Appliquez avec sudo systemctl daemon-reload && sudo systemctl restart snapper-timeline.timer.
Le paquet Debian embarque aussi un hook APT (/etc/apt/apt.conf.d/80snapper) qui s'active dès qu'une configuration figure dans SNAPPER_CONFIGS : à partir de maintenant, chaque apt install, apt upgrade ou apt full-upgrade obtient automatiquement un snapshot juste avant et juste après son exécution, sans aucun effort de votre part.

Prendre un snapshot

Pour tout ce qui sort du cadre d'apt, comme modifier une unité systemd ou un fichier Docker Compose, prenez-en un vous-même avec une description qui voudra vraiment dire quelque chose plus tard :

Terminal
sudo snapper create --description "avant changement compose sur swag"

Listez-les tous avec :

Terminal
sudo snapper list
Output
 # | Type   | Pre # | Date                     | Description
---+--------+-------+--------------------------+---------------------------------
0  | single |       |                          | current
1  | single |       | Tue 09 Sep 2026 18:30:00 | avant changement compose sur swag
2  | pre    |       | Tue 09 Sep 2026 19:00:01 | apt install unattended-upgrades
3  | post   | 2     | Tue 09 Sep 2026 19:00:14 | apt install unattended-upgrades

Restaurer des fichiers depuis un snapshot

Snapper conserve l'état complet du système de fichiers au moment du snapshot sous /.snapshots/<numéro>/snapshot, consultable comme n'importe quel autre dossier :

Terminal
ls /.snapshots/1/snapshot/etc/ssh/

Pour voir exactement ce qui a changé entre un snapshot et le système actuel (0 désigne toujours "l'état actuel") avant de toucher à quoi que ce soit :

Terminal
sudo snapper status 1..0

Ça affiche chaque fichier créé, modifié ou supprimé depuis. Pour annuler ces changements automatiquement :

Terminal
sudo snapper undochange 1..0

Ou restaurez un seul fichier à la main, souvent le choix le plus sûr et le plus chirurgical :

Terminal
sudo cp -a /.snapshots/1/snapshot/etc/ssh/sshd_config /etc/ssh/sshd_config
Ça couvre l'immense majorité des vrais accidents de homelab : une mauvaise config, un fichier supprimé, une mise à jour de paquet qui a cassé un truc. Snapper peut aussi faire un rollback de toute la partition racine vers un snapshot antérieur (il crée un nouveau sous-volume par défaut et démarre dessus au prochain redémarrage), pour un système dans un état vraiment cassé plutôt qu'un simple fichier manquant. C'est une opération plus délicate et bien plus rare, à tester une fois sur une machine où redémarrer ne vous dérange pas, avant d'en avoir vraiment besoin. Et si le disque lui-même est le problème, c'est exactement le scénario pour lequel votre sauvegarde Backrest hors site existe.

Gérer et nettoyer les snapshots

Les snapshots sont bon marché, pas gratuits : dès que le système de fichiers actif diverge d'un snapshot, les anciens blocs qu'il référence toujours restent occupés. Sans surveillance, des mois de snapshots sur un serveur qui change beaucoup (images de conteneurs, logs) peuvent discrètement grignoter de l'espace disque réel.

Le snapper-cleanup.timer activé plus haut nettoie déjà automatiquement, selon la configuration de /etc/snapper/configs/root :

RéglageDéfautCe que ça fait
TIMELINE_LIMIT_HOURLY / _DAILY / _MONTHLY / _YEARLY10Combien de snapshots de chronologie garder pour chaque granularité
TIMELINE_LIMIT_WEEKLY0Désactivé par défaut
NUMBER_LIMIT50Combien de snapshots manuels (single) garder

Ajustez ça à votre goût, puis supprimez-en un immédiatement à la main si vous avez besoin de la place tout de suite :

Terminal
sudo snapper delete 1

Vérifiez l'usage disque réel avec df -h / : les chiffres ci-dessus ne plafonnent que le nombre de snapshots, pas l'espace qu'un serveur très actif peut encore consommer entre deux nettoyages.

Et voilà : un bouton annuler automatique et permanent pour votre serveur, qui encadre discrètement chaque mise à jour et se nettoie tout seul, en tournant à côté des vraies sauvegardes que Backrest prend déjà hors site.

Copyright © 2026