Btrfs (B-Tree File System, prononcé « Butter FS » ou « Better FS ») est un système de fichiers avancé intégré au noyau Linux depuis la version 2.6.29. Il répond à des besoins que les systèmes de fichiers classiques comme ext4 ou xfs ne couvrent pas nativement : snapshots instantanés, sous-volumes indépendants, compression transparente et vérification continue de l’intégrité des données. Sur Debian et Ubuntu, Btrfs est pleinement supporté depuis plusieurs années et disponible sans configuration particulière du noyau.
Là où ZFS impose un modèle de licences incompatible avec le noyau Linux et nécessite l’installation de modules externes, Btrfs est entièrement intégré dans l’arbre officiel du noyau. Il s’impose progressivement comme un choix solide pour les infrastructures qui cherchent à offrir des fonctionnalités de stockage avancées sans dépendances supplémentaires.
Cet article couvre les fonctionnalités essentielles de Btrfs : création d’un système de fichiers, gestion des sous-volumes, prise de snapshots, compression transparente avec zstd, sauvegarde incrémentale via btrfs send/receive, et maintenance courante. La version de référence est btrfs-progs 7.0 (mai 2026), disponible dans les dépôts Debian et Ubuntu récents.
Installation de btrfs-progs
Les outils en espace utilisateur (btrfs-progs) sont nécessaires pour créer et gérer un système de fichiers Btrfs. Sur Debian et Ubuntu, l’installation est directe :
# Installation des outils Btrfs
apt install btrfs-progs
# Vérifier la version installée
btrfs version
# Btrfs v7.0
Le module noyau btrfs est inclus dans le noyau générique Debian/Ubuntu et se charge automatiquement à la première utilisation :
# Vérifier que le module est disponible et sa version
modinfo btrfs | grep -E "^(version|filename)"
Créer et monter un système de fichiers Btrfs
Formatage
La commande mkfs.btrfs formate une partition ou un ensemble de disques. L’option -L permet d’affecter un label, utile pour identifier le volume dans /etc/fstab :
# Formater une seule partition avec un label
mkfs.btrfs -L donnees /dev/sdb
# Créer un volume Btrfs sur deux disques en RAID 1 (données et métadonnées)
mkfs.btrfs -d raid1 -m raid1 -L stockage /dev/sdb /dev/sdc
Options de montage recommandées
Btrfs dispose d’options de montage qui influencent significativement les performances et le comportement. Les options suivantes constituent une base solide pour la production :
# Montage manuel avec les options recommandées
mount -o noatime,compress=zstd:3,space_cache=v2 /dev/sdb /mnt/donnees
Dans /etc/fstab, privilégiez l’UUID pour l’identification du disque :
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /mnt/donnees btrfs noatime,compress=zstd:3,space_cache=v2 0 0
- noatime : supprime la mise à jour de l’horodatage d’accès à chaque lecture — gain de performances notable sur les volumes très sollicités
- compress=zstd:3 : compression transparente avec zstd au niveau 3 (bon compromis entre vitesse et ratio)
- space_cache=v2 : cache d’espace disque de deuxième génération, plus fiable et performant que la v1
Gestion des sous-volumes
Un sous-volume Btrfs est une hiérarchie de fichiers indépendante qui partage le même pool de stockage. Contrairement à une partition classique, les sous-volumes n’ont pas de taille fixe : ils consomment l’espace disponible selon les besoins et peuvent être snapshotés indépendamment. C’est la brique fondamentale qui rend Btrfs si flexible.
Créer et lister des sous-volumes
La convention largement adoptée préfixe les sous-volumes avec @ :
# Créer les sous-volumes principaux dans un Btrfs monté
btrfs subvolume create /mnt/donnees/@
btrfs subvolume create /mnt/donnees/@home
btrfs subvolume create /mnt/donnees/@snapshots
# Lister tous les sous-volumes avec leur ID
btrfs subvolume list /mnt/donnees
# ID 256 gen 7 top level 5 path @
# ID 257 gen 7 top level 5 path @home
# ID 258 gen 7 top level 5 path @snapshots
Monter des sous-volumes spécifiques
Chaque sous-volume peut être monté indépendamment via l’option subvol= ou subvolid= :
# Monter le sous-volume @ comme racine système
mount -o noatime,compress=zstd:3,subvol=@ /dev/sdb /
# Monter @home sur /home
mount -o noatime,compress=zstd:3,subvol=@home /dev/sdb /home
# Monter @snapshots (lecture seule recommandée pour les snapshots)
mount -o noatime,ro,subvol=@snapshots /dev/sdb /.snapshots
Supprimer un sous-volume
# Suppression propre (libère l'espace de manière asynchrone en arrière-plan)
btrfs subvolume delete /mnt/donnees/@ancienne-config
# Afficher les infos d'un sous-volume
btrfs subvolume show /mnt/donnees/@home
Snapshots : sauvegarde instantanée et rollback
Les snapshots Btrfs sont créés instantanément grâce au Copy-On-Write (COW) : aucune donnée n’est copiée au moment de la création. L’espace supplémentaire n’est consommé que lorsque les données originales sont effectivement modifiées.
Attention : un snapshot n’est pas une sauvegarde. Il réside sur le même volume physique que les données d’origine. En cas de défaillance matérielle ou de corruption du système de fichiers, snapshot et données originales sont impactés simultanément. Pour des sauvegardes réelles, utilisez
btrfs send/receivevers un support externe.
Créer un snapshot
# Snapshot en lecture seule (recommandé — protège le point de restauration)
btrfs subvolume snapshot -r /mnt/donnees/@
/mnt/donnees/@snapshots/@-$(date +%Y%m%d-%H%M%S)
# Snapshot en lecture-écriture (utile pour tester une migration)
btrfs subvolume snapshot /mnt/donnees/@ /mnt/donnees/@-test
Restaurer depuis un snapshot
# Récupérer des fichiers spécifiques depuis un snapshot
mount -o subvol=@snapshots/@-20260523-120000 /dev/sdb /mnt/restauration
cp /mnt/restauration/etc/nginx/nginx.conf /etc/nginx/nginx.conf
umount /mnt/restauration
# Rollback complet : remplacer @ par un snapshot
mv /mnt/donnees/@ /mnt/donnees/@-broken
btrfs subvolume snapshot /mnt/donnees/@snapshots/@-20260523-120000 /mnt/donnees/@
Compression transparente
Btrfs supporte trois algorithmes de compression transparente. Les données sont compressées à l’écriture et décompressées à la lecture sans aucune modification des applications.
- zstd : recommandé — meilleur compromis vitesse/compression, niveaux 1 à 15
- lzo : très rapide, faible ratio — adapté aux systèmes très I/O-bound
- zlib : ratio élevé, plus lent — pour l’archivage à faible accès
Activer et mesurer la compression
# Activer la compression à chaud (affecte les nouvelles écritures)
mount -o remount,compress=zstd:3 /mnt/donnees
# Compresser les fichiers déjà existants via un defrag
btrfs filesystem defragment -r -czstd /mnt/donnees
# Installer l'outil de mesure du ratio de compression
apt install btrfs-compsize
# Afficher le ratio de compression effectif
compsize /mnt/donnees
# Type Perc Disk Usage Uncompressed Referenced
# TOTAL 42% 8.3G 19G 22G
# zstd 42% 8.3G 19G 22G
Compression par sous-volume ou répertoire
# Forcer la compression zstd sur un sous-volume entier
btrfs property set /mnt/donnees/@home compression zstd
# Désactiver pour un répertoire (ex: médias déjà compressés)
btrfs property set /mnt/donnees/@home/videos compression none
Sauvegarde incrémentale avec btrfs send/receive
La commande btrfs send exporte un snapshot sous forme de flux binaire que btrfs receive peut importer sur un autre volume ou serveur distant. C’est la méthode de référence pour les sauvegardes hors ligne. Pour de la réplication synchrone au niveau bloc, consultez l’article sur DRBD, qui propose une approche complémentaire.
# Snapshot initial en lecture seule
btrfs subvolume snapshot -r /mnt/donnees/@
/mnt/donnees/@snapshots/@-init
# Envoi initial vers un volume de sauvegarde local
btrfs send /mnt/donnees/@snapshots/@-init | btrfs receive /mnt/backup/
# Snapshot du lendemain
btrfs subvolume snapshot -r /mnt/donnees/@
/mnt/donnees/@snapshots/@-j1
# Envoi incrémental (-p : parent de référence — seules les différences sont transmises)
btrfs send -p /mnt/donnees/@snapshots/@-init
/mnt/donnees/@snapshots/@-j1
| btrfs receive /mnt/backup/
Vers un serveur distant via SSH :
# Envoi incrémental vers un serveur de sauvegarde distant
btrfs send -p /mnt/donnees/@snapshots/@-init
/mnt/donnees/@snapshots/@-j1
| ssh backup-server "btrfs receive /mnt/backup/"
Maintenance : scrub et balance
Scrub : vérification de l’intégrité
Le scrub lit l’intégralité du système de fichiers et vérifie le checksum de chaque bloc de données et métadonnées. C’est l’opération de maintenance la plus importante sur Btrfs — elle permet de détecter les corruptions silencieuses (bit rot) avant qu’elles ne deviennent critiques.
# Lancer un scrub en arrière-plan
btrfs scrub start /mnt/donnees
# Suivre la progression
btrfs scrub status /mnt/donnees
# scrub status for /mnt/donnees
# scrub started at 2026-05-23 14:00:00, running for 00:02:14
# total bytes scrubbed: 18.31GiB with 0 errors
# Scrub bloquant avec rapport complet en fin d'exécution
btrfs scrub start -B /mnt/donnees
Debian et Ubuntu livrent des unités systemd prêtes à l’emploi avec le paquet btrfs-progs. Activez le scrub mensuel automatique :
# Activer le scrub mensuel via systemd-timer
systemctl enable --now btrfs-scrub@$(systemd-escape -p /mnt/donnees).timer
# Vérifier que le timer est actif
systemctl list-timers | grep btrfs
Balance : rééquilibrage des chunks
La balance redistribue les données entre les devices et nettoie les chunks partiellement utilisés. Elle est particulièrement utile après des suppressions massives ou l’ajout d’un disque :
# Rééquilibrer uniquement les chunks de données utilisés à moins de 10%
btrfs balance start -dusage=10 /mnt/donnees
# Suivre la progression
btrfs balance status /mnt/donnees
# Afficher l'utilisation du système de fichiers
btrfs filesystem usage /mnt/donnees
À lire également
- ZFS sur Linux : snapshots, clones et RAID-Z en pratique — L’alternative mature à Btrfs, avec un modèle RAID différent et des fonctionnalités complémentaires pour le stockage critique.
- ZFS sur Linux — Installation et gestion avancée — Pour comparer les deux systèmes de fichiers avancés et choisir selon votre infrastructure.
- DRBD : réplication de blocs entre deux serveurs en temps réel — Réplication synchrone au niveau bloc, complémentaire aux snapshots Btrfs pour la haute disponibilité.
- Tuning kernel Linux — paramètres sysctl essentiels pour la production — Optimiser les paramètres noyau pour les environnements de stockage intensif.