Btrfs sur Linux — snapshots, sous-volumes et compression en pratique

27 mai 2026 — par admin_libra

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/receive vers 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

Références

Index complet

Tous les articles (35)

Date Article Tags
27/05/2026 LXD 6.x : orchestration de conteneurs Linux avec profils et clustering administration clustering conteneurs 27/05/2026 Keepalived — VIP flottante et load balancing sans matériel dédié debian failover haute-disponibilité 27/05/2026 Btrfs sur Linux — snapshots, sous-volumes et compression en pratique administration btrfs compression 21/05/2026 CVE-2026-42945 (NGINX Rift) : analyse et remédiation sur Debian/Ubuntu cve debian heap-overflow 21/05/2026 Tuning kernel Linux — paramètres sysctl essentiels pour la production debian kernel mémoire 21/05/2026 DRBD : réplication de blocs entre deux serveurs en temps réel cluster debian drbd 15/05/2026 CVE-2026-23918 — vulnérabilité Apache 2.4.66 : analyse et correctifs sur Debian/Ubuntu (hors Debian 11) apache cve debian 15/05/2026 CVE-2026-31431 (Copy Fail) — Analyse et remédiation sur Debian/Ubuntu algif_aead copy-fail cve 12/05/2026 Pacemaker et Corosync — cluster haute disponibilité Linux cluster corosync debian 12/05/2026 WireGuard : monter un VPN mesh entre plusieurs serveurs Linux chiffrement linux mesh 12/05/2026 Netdata — monitoring temps réel sans configuration complexe alertes dashboard linux 12/05/2026 nftables en pratique — remplacer iptables sur Debian/Ubuntu debian firewall iptables 12/05/2026 Podman : alternative rootless à Docker — installation et migration conteneurs docker kubernetes 02/05/2026 Prometheus et Grafana sur Debian — installation, configuration et dashboards pratiques alertmanager dashboard debian 02/05/2026 Ansible : automatiser la gestion de serveurs Linux avec des playbooks administration ansible automation 28/04/2026 ZFS sur Linux : snapshots, clones et RAID-Z en pratique administration compression filesystem 28/04/2026 eBPF sur Linux : observabilité et traçage kernel avec bpftrace et BCC bcc bpftrace diagnostic 23/04/2026 Analyse de la mémoire sur Linux — vmstat, free, smem diagnostic mémoire monitoring 23/04/2026 Sécurité Linux — Firewall iptables et nftables firewall iptables nftables 23/04/2026 ZFS sur Linux — Installation et gestion avancée administration filesystem stockage 23/04/2026 Gestion des services avec systemd sur Debian et Ubuntu administration debian services 23/04/2026 Gestion des ressources cgroups v1/v2 avec LXC cgroups conteneurs lxc 23/04/2026 Centralisation logs avec ELK Stack — Elasticsearch, Kibana, Filebeat elasticsearch elk filebeat 23/04/2026 Supervision avec Zabbix 7.0 LTS sur Debian/Ubuntu debian monitoring supervision 23/04/2026 Plusieurs versions PHP-FPM sur Apache Debian/Ubuntu apache debian php-fpm 23/04/2026 Sécurisation avancée PHP-FPM — Multi-VirtualHosts Apache/Nginx apache nginx php-fpm 23/04/2026 Optimisation PHP-FPM — Guide de tuning d'un pool optimisation performance php-fpm 29/07/2025 Docker sur Debian/Ubuntu : Installation, Configuration et Utilisation conteneurs debian docker 03/07/2025 Serveur VPN WireGuard sous linux réseau sécurité vpn 03/07/2025 Authentification par clé publique sur un serveur SSH authentification cryptographie sécurité 27/06/2025 Surveillance et diagnostic d’un serveur Linux avec vmstat, iotop et htop diagnostic htop monitoring 27/06/2025 Mémoire : Utilisation des Huge Pages et implémentation hugepages mémoire noyau 27/06/2025 Mémoire Swap et paramétrage swappiness mémoire noyau performance 18/06/2025 Installation et Configuration des Conteneurs LXC sur Linux administration conteneurs lxc 18/06/2025 Gestion des journaux avec syslog et journalctl administration journalctl logs