Btrfs : le filesystem CoW pour Linux moderne

Btrfs : le filesystem CoW pour Linux moderne

Btrfs offre snapshots, sous-volumes, compression, RAID, et integrity checking, en restant 100% dans le kernel mainline Linux (pas comme ZFS). Le filesystem par defaut de SUSE, Synology, et Facebook (Meta).

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

Rejoignez notre serveur communautaire Discord

Pour toute question, suggestion ou simplement pour discuter avec la communauté, rejoignez-nous sur Discord !

900+Membres