Pourquoi le noyau Linux signale-t-il "manque d'espace disque" alors qu'en réalité il est hors des i-nœuds

10

Un de mes amis qui aime la programmation dans l'environnement Linux, mais ne sait pas grand-chose sur l'administration de Linux a récemment rencontré un problème où son système d'exploitation (Ubuntu) signalait "manque d'espace disque sur le volume XXX". Mais quand il est allé vérifier le volume, il restait encore 700 Go. Après beaucoup de temps perdu, il a finalement pu comprendre qu'il était à court d'inodes. (Il stockait beaucoup de petites mises à jour incrémentielles à partir d'un système de sauvegarde sur ce volume et les brûlait à travers tous ses inodes.)

Il m'a demandé pourquoi le noyau Linux a signalé le message d'erreur ("hors de l'espace disque") au lieu de signaler correctement ("hors des inodes"). Je ne savais pas, alors j'ai pensé que je demanderais à StackExchange.

Quelqu'un sait pourquoi cela se produit? et pourquoi cela n'a pas été corrigé après toutes ces années? (Je me souviens d'un ami différent qui m'a parlé de ce problème en 1995.)

Bretzel
la source

Réponses:

18

Un seul numéro d'erreur ENOSPC, est utilisé pour signaler les deux situations, d'où le même message d'erreur.

Pour maintenir la conformité aux normes ISO Cet POSIX, les développeurs du noyau n'ont d'autre choix que d'utiliser un seul numéro d'erreur pour les deux événements. L'ajout d'un nouveau numéro d'erreur interromprait les programmes existants.

Cependant, comme coller aux messages d'erreur traditionnels n'est pas obligatoire AFAIK, rien ne devrait interdire à un développeur de rendre le message unique plus clair, comme par exemple out of disk/inode space

Techniquement, qu'il s'agisse de l'espace inode ou de l'espace de données est le même, c'est-à-dire que cela signifie qu'il n'y a pas assez d'espace disque libre pour que l'appel système réussisse.

Je suppose que vous n'alliez pas vous plaindre si votre disque est signalé comme plein alors qu'il y a encore des emplacements d'inodes libres.

Notez que les systèmes de fichiers comme JFS, XFS, ZFSet btrfsallouer dynamiquement inodes donc ne pas cette question plus exposé.

jlliagre
la source
Les systèmes de fichiers récents incluent ext4?
Camilo Martin
@CamiloMartin Je ne pense pas.
jlliagre le
@CamiloMartin Malheureusement non, ext4alloue des inodes au moment de la création de fs comme ext2 / 3 et ne peut pas être modifié plus tard.
Matt
@mindthemonkey Darn! C'est probablement quelque chose de compatibilité descendante, je suppose. Quel autre système de fichiers a de belles fonctionnalités mais est assez stable (btrfs est-il stable)? ext4 semble être une sorte de "choix par défaut" (du moins de mon point de vue novice).
Camilo Martin
1
Ouais, les extensions ont toujours été des extensions de la version précédente et rétrocompatibles, donc aucun changement majeur, mais cela signifie qu'il est resté assez solide et stable. Personnellement, je fais tout mon stockage de gros volumes sur des boîtes freebsd avec ZFS. BTRFS est toujours considéré comme "instable", bien que la plupart des distributions vous permettent au moins de l'utiliser.
Matt
2

Je suppose que votre ami utilise un ext fs, car c'est l'un des rares fs sensibles qui peuvent manquer d'inodes.

Il semblerait que votre ami ait manipulé son système de fichiers et l'ait cassé ou qu'il ait un volume ridiculement élevé de plusieurs To. Les inodes ne sont pas une chose à utiliser une seule fois et à jeter. S'il a vraiment manqué d'inodes, cela signifie qu'il a ridiculement de nombreux fichiers et répertoires ... ce qui peut se produire sur un volume> 4 To (supposition éclairée), où "seulement" 700 Go sont gratuits. Pour la famille ext de fs, le nombre d'inodes est déterminé lors de la création de fs. Depuis la mkfs.ext4page de manuel:

-i bytes-per-inode
          Specify  the  bytes/inode ratio.  mke2fs creates an inode for every bytes-per-inode
          bytes of space on the disk.  The larger the bytes-per-inode ratio, the fewer inodes
          will  be  created.  This value generally shouldn't be smaller than the blocksize of
          the filesystem, since in that case more inodes would be made than can ever be used.
          Be  warned  that  it is not possible to expand the number of inodes on a filesystem
          after it is created, so be careful deciding the correct value for this parameter.

Pour raccourcir le reste de cette réponse: Ce moyen mkfsest soit fourni avec un tel rapport, soit il en assumera un. Si votre ami utilise le fs différemment que supposé, le rapport choisi peut être incorrect pour son cas d'utilisation et il obtient cette erreur ... remplir un seul volume multi-TB avec des tonnes de petits fichiers peut compter comme tel.

Votre ami utilise-t-il un environnement de bureau qui implémente le concept d'une «poubelle» pour les fichiers ou toute autre forme de sauvegarde pouvant créer de grandes quantités de fichiers? Peut-être qu'il peut résoudre son problème en se débarrassant simplement des fichiers inutiles.

Je me souviens de ce problème avec ext2 à peu près au moment où le noyau 2.4 était assez nouveau. En règle générale, j'utilise toujours XFS pour des volumes très importants par rapport à ce qui est actuellement courant. Actuellement, j'appellerais tout entre 250 Go et 1 To communs pour un seul volume et nous pouvons acheter des disques durs de 4 To. Donc pour tout> 3 To, je préfère utiliser XFS que ext. Juste une règle de base, mais qui n'a pas manqué d'inodes depuis longtemps ...

Bananguin
la source
1
Je crains que vous ne répondiez pas à la question posée.
jlliagre
Vrai. J'essayais en quelque sorte de répondre à la première question en ligne que j'ai frappée "Quelqu'un sait pourquoi cela se produit?", Mais pas celui du titre.
Bananguin
Droite. Mon ami sait ce qui s'est passé. Il faisait une sorte de système de sauvegarde où il stockait les modifications incrémentielles NON compressées (ni TAR) afin que tous ces minuscules petits fichiers prennent de la place. Je ne pense pas qu'il ait jamais eu un si gros FS auparavant, donc manquer d'inodes était une chose nouvelle pour lui. Ergo, il était frustré quand il a tapé "df -h" et a pensé, "hein, il me reste encore une tonne d'espace" - Franchement, je suis d'accord avec lui. Le fait que le noyau dise "hors espace", alors qu'en fait il devrait avoir un message séparé "hors des inodes" est très déroutant.
Pretzel
@Bananguin - Savez-vous quel est le rapport octet / inode par défaut?
Pretzel
@Pretzel: Je pense que je me souviens que la valeur par défaut est un inode pour chaque 4k. Je viens de vérifier mon ordinateur ( tune2fs -l /dev/sda1) et j'ai un ratio de 1 inode pour quatre blocs et chaque bloc a une taille de 1k. Combien cela peut être considéré comme "par défaut" cependant, je ne sais pas.
Bananguin