Introduction
Btrfs (B-tree filesystem) :
- Copy-on-Write (CoW) comme ZFS
- Snapshots et sous-volumes legers
- Compression transparente (zstd, lzo, zlib)
- RAID 0/1/10 stable, RAID 5/6 partiel
- Checksum CRC32C sur data + metadata
- Online resize, defrag, balance, scrub
- Conversion from ext4 sur place
- Mainline Linux : licence GPL, dans le kernel
vs ZFS :
- Btrfs est mainline (pas besoin de DKMS)
- Btrfs gere mieux les disques mixed-size
- ZFS est plus mature en RAID-Z et perf
- ZFS a un ecosysteme de tooling plus riche
Prerequis
- VPS / serveur Linux Debian 12 / Ubuntu / openSUSE / Fedora
- Acces root
- Disques disponibles
Etape 1 : Installation des outils
Le module kernel est deja inclus. Pour les outils :
sudo apt update
sudo apt install -y btrfs-progs
btrfs --version
Etape 2 : Creer un filesystem simple
sudo mkfs.btrfs /dev/sdb
sudo mkdir /mnt/data
sudo mount /dev/sdb /mnt/data
Persister dans /etc/fstab :
UUID=xxx-yyy /mnt/data btrfs defaults,compress=zstd,space_cache=v2 0 0
sudo blkid /dev/sdb # pour l'UUID
Etape 3 : Multi-device (RAID Btrfs)
Avec 2 disques en RAID1 :
sudo mkfs.btrfs -m raid1 -d raid1 /dev/sdb /dev/sdc
sudo mount /dev/sdb /mnt/data
-m = metadata, -d = data. RAID1 = mirror.
Avec 4 disques en RAID10 :
sudo mkfs.btrfs -m raid10 -d raid10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
RAID5/6 est encore considere experimental pour les data. Evitez en prod.
Etape 4 : Sous-volumes (subvolumes)
Un sous-volume = un "sous-FS" leger dans le FS, qu'on peut snapshotter independamment :
cd /mnt/data
sudo btrfs subvolume create @home
sudo btrfs subvolume create @var
sudo btrfs subvolume create @backups
sudo btrfs subvolume list /mnt/data
Pour monter un sous-volume :
sudo mount -o subvol=@home /dev/sdb /home
Sur openSUSE et systemes basics : le rootfs est typiquement un sous-volume @, /home un sous-volume @home, etc.
Etape 5 : Snapshots
Les snapshots sont en realite des sous-volumes lies au sous-volume parent :
sudo btrfs subvolume snapshot /mnt/data/@home /mnt/data/@home-snap-2026-05-17
Snapshot read-only :
sudo btrfs subvolume snapshot -r /mnt/data/@home /mnt/data/@home-readonly
Lister :
sudo btrfs subvolume list /mnt/data
Supprimer un snapshot :
sudo btrfs subvolume delete /mnt/data/@home-snap-2026-05-17
Etape 6 : Compression
sudo mount -o remount,compress=zstd:3 /mnt/data
Ou dans fstab :
UUID=xxx /mnt/data btrfs defaults,compress=zstd:3 0 0
Niveaux zstd : 1 (rapide, peu compressif) a 15 (lent, tres compressif). 3 est le bon defaut.
Forcer la compression de fichiers existants :
sudo btrfs filesystem defragment -r -czstd /mnt/data
Voir le taux de compression :
sudo compsize /mnt/data
Installez compsize si manquant :
sudo apt install -y compsize
Etape 7 : Quotas
sudo btrfs quota enable /mnt/data
sudo btrfs qgroup show -reF /mnt/data
sudo btrfs qgroup limit 50G /mnt/data/@home
⚠️ Les quotas Btrfs ont un cout perf non-negligeable sur les gros FS. A activer avec parcimonie.
Etape 8 : Send / Receive (backup incremental)
Comme ZFS, Btrfs peut envoyer un snapshot vers un autre FS Btrfs.
Snapshot read-only obligatoire :
sudo btrfs subvolume snapshot -r /mnt/data/@home /mnt/data/@home-2026-05-17
Envoi :
sudo btrfs send /mnt/data/@home-2026-05-17 | ssh root@backup "btrfs receive /mnt/backup/"
Incremental :
sudo btrfs send -p /mnt/data/@home-2026-05-16 /mnt/data/@home-2026-05-17 | ssh root@backup "btrfs receive /mnt/backup/"
Etape 9 : Scrub et balance
Scrub : verifie l'integrite (checksums) :
sudo btrfs scrub start /mnt/data
sudo btrfs scrub status /mnt/data
Programmez mensuellement :
0 2 1 * * /usr/bin/btrfs scrub start -B /mnt/data
Balance : redistribue les block groups, utile apres ajout/retrait de disques :
sudo btrfs balance start -dconvert=raid1 /mnt/data
sudo btrfs balance status /mnt/data
Etape 10 : Ajouter / retirer un disque
Ajouter :
sudo btrfs device add /dev/sdd /mnt/data
sudo btrfs balance start /mnt/data
Retirer (le contenu est migrate ailleurs) :
sudo btrfs device remove /dev/sdb /mnt/data
Remplacer un disque mort :
sudo btrfs replace start /dev/sdb /dev/sde /mnt/data
sudo btrfs replace status /mnt/data
Etape 11 : Snapper (automatisation snapshots)
Snapper automatise les snapshots Btrfs avec timeline et rollback :
sudo apt install -y snapper
sudo snapper -c root create-config /
sudo snapper -c home create-config /home
Voir la config :
sudo snapper -c root list
sudo snapper -c root status 1..2 # diff entre snapshot 1 et 2
Rollback :
sudo snapper -c root rollback 5
Sur openSUSE, snapper s'integre avec GRUB pour booter sur n'importe quel snapshot.
Etape 12 : Conversion ext4 -> btrfs
Btrfs peut convertir un ext4 existant en place :
sudo umount /dev/sdb
sudo btrfs-convert /dev/sdb
sudo mount /dev/sdb /mnt/data
L'ancien ext4 reste accessible en sous-volume ext2_saved. Une fois sur que tout fonctionne :
sudo btrfs subvolume delete /mnt/data/ext2_saved
⚠️ Faites un backup avant. La conversion est risquee sur de gros FS.
Depannage
"no space left on device" mais df montre de la place
Btrfs gere data et metadata separement. Souvent metadata pleine :
sudo btrfs filesystem df /mnt/data
sudo btrfs balance start -dusage=50 /mnt/data
Performance dégradée (fragmentation)
Sur BD, VMs, fichiers a I/O intense, le CoW fragmente. Solutions :
sudo chattr +C /var/lib/mysql # disable CoW pour ce dir
sudo btrfs filesystem defragment -r /var/lib/mysql
Mount echoue apres crash
sudo btrfs check /dev/sdb
sudo btrfs rescue super-recover /dev/sdb
⚠️ N'utilisez pas btrfs check --repair sans backup, c'est risque.
Scrub trouve des erreurs
Btrfs auto-repare si RAID1+. Sinon il identifie les fichiers corrompus :
sudo btrfs scrub status -d /mnt/data
sudo dmesg | grep btrfs
Trop de snapshots = lenteur
Les snapshots Btrfs sont peu couteux, mais en avoir 10 000+ ralentit. Snapper et autres ont des politiques de retention :
sudo snapper -c root cleanup number
Commandes utiles
# FS
sudo mkfs.btrfs /dev/sdb
sudo btrfs filesystem show
sudo btrfs filesystem df /mnt/data
sudo btrfs filesystem usage /mnt/data
# Subvolumes
sudo btrfs subvolume list /mnt/data
sudo btrfs subvolume create / delete / snapshot
# Devices
sudo btrfs device add / remove / replace
sudo btrfs device stats /mnt/data
# Maintenance
sudo btrfs scrub start / status
sudo btrfs balance start / status
sudo btrfs filesystem defragment -r -czstd /mnt/data
# Send / receive
sudo btrfs send / receive
# Snapper
sudo snapper -c root list
sudo snapper -c root create --description "before update"
sudo snapper -c root rollback 5
# Diagnostic
sudo btrfs check /dev/sdb # offline, FS demonte
sudo dmesg | grep btrfs
Conclusion
Btrfs vous donne :
- Snapshots/CoW dans le kernel mainline (pas de DKMS)
- Compression et integrity natifs
- Online conversion, resize, defrag
- Integration snapper pour les rollbacks
Limites :
- RAID5/6 experimental (evitez pour data critiques)
- Quotas avec overhead
- Reputation mitigee historiquement (RAID5 issues), mais stable en config RAID1 / single / 10
Pour aller plus loin :
- Pour des serveurs avec rollback OS, regardez openSUSE Tumbleweed ou Garuda (btrfs + snapper integres)
- Combinez avec borg ou restic pour des backups offsite
- Pour les VMs, desactivez CoW sur les images (
chattr +C)
Ressources
- Documentation officielle : https://btrfs.readthedocs.io
- Wiki kernel : https://btrfs.wiki.kernel.org
- Snapper : https://snapper.io
- Btrfs Wiki Debian : https://wiki.debian.org/Btrfs


















