Comment puis-je augmenter le nombre d'inodes dans un système de fichiers ext4?

61

J'ai eu un problème (nouveau pour moi) la semaine dernière. J'ai un système de fichiers ext4 (Fedora 15). L'application qui s'exécute sur le serveur s'est soudainement arrêtée. Je ne pouvais pas trouver le problème au premier regard.

dfa montré 50% d'espace disponible. Après avoir cherché pendant environ une heure, j’ai vu un post sur le forum où le gars s’était servi df -i. L'option recherche l'utilisation d'inodes. Le système était à court d'inodes, un problème simple que je n'avais pas réalisé. La partition n'avait que 3,2 millions d'inodes.

Maintenant, mes questions sont: Puis-je donner au système plus d’inodes? Devrait-il / peut-il être défini lors du formatage du disque? Avec les inodes 3.2M, combien de fichiers puis-je avoir?

piovisqui
la source
1
Chaque fichier ou répertoire utilise un inode. Un lien physique vers un fichier ne crée pas d'inode. fr.wikipedia.org/wiki/Inode
Paul Tomblin Le

Réponses:

33

Il semble que vous ayez beaucoup plus de fichiers que prévu normalement.

Je ne sais pas s'il existe une solution pour changer la taille de la table inode de manière dynamique. Je crains que vous n'ayez besoin de sauvegarder vos données, de créer un nouveau système de fichiers et de restaurer vos données.

Pour créer un nouveau système de fichiers avec une si grande table d'inodes, vous devez utiliser l'option '-N' de mke2fs (8).

Je recommanderais d'utiliser d'abord l'option '-n' (qui ne crée pas le fs, mais affiche les informations utiles) afin de pouvoir obtenir le nombre estimé d'inodes. Ensuite, si vous en avez besoin, utilisez '-N' pour créer votre système de fichiers avec un numéro d'inode spécifique.

Cinsk
la source
11
Vous pouvez utiliser mke2fs -ipour spécifier le nombre d'inodes. Sa documentation indique qu '«il n'est pas possible d'augmenter le nombre d'inodes sur un système de fichiers après sa création».
Gilles 'SO- arrête d'être méchant'
2
@piovisqui: chaque fichier consomme un inode, qui est un pointeur dans le système de fichiers. si le fichier est un lien dur vers un autre fichier, il a le même inode.
Hanan N.
6
@Gilles Les -ioptions spécifient la taille de l'inode, pas son nombre. L' -Noption définit le nombre d'inodes.
theillien
1
La relation entre les inodes et les numéros de fichier n'est pas nécessairement 1: 1. Le premier inode contient une liste de pointeurs sur les blocs dans lesquels le fichier est stocké. Si la liste de blocs ne peut pas tenir dans un inode, celui-ci contient une liste de pointeurs sur des inodes qui répertorient les blocs dans lesquels le fichier est stocké. Si cela ne correspond pas à cela, alors il faut 3 jeux d'inodes profonds pour cette liste de blocs, etc.
StuWhitby
2
@ StuWhitby Ce n'est pas tout à fait vrai. Un seul inode a plusieurs pointeurs directs et un seul, double et triple pointeur indirect. Si la liste des blocs ne peut pas tenir dans les pointeurs directs, alors le seul pointeur indirect pointe vers un bloc de données (PAS un autre inode) qui contient plus de pointeurs. Si vous avez besoin de plus de pointeurs que cela, le pointeur double indirect pointe vers un bloc contenant des pointeurs indirects simples et le triple indirecte dans un bloc avec des pointeurs doubles indirects. Ainsi, un fichier utilise en réalité un seul inode, quelle que soit sa taille.
user125355
11

Comme autre solution de contournement, je pourrais suggérer d’envisager de regrouper d’énormes collections de fichiers dans une tararchive non compressée (!) , Puis de l’utiliser archivemountpour le monter en tant que système de fichiers. Une archive tar est préférable pour le partage qu'une image de système de fichiers et offre des performances similaires lors de la sauvegarde sur un cloud ou un autre stockage.


Si la collection est supposée être en lecture seule, cela squashfspeut être une option, mais certaines options doivent être activées dans le noyau et la xzcompression est disponible pour tar avec les mêmes performances.

Tijagi
la source
2
Bonne suggestion.
piovisqui
11

Avec 3,2 millions d'inodes, vous pouvez avoir 3,2 millions de fichiers et de répertoires, au total (mais plusieurs liens durs vers un fichier utilisent un seul inode).

Oui, il peut être défini lors de la création d'un système de fichiers sur la partition. Les options -T usage-type, -N number-of-inodesou -i bytes-per-inodepeuvent toutes définir le nombre d'inodes. J'utilise généralement -i, après avoir comparé la sortie de du -set find | wc -lpour une collection de fichiers similaire et en tenant compte de la marge.

