BTRFS sur Debian



Je ne me suis jamais trop attardé sur les systèmes de fichiers de mes machines. Fat32 puis NTFS pour les windows, ext3 puis ext4 pour les linux. Sans trop savoir les différences.

Ça fait longtemps que j'entends parler de ZFS et plus récemment de BTRFS. Le premier est plutôt adossé aux BSD et n'est pas inclus dans le noyau linux. Le deuxième est successeur d'ext4. Ces deux systèmes de fichiers sont dit modernes en ça qu'ils incluent des fonctionnalités avancées.

Ce qui m'attire particulière c'est la copy-on-write, la gestion des sous-volumes et des snapshots. Ces concepts sont très bien expliqués dans un article de sebsauvage.

Comme je dois installer une nouvelle machine, je vais en profiter pour passer sur BTRFS.

La documentation officielle et l'état de mise en place des fonctionnalité dans le Kernel.

But

  • avoir / et /home séparés mais qui pour autant partage l'espace disponible
  • gagner en performance sur l'utilisation de disques durs à plateaux
  • gagner dans la gestion quotidienne grâce au snapshot

Installation

L'installateur de Debian ne permet pas une mise en place facile de BTRFS. Ce n'est pour autant pas insurmontable. La vidéo qui m'a servi de base pour l'installation.

Sur le menu d'installation :

  • Advanced options...
  • Graphical expert install ou expert install
  • Faire l'installation classique jusqu'à arriver à : Partitionner les disques
  • Demander le partitionnement en manuel
    • Créer une partition de 300M en début, Partition système EFI
    • Créer une partition prenant le reste de l'espace disponible, BTRFS
    • Appliquer les changements et valider le fait de ne pas vouloir de partition d'échange
  • Ne pas continuer l'installation, passer sur une console en appuyant sur ctrl-alt-F2
  • df -h pour lister les partitions, puis appliquer les changements suivant en modifiant /dev/sda2 par la bonne partition :
	umount /target/boot/efi/
	umount /target
	mount /dev/sda2 /mnt
	cd /mnt && ls
	mv @rootfs @
	btrfs subvolume create @home
	mount -o rw,noatime,space_cache=v2,compress=zstd,subvol=@ /dev/sda2 /target
	mkdir -p /target/boot/efi
	mkdir -p /target/home
	mount -o rw,noatime,space_cache=v2,compress=zstd,subvol=@home /dev/sda2 /target/home
	mount /dev/sda1 /target/boot/efi

Dans les options, si c'est un disque SSD, ajouter : ssd,discard=async

  • Modifier le fichier /target/etc/fstab pour refléter les changements sur le @ et le @home
UUID=e3dc85e3-0d2b-40e3-803b-7c2cb0bf543a /               btrfs   rw,noatime,nodiratime,autodefrag,compress-force=zstd,subvol=@ 0       0
UUID=e3dc85e3-0d2b-40e3-803b-7c2cb0bf543a /home           btrfs   rw,noatime,nodiratime,autodefrag,compress-force=zstd,subvol=@home 0       0
  • Pour reprendre l'installation, repasser sur l'interface graphique ctrl-alt-F5
  • Pour le noyau, je ne sais pas pourquoi, choisir linux-image-amd64 (et pas celui avec une version)
  • Terminer l'installation de manière standard

Configuration

  • le Copy-on-write (CoW) génère de la fragmentation, dans l'idéal, monter le système de fichiers avec l'option autodefrag. Et désactiver CoW sur les gros fichiers type base de données, machine virtuelles, conteneurs docker : chattr +C
  • atime génère trop d'écriture pour rien, il vaut mieux monter le système de fichier avec l'option noatime et nodiratime. Attention, cela peut avoir des effets de bords sur certains services. Mais en général ça ne devrait pas poser de problème
  • Pour avoir la description de toutes les options de montage.

Utilisation

  • ajouter --reflink=auto à la commande cp. Plus d'explication ici
  • Timeshift permet une utilisation facilité des snapshots, via une interface graphique

Gestion des snapshots :

On crée un sous volume qui accueillera les instantanés :

mount /dev/sda2 /mnt
cd mnt
btrfs subvolume create @snapshots
umount /mnt
mkdir /snapshots

On ajoute la ligne dans le fstab :

UUID=e3dc85e3-0d2b-40e3-803b-7c2cb0bf543a /snapshots           btrfs   rw,noatime,nodiratime,autodefrag,compress-force=zstd,subvol=@snapshots 0       0

Pour faire un snapshot, on monte d'abord le disque :

mount /dev/sda2 /mnt
cd mnt
btrfs subvolume snapshot -r @home @snapshots/home-2024-01-12
btrfs subvolume show /snapshots/home-2024-01-11
btrfs subvolume list -p /
btrfs subvolume delete /snapshots/home-2024-01-11

Pour revenir sur un ancien snapshot

mount /dev/sda2 /mnt
cd mnt
mv @home @home.bak
btrfs subvolume snapshot @snapshots/home-2024-01-12 @home
reboot

Commandes utiles

  • btrfs filesystem usage / : plus précis que df mais tout de même approximatif pour avoir un détail sur l'utilisation de l'espace
  • btrfs filesystem defragment -r / : défragmentation manuelle, utile malgré l'option autodefrag.