Présentation
Btrfs (souvent appelé “Better FS” pour “meilleur système de fichier”) est un système de fichier sous licence Libre (GNU GPL) censé être le successeur des systèmes de fichiers ext (ext2, ext3 et ext4). Il permet de créer des instantanés du système de fichier à la volé (appelés “snapshots”), la compression, le Copy-On-Write et un système de somme de contrôle des données.
Problèmes
No space left on device
Il peut arriver que le système pense ne plus avoir de place sur le système de fichier alors que vraisemblablement la commande df -h donne relativement de bons chiffres :
Sys. de fichiers Type Taille Utilisé Dispo Uti% Monté sur
/dev/nvme0n1p4 btrfs 300G 198G 101G 67% /home
L’exemple ci-dessus montre que j’ai 101G disponible. Donc a priori de la place.
Cependant on regarde du côté de btrfs avec les outils en ligne de commande :
sudo btrfs filesystem usage /home
Overall:
Device size: 300.00GiB
Device allocated: 244.00GiB
Device unallocated: 56.00GiB
Device missing: 0.00B
Device slack: 0.00B
Used: 196.96GiB
Free (estimated): 100.20GiB (min: 72.20GiB)
Free (statfs, df): 100.19GiB
Data ratio: 1.00
Metadata ratio: 2.00
Global reserve: 55.20MiB (used: 0.00B)
Multiple profiles: no
Data,single: Size:240.94GiB, Used:196.74GiB (81.66%)
/dev/nvme0n1p4 240.94GiB
Metadata,DUP: Size:1.50GiB, Used:110.14MiB (7.17%)
/dev/nvme0n1p4 3.00GiB
System,DUP: Size:32.00MiB, Used:48.00KiB (0.15%)
/dev/nvme0n1p4 64.00MiB
Unallocated:
/dev/nvme0n1p4 56.00GiB
Les lignes à comparer ici sont :
Device allocated: 244.00GiB
Used: 196.96GiB
J’ai utilisé 196G environ, mais l’utilisation du périphérique (disque dur) est de 244G. La différence est énorme : plus de 40G « perdu ».
Cette différence nous met sur la piste d’un usage non optimal des plages d’espaces (appelés chunks) du système de fichiers btrfs.
Si on prend l’exemple de chunk (plage d’espace disque) d’une taille de 1Go ; si je remplis le chunk 1 avec 500Mo et le chunk 2 avec 450Mo, on aura perdu de la place : 500Mo environ sur le chunk 1 et 550Mo sur le chunk 2. Au fur et à mesure du temps et surtout de l’utilisation du système, ces espaces non utilisés se multiplient. C’est ce qui fait que notre système nous dit “plus d’espace disponible sur le disque”.
Pour obliger Btrfs à revoir ces emplacements, on utilise la commande btrfs balance. Si je lui demandais, dans notre exemple, de revoir les espaces étant alloués à moins de 70% de leur capacité, il prendrait le chunk 1 et 2, déplacerait les données dans le chunk 1 et libérerait le chunk 2. Ce qui nous ferait un gain de place de 1Go.
Dans ma situation, j’ai lancé la commande suivante pour revoir les espaces utilisés à moins de 70% :
sudo btrfs balance start -dusage=70 /home
Ce qui donne :
Done, had to relocate 37 out of 246 chunks
Quand je vérifie à nouveau avec sudo btrfs filesystem usage /home :
sudo btrfs fi us /home
Overall:
Device size: 300.00GiB
Device allocated: 210.04GiB
Device unallocated: 89.96GiB
Device missing: 0.00B
Device slack: 0.00B
Used: 196.97GiB
Free (estimated): 100.18GiB (min: 55.20GiB)
Free (statfs, df): 100.18GiB
Data ratio: 1.00
Metadata ratio: 2.00
Global reserve: 54.42MiB (used: 0.00B)
Multiple profiles: no
Data,single: Size:206.98GiB, Used:196.76GiB (95.06%)
/dev/nvme0n1p4 206.98GiB
Metadata,DUP: Size:1.50GiB, Used:108.39MiB (7.06%)
/dev/nvme0n1p4 3.00GiB
System,DUP: Size:32.00MiB, Used:48.00KiB (0.15%)
/dev/nvme0n1p4 64.00MiB
Unallocated:
/dev/nvme0n1p4 89.96GiB
La ligne Device allocated est désormais à 210.04GiB. On peut donc considérer que l’action a fait gagner 34GiB.
Liens utiles
- Documentation officielle de Btrf
- Copy-On-Write : Présentation du Copy-On-Write par Wikipedia