Non, il ne peut pas être modifié sur place sur un système de fichiers existant. Pourtant:

  • Si vous exécutez LVM ou si le système de fichiers se trouve sur le LUN d’un réseau SAN (directement sur le LUN ou en tant que dernière partition du LUN), ou si vous avez de l’espace vide sur le disque après la partition, vous pouvez agrandir la partition, puis utiliser resize2fspour développer le système de fichiers. Cela ajoute plus d'inodes plus ou moins proportionnellement à l'espace ajouté. Si vous voulez éviter de manquer d'inodes avant l'espace, en supposant que les fichiers futurs aient en moyenne la même taille, définissez un pourcentage de bloc réservé suffisamment élevé à l'aide de tune2fs -m.
  • Si vous disposez de suffisamment d'espace et que vous pouvez mettre le système de fichiers hors ligne, mettez-le hors ligne, créez-en un nouveau avec plus d'inodes et copiez tous les fichiers.
  • Si seulement un sous-ensemble des fichiers utilise beaucoup d'inodes et que vous avez suffisamment d'espace libre, créez un système de fichiers sur un périphérique en boucle sauvegardé par un fichier du système de fichiers, créez un système de fichiers avec plus d'inodes (et peut-être de plus petits blocs). dessus, et déplacez-y les répertoires incriminés. C'est probablement un coup dur pour la performance et la maintenance, mais c'est une alternative.
  • Et bien sûr, si vous pouvez supprimer beaucoup de fichiers inutiles, cela devrait également vous aider.
david
la source
6

J'ai une solution alternative pour cette situation. Disons que vous avez 1000 inodes dans une partition de 10G. Mais en raison de la limite d'inodes, vous n'êtes pas censé utiliser tout l'espace de la partition . Mais dans cette solution, vous pourrez utiliser l’espace restant de la partition sans le formater .

$ df -i  # see list ( I need just one free inode here so move just one file into other PARTITION)
/dev/part1  1000 999 1 99.9%     /data

$ dd if=/dev/zero of=/data/new_data
$ mkfs.ext4 /data/new_data
$ mkdir /data1
$ mount /data/new_data /data1

pour montage permanent

$ echo "/data/new_data /data1 ext4 defaults 0 1" >> /etc/fstab
SANJEET
la source
2
Bienvenue chez U & L. J'ai pris la liberté de reformater votre réponse à la représentation plus habituelle du code ici, en insérant une invite ( $) pour distinguer clairement les commandes de la sortie (s'il ne s'agissait que d'une commande, l'invite est normalement laissée de côté). J'ai également changé le slogging lors de la phase audacieuse, ce que je pense que vous vouliez. Vous pouvez annuler les modifications si je présente mal les choses
Anthon
Je pense que cette solution a une logique, mais vous devez gérer la taille lorsque vous exécutez dd.
piovisqui
3
Les détails sont incorrects, vous devez utiliser un périphérique en boucle et peut-être même unionfs en fonction de l'application, mais c'est la seule solution permettant d'éviter le formatage et la restauration à partir d'une sauvegarde, ce qui n'est pas amusant si vous êtes pressé avec des millions de fichiers. Il y a des circonstances où cela pourrait sauver la journée!
Médoc
6

Récemment rencontré ce problème lors de l’utilisation d’apt ou d’aptitude upgrade.

df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  5.1G  2.3G  70% /

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 521497   2791  100% /

Commande émise:

du /|sort -k1 -n

La plupart des fichiers révélés se trouvaient dans des sous-dossiers pour plusieurs versions du noyau dans:

/usr/src/linux-headers

Suppression de ces sous-dossiers et le problème d'inode a été corrigé.

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 104986 419302   21% /
kph0x1
la source
"du / | sort -k1 -n" affiche-t-il les inodes?
Orphelins le
Cela consistait à trier les répertoires, en indiquant quels étaient ceux qui contenaient le plus de fichiers, des dossiers qui consommaient beaucoup d’inodes mais utilisaient moins d’espace: la situation de 30% d’espace disque disponible et 100% d’utilisation d’inodes présentée ci-dessus.
kph0x1
Honnêtement, je ne comprends pas comment "du" a montré combien il y a de fichiers avec un drapeau? Pourriez-vous s'il vous plaît expliquer plus en détail?
Orphelins le
Aucun indicateur pour la ducommande. L'utilisation concerne la racine du système de fichiers dans l'exemple ci-dessus, en regardant uniquement l'espace. La sortie est canalisée pour trier afin de montrer quels répertoires contiennent le plus de fichiers. Dans l'exemple ci-dessus pour les fichiers, le nombre de fichiers de votre question ne contient pas le décompte. Les sources du noyau étaient le coupable indiqué dans la dusortie; par exemple, de nombreux petits fichiers, des sous-dossiers de compilations antérieures, ce qui convient parfaitement à la suppression pour libérer des inodes. Il restait encore un examen manuel, humain de la duproduction, /usr/src/linux-headersétait alors évident.
kph0x1
1
du ne montre que des octets - pas des fichiers. Et vous ne dirigez la sortie que de la commande en une sorte. Alors, comment trier -k1 -n trie-t-il la sortie de la manière que vous avez proposée? La seule chose que je peux voir, c'est que "du / | sort -k1 -n" ne trie que chaque ligne en fonction de la taille en octets. Rien d'autre
Orphans
2

essayez du -s --inodes * 2>/dev/null |sort -gle cd dans le dernier répertoire en sortie et recommencez.

Divulgation complète: l' --inodesindicateur de prise en charge de tous les systèmes d'exploitation pour la commande du (pas mon Mac OS), mais de nombreux systèmes d'exploitation Linux le sont.

Otto Leichliter
la source