Mkdir: impossible de créer le répertoire XXX : Trop de liens

Bonjour,

J’ai un problème avec une application web qui a besoin de créer des dossiers sur le serveur pour stocker des images.
Tout ces dossiers sont stockés dans un répertoire, il en existe beaucoup (+ de 100.000).
Quand j’essaye de créer un nouveau dossier (soit via l’appli, soit via un terminal en root), j’obtiens le message d’erreur suivant :

root@SRV:/home/user/GED# mkdir NG_87918
mkdir: impossible de créer le répertoire « NG_87918 »: Trop de liens

J’ai vérifié mes droits, Apache est propriétaire des dossiers et a les droits de lecture/ecriture dessus. (de toute façon vu que root n’arrive pas à créer de dossier)

Merci pour votre aide

Assure-toi que le message d’erreur “trop de liens” soit fondé.

$ df -i

Comparer à

$ df -hT

Merci pour votre réponse, voila le résultat des commandes

root@SRVOPHTIX:/home/ophtel/GED# df -i
Sys. de fichiers Inodes IUtil. ILib. IUti% Monté sur
/dev/sda2 121102336 780890 120321446 1% /

root@SRVOPHTIX:/home/ophtel/GED# df -hT
Sys. fich. Type Taille Uti. Disp. Uti% Monté sur
/dev/sda2 ext3 1,8T 265G 1,5T 16% /

Ça pourrait être le nombre maximum de fichiers ouverts en même temps mais je croyais que cette contrainte avait disparu. En tout cas, là tu es large, ça n’est pas un nombre maximum d’inodes atteints…

La seule limitation en dur dans le noyau est le nombre de lien vers un même fichier (limité à 32000, ça laisse de la marge…)…

Je ne pense pas qu’il y ait énormément de fichiers d’ouverts en même temps sur la machine (si on arrive à 100 c’est un grand maximum).

Je ne vois pas comment j’aurais dépassé le nombre de liens autorisés, sachant que je n’en ai créé aucun et que je copie des fichiers. A moins qu’un de mes collègues ait fait une boulette…

Y’a t’il une possibilité de vérifier ça ?

Merci

Il est possible que ton serveur ouvre des fichiers mais ne les referme pas, dans ce cas, tu aurais dépassé le nombre de fichier ouvert possible… Cela signifie qu’un redémarrage du serveur règlerait le problème (redémarrage de apache, pas de la machine)

J’ai planifié un redémarrage d’apache tous les matins à 06:00, ça me parait bizarre qu’ils aient ouvert autant de fichiers aussi vite.

“Trop de liens” (“Too many link” en anglais") signifie que le nombre maximum de liens qu’un inode peut avoir dans le système de fichiers considéré est atteint. En clair ici, il s’agit à peu près du nombre de sous-répertoires qu’un répertoire peut contenir, puisque chaque sous-répertoire crée un lien “…” vers son répertoire parent. D’après ce qu’on peut trouver, la limite en ext2,3,4 est 32000. Etonnant que que tu en aies plus de 100000, à moins que la limite ait été augmentée dans le noyau Debian. Voir dans les sources ou les en-têtes du noyau, la valeur EXT3_LINK_MAX dans le fichier include/linux/ext3_fs.h.

[code]/*

  • Maximal count of links to a file
    */
    #define EXT3_LINK_MAX 32000[/code]

J’y avais pensé ici mais EXT2_LINK_MAX (ou EXT3_LINK_MAX) serait plutôt le nombre maximum de liens vers un fichier contrairement à ce que j’ai lu sur plusieurs pages et si on en croit l’explication en anglais au dessus. De plus le fait qu’il ait été jusqu’à 100000 m’a fait écarter cette piste. Mais je traduis peut être mal.

Je viens de créer 200.000 répertoires dans un répertoire donné d’une partition ext4, sans aucun souci particulier.
Serait-il possible d’avoir le nombre exact de répertoires ?

Peux-tu créer des répertoires ailleurs sur la même partition ?

Si as la possibilité de modifier l’application web que tu utilises, il ne serait pas trop difficile de rajouter un ou plusieurs niveaux dans ton arborescence, en fonction du nom de fichier.
Par exemple :

/home/user/GED 00 NG_87900 NG_88000 NG_88100 ... 01 NG_87901 NG_88001 NG_88101 ... 02 NG_87902 NG_88002 NG_88102 ...
Dans ce genre de partitionnement il faut juste faire attention à prendre les chiffres les moins significatifs comme répertoire de plus haut niveau, histoire que le remplissage soit à peu près homogène (je pars du principe que tes noms de répertoire sont séquentiels, donc les répertoires de partitionnement seront remplis en “round robin”).
Rien qu’avec ça tu divises le nombre d’éléments dans chaque répertoire par 100 (si tes noms sont en décimal), et si nécessaire tu peux facilement rajouter un ou plusieurs autres niveaux.

Bon, il faut se méfier ext4<>ext2, je viens de faire ce script idiot:

touch toto for i in $(seq 1 40000) ; do ln toto lien-$i; echo $i; done

Sur un ext4, ça fonctionne sans souci, sur du ext2, à 32000 pile, on a le message
ln: impossible de créer un lien direct sur « toto »: Trop de liens

31997 31998 31999 ln: impossible de créer un lien direct sur « toto »: Trop de liens 32000 ln: impossible de créer un lien direct sur « toto »: Trop de liens 32001 ln: impossible de créer un lien direct sur « toto »: Trop de liens 32002

Ça semblerait confirmer mon interprétation pour l’histoire du 32000, mais ça signifie aussi que ext2/3/4 n’ont pas les mêmes limitations.

re,

autant pour moi, il y’avait beaucoup moins de répertoire qu’attendu (la copie depuis l’ancien serveur sous windows avait planté)

root@SRVOPHTIX:/home/ophtel/GED# cd /home/ophtel/GED && ls -A1 | wc -l
31998

On est bien sur la limite max de l’ext3 !

Merci beaucoup pour votre aide.

Dans ce cas Pascal a raison, j’avais vu des indications là dessus mais je n’ai pas vu (et ne vois pas vraiment en fait) le rapport avec la phrase

[code]/*

  • Maximal count of links to a file
    */[/code]

Quand on crée un nouveau répertoire, son répertoire est peut-être considéré comme un lien lui aussi ? (c’est juste une supposition)

François :
Je pense que cette limite concerne plutôt les inodes au sens large (y compris les répertoires) et pas seulement les fichiers normaux.

Syam :
Oui, … est un lien vers le répertoire parent et donc compte comme un lien. D’ailleurs on peut voir le nombre de liens dans la sortie de ls -ld <répertoire> : un pour l’entrée dans le répertoire parent, un pour . dans le répertoire lui-même et un pour … dans chaque sous-répertoire.

[quote=“PascalHambourg”]
Oui, … est un lien vers le répertoire parent et donc compte comme un lien. [/quote]
Eh ben voilà ce que j’avais oublié… Maintenant c’est logique.