8.1 KiB
title, description
| title | description |
|---|---|
| Snapshots BTRFS | Formater la partition racine de Debian en BTRFS et utiliser les snapshots 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. |
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
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.
::note{to="/serveex/core/installation#partitionnement"}
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 :
::steps{level="3"}
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.
Prendre un snapshot
Un snapshot se crée avec une seule commande, et se termine instantanément quelle que soit la quantité de données sur le disque, puisque Btrfs ne commence à copier des blocs qu'au moment où quelque chose change réellement (copy-on-write) :
sudo mkdir -p /.snapshots
sudo btrfs subvolume snapshot -r / /.snapshots/$(date +%F_%H-%M-%S)
-rle rend en lecture seule, ce qui est ce qu'on veut pour un filet de sécurité : rien, pas même vous par erreur, ne peut modifier un snapshot après coup.- Stocker les snapshots sous
/.snapshotsles garde hors du chemin, et Btrfs est assez malin pour ne pas descendre dans un sous-volume la prochaine fois que vous snapshotez/lui-même, donc les snapshots ne finissent jamais par contenir d'anciens snapshots.
Prenez l'habitude de lancer ça avant tout ce qui pourrait mal tourner : un sudo apt full-upgrade, la modification d'une unité systemd, ou un changement Docker Compose qui touche à autre chose que /srv/docker.
::tip
✨ Donnez au snapshot un nom qui veut dire quelque chose plutôt qu'un simple horodatage, par exemple /.snapshots/avant-upgrade-2026-09-09, pour savoir pourquoi il est là quand vous le retrouverez trois semaines plus tard.
::
Restaurer des fichiers depuis un snapshot
Un snapshot n'est qu'un dossier : tout ce à quoi ressemblait le système de fichiers à cet instant, consultable comme n'importe quel autre répertoire.
ls /.snapshots/2026-09-09_18-30-00/etc/ssh/
Pour annuler une bêtise, recopiez le fichier (ou le dossier) depuis le snapshot par-dessus le fichier actuel :
sudo cp -a /.snapshots/2026-09-09_18-30-00/etc/ssh/sshd_config /etc/ssh/sshd_config
-a préserve les permissions et le propriétaire, ce qui compte pour tout ce qui se trouve sous /etc.
::note
Ç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. Revenir en arrière sur l'intégralité de la partition racine (pour un système qui ne démarre plus du tout) est aussi possible, en renommant des sous-volumes depuis une clé USB live, mais c'est une opération plus délicate et bien plus rare. La documentation Btrfs couvre ce cas si vous en avez un jour besoin, et honnêtement, si on en arrive là, c'est exactement le scénario pour lequel votre sauvegarde Backrest hors site existe. ::
Gérer les snapshots
sudo btrfs subvolume list /
Liste tous les sous-volumes du système de fichiers, snapshots compris, chacun avec son propre ID. Supprimez-en un dont vous n'avez plus besoin avec :
sudo btrfs subvolume delete /.snapshots/2026-09-09_18-30-00
::caution
Les snapshots sont bon marché, pas gratuits : dès que le système de fichiers actif diverge d'un snapshot, les anciens blocs restent occupés tant que le snapshot les référence. Un tas de vieux snapshots sur un serveur qui change beaucoup (images de conteneurs, logs) peut discrètement grignoter de l'espace disque réel. Vérifiez avec df -h / et supprimez ce dont vous n'avez plus besoin.
::
Automatiser les snapshots
Plutôt que de penser à lancer la commande à la main, un petit script associé à un timer systemd en prend un automatiquement et supprime les anciens :
sudo nano /usr/local/bin/btrfs-snapshot.sh
#!/bin/bash
set -e
mkdir -p /.snapshots
btrfs subvolume snapshot -r / "/.snapshots/$(date +%F_%H-%M-%S)"
# Ne garde que les 7 snapshots les plus récents
cd /.snapshots
ls -1 | sort | head -n -7 | while read -r old; do
btrfs subvolume delete "$old"
done
sudo chmod +x /usr/local/bin/btrfs-snapshot.sh
sudo nano /etc/systemd/system/btrfs-snapshot.service
[Unit]
Description=Take a Btrfs root snapshot
[Service]
Type=oneshot
ExecStart=/usr/local/bin/btrfs-snapshot.sh
sudo nano /etc/systemd/system/btrfs-snapshot.timer
[Unit]
Description=Daily Btrfs root snapshot
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now btrfs-snapshot.timer
Vérifiez qu'il est bien planifié avec systemctl list-timers, et déclenchez-en un tout de suite pour tester avec sudo systemctl start btrfs-snapshot.service.
Et voilà : un bouton annuler automatique et permanent pour votre serveur, qui tourne tranquillement à côté des vraies sauvegardes que Backrest prend déjà hors site.