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
- Créer une partition de
- 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 commandecp
. 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 quedf
mais tout de même approximatif pour avoir un détail sur l'utilisation de l'espacebtrfs filesystem defragment -r /
: défragmentation manuelle, utile malgré l'option autodefrag.