web-dev-qa-db-fra.com

Ubuntu pense que le disque Btrfs est plein mais ce n'est pas

$ cat /etc/fstab
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
UUID=a168d1ac-4e13-4643-976d-6e47ea1732b1 /boot        ext2  defaults                                                                   0 1
/dev/mapper/sda4_crypt                    /            btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@          0 2
/dev/mapper/sda4_crypt                    /tmp         btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@tmp       0 2
/dev/mapper/sda4_crypt                    /run         btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@run       0 2
/dev/mapper/sda4_crypt                    /var/crash   btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@var-crash 0 2
/dev/mapper/sda4_crypt                    /var/tmp     btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@var-tmp   0 2
/dev/mapper/sda4_crypt                    /var/log     btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@var-log   0 2
/dev/mapper/sda4_crypt                    /var/spool   btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@var-spool 0 2
/dev/mapper/sda5_crypt                    /home        btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@home      0 3
/dev/mapper/750er                         /media/750er ext4  defaults                                                                   0 4
/dev/mapper/cswap                         none         swap  defaults                                                                   0 5
➜  ~  df -h         
Filesystem              Size  Used Avail Use% Mounted on
/dev/mapper/sda4_crypt   38G   12G   13M 100% /
none                    4,0K     0  4,0K   0% /sys/fs/cgroup
udev                    2,0G  4,0K  2,0G   1% /dev
tmpfs                   396M  1,3M  394M   1% /run
none                    5,0M     0  5,0M   0% /run/lock
none                    2,0G  208K  2,0G   1% /run/shm
none                    100M   36K  100M   1% /run/user
/dev/mapper/sda4_crypt   38G   12G   13M 100% /tmp
/dev/sda2               231M   44M  175M  21% /boot
/dev/mapper/sda4_crypt   38G   12G   13M 100% /var/crash
/dev/mapper/sda4_crypt   38G   12G   13M 100% /var/tmp
/dev/mapper/sda4_crypt   38G   12G   13M 100% /var/log
/dev/mapper/sda4_crypt   38G   12G   13M 100% /var/spool
/dev/mapper/sda5_crypt  3,7T  2,4T  1,2T  67% /home
/dev/mapper/750er       688G  276G  377G  43% /media/750er
/dev/mapper/2tb         1,8T  1,7T  141G  93% /media/2tb
➜  ~  Sudo btrfs fi df /
Data, single: total=9.47GiB, used=9.46GiB
System, DUP: total=8.00MiB, used=16.00KiB
System, single: total=4.00MiB, used=0.00
Metadata, DUP: total=13.88GiB, used=1.13GiB
Metadata, single: total=8.00MiB, used=0.00
➜  ~  

C'est une partition de 40 Go avec pas mal d'instantanés. Mais comme il est compressé, je pense que le format 9,46 Go/40 Go est précis. Mais mon Ubuntu échoue car il dit qu'il n'a pas d'espace disque. J'ai eu apt-errors, les programmes d'installation ne peuvent pas et mon serveur mysql n'a pas pu démarrer à cause de cela.

Et je sais qu'il est important de ne pas compter sur df Je l'ai simplement inclus pour des raisons d'exhaustivité.

Je pense que Ubuntu utilise df qui est connu pour signaler de manière erronée avec Btrfs en interne et échoue pour cette raison. Cela aurait du sens pour APT lorsqu'il vérifie l'espace. Mais en fait, il n’écrit pas sur le disque.

$ Sudo time dd if=/dev/zero of=large bs=2G count=1
dd: error writing ‘large’: No space left on device
0+1 records in
0+0 records out
11747328 bytes (12 MB) copied, 1,29706 s, 9,1 MB/s
Command exited with non-zero status 1
0.00user 1.40system 0:01.44elapsed 97%CPU (0avgtext+0avgdata 2098028maxresident)k
160inputs+23104outputs (0major+383008minor)pagefaults 0swaps
7
redanimalwar

Btrfs est différent des systèmes de fichiers traditionnels. Ce n'est pas simplement une couche qui convertit les noms de fichiers en décalages sur un périphérique en mode bloc, c'est plutôt une couche qui combine un système de fichiers traditionnel avec LVM et RAID. Et comme LVM, il a le concept d’allouer de l’espace sur le périphérique sous-jacent, mais ne l’utilise pas réellement pour les fichiers.

Un système de fichiers traditionnel est divisé en fichiers et en espace libre. Il est facile de calculer combien d’espace est utilisé ou gratuit:

|--------files--------|                                                |
|------------------------drive partition-------------------------------|

Btrfs combine LVM, RAID et un système de fichiers. Le lecteur est divisé en sous-volumes, chacun dimensionné et répliqué dynamiquement:

