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