|--files--|    |--files--|         |files|         |                   |
|----@raid1----|------@raid1-------|-----@home-----|metadata|          |
|------------------------drive partition-------------------------------|

Le diagramme montre que la partition est divisée en deux sous-volumes et métadonnées. L'un des sous-volumes est dupliqué (RAID1). Il existe donc deux copies de chaque fichier sur le périphérique. Nous avons maintenant non seulement le concept de la quantité d'espace libre sur la couche du système de fichiers, mais également de la quantité d'espace libre sur la couche de bloc (partition de lecteur) située en dessous. L'espace est également occupé par les métadonnées.

Lors de l'examen de l'espace libre dans Btrfs, nous devons préciser de quel espace libre il s'agit - la couche de bloc ou la couche de fichier? Au niveau de la couche de blocs, les données sont allouées par tranches de 1 Go. Les valeurs sont donc relativement grossières et peuvent ne pas avoir de relation avec la quantité d'espace que l'utilisateur peut réellement utiliser. Au niveau de la couche de fichiers, il est impossible de signaler la quantité d’espace libre, car celle-ci dépend de la manière dont elle est utilisée. Dans l'exemple ci-dessus, un fichier stocké sur le sous-volume répliqué @ raid1 occupera deux fois plus d'espace que le même fichier stocké sur le @ home sous-volume. Les instantanés stockent uniquement des copies de fichiers qui ont été modifiés par la suite. Il n'y a plus de correspondance 1-1 entre un fichier tel que l'utilisateur le voit et un fichier stocké sur le lecteur.

Vous pouvez vérifier l'espace libre au niveau de la couche de bloc avec btrfs filesystem show / et l'espace libre au niveau de la couche de sous-volumes avec btrfs filesystem df /


# df -h
Filesystem              Size  Used Avail Use% Mounted on
/dev/mapper/sda4_crypt   38G   12G   13M 100% /

Pour ce sous-volume monté, df indique un lecteur de taille totale 38G, 12G utilisés et 13M disponibles. 100% de l'espace disponible a été utilisé. N'oubliez pas que la taille totale 38G est divisée entre différents sous-volumes et métadonnées. Elle n'est pas exclusive à ce sous-volume.

# btrfs filesystem df /
Data, single: total=9.47GiB, used=9.46GiB
System, DUP: total=8.00MiB, used=16.00KiB
System, single: total=4.00MiB, used=0.00
Metadata, DUP: total=13.88GiB, used=1.13GiB
Metadata, single: total=8.00MiB, used=0.00

Chaque ligne indique l'espace total et l'espace utilisé pour un type de données et un type de réplication différents. Les valeurs indiquées sont des données stockées plutôt que des octets bruts sur le lecteur. Ainsi, si vous utilisez des sous-volumes RAID-1 ou RAID-10, la quantité de stockage brute utilisée est le double de la valeur indiquée ici.

La première colonne indique le type d'élément en cours de stockage (données, système, métadonnées). La deuxième colonne indique si une seule copie de chaque élément est stockée (unique) ou si deux copies de chaque élément sont stockées (DUP). Deux copies sont utilisées pour les données sensibles. Il existe donc une sauvegarde si une copie est corrompue. Pour les lignes DUP, la valeur utilisée doit être doublée pour obtenir la quantité d’espace utilisé sur le lecteur réel (car btrfs fs df rapporte les données stockées, pas l'espace disque utilisé). Les troisième et quatrième colonnes indiquent l'espace total et utilisé. Il n'y a pas de colonne free , car la quantité "d'espace libre" dépend de son utilisation.

Ce qui est remarquable à propos de ce lecteur, c’est que vous disposez de 9,47 Go d’espace alloué aux fichiers ordinaires pour lesquels vous avez utilisé 9,46 Go - c’est la raison pour laquelle vous obtenez . Il ne reste plus d’espace sur le périphérique les erreurs. Vous disposez de 13,88 Go d’espace alloué aux métadonnées dupliquées, pour lequel vous avez utilisé 1,13 Go. Étant donné que ces métadonnées sont dupliquées en mode DUP, cela signifie qu'un espace de 27,76 Gio a été alloué sur le lecteur réel, sur lequel vous avez utilisé 2,26 Gio. Par conséquent, 25,5 Go du lecteur ne sont pas utilisés, mais ne sont pas disponibles en même temps pour les fichiers à stocker. Il s’agit du problème "Btrfs énorme métadonnées allouées" . Pour essayer de corriger cela, exécutez btrfs balance start -m /. Le paramètre - m indique à btrfs de ne rééquilibrer que les métadonnées.

Un problème similaire est à court d'espace de métadonnées. Si la sortie avait montré que les métadonnées étaient en réalité pleines ( utilisée valeur proche de total ), la solution serait alors d'essayer et libérez des blocs de données presque vides (<5% utilisés) à l’aide de la commande btrfs balance start -dusage=5 /. Ces blocs libres pourraient ensuite être réutilisés pour stocker des métadonnées.

Pour plus de détails, voir la FAQ de Btrfs:

17
bain

Réponse courte: les métadonnées de partition Btrfs sont indiquées comme "utilisées" par les utilitaires de disque standard tels que df.

  1. vérifiez le volume du problème. par exemple: /

    btrfs subvolume list /
    
  2. Les instantanés les plus probables remplissent le volume. Supprimer l'instantané dont vous n'avez pas besoin. gardez-en un de la dernière date, vous êtes certain que le système fonctionnait correctement.

    btrfs subvolume delete <path> 
    

    Où path provient de la liste de sous-volumes de commande précédente qui indique "instantané".

  3. Redémarrez et vous avez terminé

La cause du problème peut être que votre distribution ou votre gestionnaire de paquets crée des instantanés chaque fois que vous mettez à jour le système.

NB: La commande de balance échoue si le disque est plein car il n’ya plus d’espace libre.

3
Michael Holopainen

Dans mon cas, l'utilisation du disque ne baisserait pas, même lorsque je supprimais des fichiers et des instantanés.

le solde de btrfs (données et métadonnées) ne fonctionnait pas avec l'erreur "il ne restait plus d'espace sur le périphérique"

btrfs balance start -m /
ERROR: error during balancing '/': No space left on device
There may be more info in syslog - try dmesg | tail

Le RAID1 a montré une utilisation complète sur les deux disques même si l’utilisation réelle des données était inférieure à un tiers.

# btrfs fi sh
Label: none  uuid: 61a20f1a-c133-11e6-964b-d3bac0c48bbd
    Total devices 2 FS bytes used 153.94GiB
    devid    1 size 455.76GiB used 455.76GiB path /dev/sda2
    devid    2 size 455.76GiB used 455.76GiB path /dev/sdb2


# btrfs filesystem df /
Data, RAID1: total=452.73GiB, used=151.51GiB
System, RAID1: total=32.00MiB, used=80.00KiB
Metadata, RAID1: total=3.00GiB, used=2.42GiB
GlobalReserve, single: total=512.00MiB, used=0.00B

Solution: éliminer les morceaux vides , ne nécessite pas d'espace supplémentaire:

btrfs balance start -dusage=0 /

btrfs balance start -musage=0 /

Source: https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-balance#ENOSPC

Alternative: Ma solution consistait à réduire les disques Voir: https://unix.stackexchange.com/questions/239765/how-to -fix-btrfs-superblock-error-after-resize-shrink-btrfs-Couldn-get-super

btrfs filesystem resize 1:430g /
btrfs filesystem resize 2:430g /

(les commandes prennent du temps, vérifiez syslog pour voir les blocs qui se déplacent)

après cela redimensionner:

btrfs filesystem resize 1:450g /
btrfs filesystem resize 2:450g /

Après cela, btrfs balance (métadonnées) a de nouveau fonctionné:

btrfs balance -m /

Puis btrfs solde des données (déplacez les blocs de données dont l'utilisation est inférieure à 33%):

btrfs balance -dusage=33 /
2
phiphi

Le crédit va à @ignis et @bain. Juste pour avoir une réponse simple et directe au résumé sans récit et pour partager ce que j’ai fait pour que le système fonctionne à nouveau.

btrfs balance start -m /mountpoint

Est-ce la ligne magique pour résoudre des problèmes comme celui-ci.

J'ai rencontré des problèmes que je ne voulais pas vous ennuyer et je ne savais pas qu'il était nécessaire de les lancer à partir d'un cd live, mais ce que j'ai fait à la fin, après que le système ait été gâché, ne pas démarrer, c'était lancer btrfsck les périphériques (mappeurs de cryptage déverrouillés) et il a effectivement trouvé des erreurs, puis monté le système de fichiers btrfs racine sans aucune option sur /mnt, par opposition à sur mon système installé où / est le seul sous-volume @ monté. J'ai donc eu tous les instantanés et autres sous-volumes. Je ne sais pas que cela fait une différence.

btrfs balance start -m /mnt

J'ai eu les métadonnées de

Metadata, DUP: total=13.88GiB, used=1.13GiB

à

Metadata, DUP: total=1.38GiB, used=1.05GiB

Et un rafraîchissant:

$ Sudo df -h /
Filesystem              Size  Used Avail Use% Mounted on
/dev/mapper/sda4_crypt   38G   12G   26G  31% /

Donc, je pense que tout va bien maintenant.

1
redanimalwar