Trouver où les inodes sont utilisés

189

J'ai donc reçu un avertissement de notre système de surveillance sur l'une de nos boîtes indiquant que le nombre d'inodes libres sur un système de fichiers était faible.

df -i la sortie montre ceci:

Filesystem       Inodes  IUsed    IFree IUse% Mounted on
/dev/xvda1       524288 422613   101675   81% /

Comme vous pouvez le constater, 81% de ses inodes sont utilisés sur la partition racine.
Je suppose qu'ils sont tous utilisés dans un seul répertoire. Mais comment puis-je trouver où cela se trouve?

Patrick
la source

Réponses:

214

J'ai vu cette question au-dessus de stackoverflow, mais je n’ai aimé aucune des réponses, et c’est vraiment une question qui devrait être ici dans U & L de toute façon.

Fondamentalement, un inode est utilisé pour chaque fichier du système de fichiers. Donc, manquer d'inodes signifie généralement que vous avez beaucoup de petits fichiers qui traînent. La question devient alors: "quel répertoire contient un grand nombre de fichiers?"

Dans ce cas, le système de fichiers qui nous intéresse est le système de fichiers racine /. Nous pouvons donc utiliser la commande suivante:

find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n

Cela produira une liste de chaque répertoire du système de fichiers préfixé par le nombre de fichiers (et de sous-répertoires) de ce répertoire. Ainsi, le répertoire avec le plus grand nombre de fichiers sera en bas.

Dans mon cas, cela se présente comme suit:

   1202 /usr/share/man/man1
   2714 /usr/share/man/man3
   2826 /var/lib/dpkg/info
 306588 /var/spool/postfix/maildrop

Donc, fondamentalement, /var/spool/postfix/maildropconsomme tous les inodes.

Remarque, cette réponse comporte trois mises en garde auxquelles je peux penser. Il ne gère pas correctement les nouvelles lignes dans le chemin. Je sais que mon système de fichiers ne contient pas de fichiers avec des retours à la ligne, et comme il n'est utilisé que pour la consommation humaine, le problème potentiel ne vaut pas la peine d'être résolu (et on peut toujours remplacer le \navec par \0et utiliser sort -zci-dessus). Il ne gère pas non plus si les fichiers sont répartis sur un grand nombre de répertoires. Ce n'est pas probable cependant, donc je considère le risque acceptable. Il comptera également les liens physiques vers un même fichier (si vous utilisez un seul inode) plusieurs fois. Encore une fois, peu de chances de donner de faux positifs


La raison principale pour laquelle je n’ai aimé aucune des réponses à la réponse de stackoverflow est qu’elles dépassent toutes les limites du système de fichiers. Comme mon problème concernait le système de fichiers racine, cela signifiait qu'il traverserait chaque système de fichiers monté. Lancer -xdevles commandes de recherche ne fonctionnerait même pas correctement.
Par exemple, la réponse la plus votée est celle-ci:

for i in `find . -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n

Si nous changeons cela à la place

for i in `find . -xdev -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n

même s’il /mnt/foos’agit d’un montage, il s’agit également d’un répertoire sur le système de fichiers racine; il sera donc retourné find . -mount -type d, puis transmis au ls -a $i, qui plongera dans le montage.

Le finddans ma réponse répertorie plutôt le répertoire de chaque fichier du montage. Donc, fondamentalement, avec une structure de fichier telle que:

/foo/bar
/foo/baz
/pop/tart

on se retrouve avec

/foo
/foo
/pop

Il suffit donc de compter le nombre de lignes en double.

Patrick
la source
2
@MohsenPahlevanzadeh, cela ne fait pas partie de ma réponse, je faisais un commentaire sur la raison pour laquelle je n'aime pas la solution, car c'est une réponse commune à cette question.
Patrick
7
L'utilisation d'un montage lié est un moyen plus efficace d'éviter de rechercher dans d'autres systèmes de fichiers car elle permet d'accéder aux fichiers sous des points de montage. Par exemple, imaginez que je crée 300 000 fichiers sous /tmp, puis que le système soit configuré pour monter un fichier tmpfs /tmp. Dans ce cas, vous ne pourrez pas trouver les fichiers findseuls. Senario improbable, mais à noter.
Graeme
2
Les deux tâches doivent simplement supprimer le tri, car ce dernier doit créer un fichier lorsque la sortie est suffisamment volumineuse, ce qui n’était pas possible car j’ai atteint l’utilisation à 100% d’inodes.
Qwertzguy
1
Notez que cela -printfsemble être une extension GNU à rechercher, car la version BSD disponible sous OS X ne la prend pas en charge.
Xiong Chiamiov
1
Il est difficile de supposer que tous les fichiers se trouvent dans un seul répertoire. De nombreux programmes savent que de nombreux fichiers d’un même répertoire ont de mauvaises performances et donc hachent un ou deux niveaux de répertoires
PlasmaHH
26

Ceci est republié d' ici à la demande du demandeur:

du --inodes -S | sort -rh | sed -n \
        '1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}'

Et si vous voulez rester dans le même système de fichiers que vous faites:

du --inodes -xS

Voici quelques exemples de résultats:

15K     /usr/share/man/man3
4.0K    /usr/lib
3.6K    /usr/bin
2.4K    /usr/share/man/man1
1.9K    /usr/share/fonts/75dpi
...
519     /usr/lib/python2.7/site-packages/bzrlib
516     /usr/include/KDE
498     /usr/include/qt/QtCore
487     /usr/lib/modules/3.13.6-2-MANJARO/build/include/config
484     /usr/src/linux-3.12.14-2-MANJARO/include/config

MAINTENANT AVEC LS:

Plusieurs personnes ont mentionné qu'elles n'avaient pas de coreutils à jour et que l'option --inodes n'était pas disponible pour elles. Alors, voici ls:

ls ~/test -AiR1U | 
sed -rn '/^[./]/{h;n;};G;
    s|^ *([0-9][0-9]*)[^0-9][^/]*([~./].*):|\1:\2|p' | 
sort -t : -uk1.1,1n |
cut -d: -f2 | sort -V |
uniq -c |sort -rn | head -n10

Si vous êtes curieux, le cœur de cette tâche fastidieuse regexconsiste à remplacer les résultats de recherche récursifs filenamede chacun des ls'srésultats de recherche récursifs par le nom du répertoire dans lequel ils ont été trouvés. À partir de là, il suffit de serrer les numéros d'inode répétés, puis de compter les noms de répertoire répétés et de les trier en conséquence.

Cette -Uoption est particulièrement utile pour le tri car elle ne trie pas et présente plutôt la liste de répertoires dans l’ordre original ou, en d’autres termes, par inodenuméro.

Et bien sûr, cela -1est extrêmement utile dans la mesure où il garantit un seul résultat par ligne, quels que soient les retours à la ligne éventuellement inclus dans les noms de fichiers ou d’autres problèmes spectaculaires qui peuvent survenir lorsque vous essayez d’analyser une liste.

Et bien sûr -Apour tous et -ipour inode et -Rpour récursif et c’est tout.

La méthode sous-jacente à ceci est que je remplace chacun des noms de fichiers de ls par son nom de répertoire contenu dans sed. Suite à cela ... Eh bien, je suis moi-même un peu floue. Je suis à peu près certain que les fichiers sont comptés avec précision, comme vous pouvez le voir ici:

% _ls_i ~/test
> 100 /home/mikeserv/test/realdir
>   2 /home/mikeserv/test
>   1 /home/mikeserv/test/linkdir

Ceci me fournit des résultats à peu près identiques à la ducommande:

DU:

15K     /usr/share/man/man3
4.0K    /usr/lib
3.6K    /usr/bin
2.4K    /usr/share/man/man1
1.9K    /usr/share/fonts/75dpi
1.9K    /usr/share/fonts/100dpi
1.9K    /usr/share/doc/arch-wiki-markdown
1.6K    /usr/share/fonts/TTF
1.6K    /usr/share/dolphin-emu/sys/GameSettings
1.6K    /usr/share/doc/efl/html

LS:

14686   /usr/share/man/man3:
4322    /usr/lib:
3653    /usr/bin:
2457    /usr/share/man/man1:
1897    /usr/share/fonts/100dpi:
1897    /usr/share/fonts/75dpi:
1890    /usr/share/doc/arch-wiki-markdown:
1613    /usr/include:
1575    /usr/share/doc/efl/html:
1556    /usr/share/dolphin-emu/sys/GameSettings:

Je pense que la includechose dépend simplement du répertoire dans lequel le programme se penche en premier - car ce sont les mêmes fichiers et les liens fixes. Un peu comme la chose ci-dessus. Je peux toutefois me tromper à ce sujet - et je me réjouis de la correction ...

DU DEMO

% du --version
> du (GNU coreutils) 8.22

Faire un répertoire de test:

% mkdir ~/test ; cd ~/test
% du --inodes -S
> 1       .

Quelques annuaires d'enfants:

% mkdir ./realdir ./linkdir
% du --inodes -S
> 1       ./realdir
> 1       ./linkdir
> 1       .

Faire des fichiers:

% printf 'touch ./realdir/file%s\n' `seq 1 100` | . /dev/stdin
% du --inodes -S
> 101     ./realdir
> 1       ./linkdir
> 1       .

Quelques liens durs:

% printf 'n="%s" ; ln ./realdir/file$n ./linkdir/link$n\n' `seq 1 100` | 
    . /dev/stdin
% du --inodes -S
> 101     ./realdir
> 1       ./linkdir
> 1       .

Regardez les liens durs:

% cd ./linkdir
% du --inodes -S
> 101

% cd ../realdir
% du --inodes -S
> 101

Ils sont comptés seuls, mais allez un répertoire en place ...

% cd ..
% du --inodes -S
> 101     ./realdir
> 1       ./linkdir
> 1       .

Puis j'ai couru mon script run d'en bas et:

> 100     /home/mikeserv/test/realdir
> 100     /home/mikeserv/test/linkdir
> 2       /home/mikeserv/test

Et Graeme's:

> 101 ./realdir
> 101 ./linkdir
> 3 ./

Donc, je pense que cela montre que le seul moyen de compter les inodes est par inode. Et comme le fait de compter les fichiers signifie de compter les inodes, vous ne pouvez pas compter deux fois les inodes - pour compter les fichiers avec précision, les inodes ne peuvent pas être comptés plus d'une fois.

Mikeserv
la source
2
quelle version ajoutée --inodes? quelles "variantes" / "saveurs" / "posix-wannabes" / "implémentations" / quoi que vous ayez?
n611x007
Ubuntu 14.04.5: du: option non reconnue '--inodes'
Putnik
du (GNU coreutils) 8.23 ​​de 2014 l’a (c’est dans ma Debian Jessie obsolète). Debian> Ubuntu désolé pour ce jeu de mots: P Ubuntu a des paquets si anciens ...
Daniel W.
6

J'ai utilisé cette réponse de SO Q & A intitulée: Où sont tous mes inodes utilisés? quand notre NAS a été épuisé il y a environ 2 ans:

$ find . -type d -print0 \
    | while IFS= read -rd '' i; do echo $(ls -a "$i" | wc -l) "$i"; done \
    | sort -n

Exemple

$ find . -type d -print0 \
    | while IFS= read -rd '' i; do echo $(ls -a "$i" | wc -l) "$i"; done \
    | sort -n
...
110 ./MISC/nodejs/node-v0.8.12/out/Release/obj.target/v8_base/deps/v8/src
120 ./MISC/nodejs/node-v0.8.12/doc/api
123 ./apps_archive/monitoring/nagios/nagios-check_sip-1.3/usr/lib64/nagios
208 ./MISC/nodejs/node-v0.8.12/deps/openssl/openssl/doc/crypto
328 ./MISC/nodejs/node-v0.8.12/deps/v8/src
453 ./MISC/nodejs/node-v0.8.12/test/simple

Vérification des inodes du périphérique

En fonction de votre NAS, il se peut qu’il ne propose pas une dfcommande complète . Donc, dans ces cas, vous pouvez utiliser à la tune2fsplace:

$ sudo tune2fs -l /dev/sda1 |grep -i inode
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize
Inode count:              128016
Free inodes:              127696
Inodes per group:         2032
Inode blocks per group:   254
First inode:              11
Inode size:           128
Journal inode:            8
Journal backup:           inode blocks

Franchir les limites du système de fichiers

Vous pouvez utiliser le -xdevcommutateur direct findpour limiter la recherche au périphérique sur lequel vous lancez la recherche.

Exemple

Supposons que mon /homerépertoire se monte automatiquement via des partages NFS à partir de mon NAS, dont le nom est mulder.

$ df -h /home/sam 
Filesystem            Size  Used Avail Use% Mounted on
mulder:/export/raid1/home/sam
                      917G  572G  299G  66% /home/sam

Notez que le point de montage est toujours considéré comme local par rapport au système.

$ df -h /home/ .
Filesystem            Size  Used Avail Use% Mounted on
-                        0     0     0   -  /home
/dev/mapper/VolGroup00-LogVol00
                      222G  159G   52G  76% /

Maintenant quand j'initie find:

$ find / -xdev  | grep '^/home'
/home

Il /homen'a trouvé aucun contenu monté automatiquement car il se trouve sur un autre appareil!

Types de système de fichiers

Vous pouvez utiliser le commutateur find, -fstypepour contrôler le type de systèmes de fichiers findse penchera sur.

   -fstype type
          File is on a filesystem of type type.  The valid filesystem types 
          vary among different versions of Unix; an incomplete list of 
          filesystem  types that are accepted on some version of Unix or 
          another is: ufs, 4.2, 4.3, nfs, tmp, mfs, S51K, S52K.  You can use 
          -printf with the %F directive to see the types of your
          filesystems.

Exemple

Quel système de fichiers ai-je?

$ find . -printf "%F\n" | sort -u
ext3

Vous pouvez donc utiliser ceci pour contrôler le croisement:

seulement ext3

$ find . -fstype ext3 | head -5
.
./gdcm
./gdcm/gdcm-2.0.16
./gdcm/gdcm-2.0.16/Wrapping
./gdcm/gdcm-2.0.16/Wrapping/CMakeLists.txt

seulement nfs

$ find . -fstype nfs | head -5
$ 

ext3 et ext4

$ find . -fstype ext3 -o -fstype ext4 | head -5
.
./gdcm
./gdcm/gdcm-2.0.16
./gdcm/gdcm-2.0.16/Wrapping
./gdcm/gdcm-2.0.16/Wrapping/CMakeLists.txt
slm
la source
Quelle serait votre solution pour l'empêcher de dépasser les limites du système de fichiers? Comme si tout /était plein et que vous avez des systèmes de fichiers réseau montés, vous ne voulez pas vous plonger dans les systèmes de fichiers réseau.
Patrick
@ Patrick - voir les mises à jour, vous pouvez le contrôler en utilisant -fstypeà find.
slm
1
@Gilles - réponse simple ... n'a pas paginé dans le manuel de find page 8-)
slm
@Gilles - la page de manuel ne semble pas indiquer que -xtypeles systèmes de fichiers sont exclus, mais le type de fichier. Je ne trouve que des exemples comme celui-ci:find . \( -fstype nfs -prune \)
slm
@Gilles - Je m'adressais au Q de Patrick dans les commentaires sur la façon de ne pas finddépasser les limites du système de fichiers. Dans son ex. il mentionne "Comme si / est rempli, et que vous avez des systèmes de fichiers réseau montés, vous ne voulez pas plonger dans les systèmes de fichiers réseau".
slm
4

Commande pour trouver l'inode utilisé:

for i in /*; do echo $i; find $i |wc -l | sort ; done
Ashish Karpe
la source
3

Pour répertorier l'utilisation d'inode détaillée pour /, utilisez la commande suivante:

echo "Detailed Inode usage for: $(pwd)" ; for d in `find -maxdepth 1 -type d |cut -d\/ -f2 |grep -xv . |sort`; do c=$(find $d |wc -l) ; printf "$c\t\t- $d\n" ; done ; printf "Total: \t\t$(find $(pwd) | wc -l)\n" 
utilisateur108434
la source
Bienvenue ici! Je suggère, format la prochaine fois mieux, s'il vous plaît.
user259412
1
C'est un film, je ne vois rien de mal à cela.
Sjas
2

Répondez certainement avec un maximum de votes positifs pour aider à comprendre le concept des inodes sous Linux et Unix, mais cela n’aide pas vraiment quand il s’agit de traiter le problème de la suppression ou de la suppression des inodes du disque. Une manière plus simple de le faire sur les systèmes basés sur Ubuntu consiste à supprimer les en-têtes et les images de noyau Linux indésirables.

sudo apt-get autoremove

Feriez-le pour vous. Dans mon cas, l'utilisation d'inodes était à 78% en raison de laquelle j'ai reçu une alerte.

$ df -i
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 407957 116331   78% /
none           957443      2 957441    1% /sys/fs/cgroup
udev           956205    388 955817    1% /dev
tmpfs          957443    320 957123    1% /run
none           957443      1 957442    1% /run/lock
none           957443      1 957442    1% /run/shm
none           957443      5 957438    1% /run/user

Après exécution de la sudo apt-get autoremovecommande, il était tombé à 29%

$ df -i
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 150472 373816   29% /
none           957443      2 957441    1% /sys/fs/cgroup
udev           956205    388 955817    1% /dev
tmpfs          957443    320 957123    1% /run
none           957443      1 957442    1% /run/lock
none           957443      1 957442    1% /run/shm
none           957443      5 957438    1% /run/user

C'était juste mon observation qui m'a sauvé le temps. Les gens peuvent trouver une meilleure solution que celle-là.

Shailesh Sutar
la source
2

Je trouve plus rapide et plus facile d’explorer en utilisant la commande suivante:

$ sudo du -s --inodes * | sort -rn

170202  var
157325  opt
103134  usr
53383   tmp
<snip>

Vous pouvez ensuite accéder à, varpar exemple, et voir quel est le gros inode utilisant des répertoires.

JonoB
la source
0

Jusqu'à présent, chaque réponse suppose que le problème concerne plusieurs fichiers dans un seul répertoire, au lieu de plusieurs sous-répertoires contribuant tous au problème. Heureusement, la solution consiste simplement à utiliser moins de drapeaux.

# du --inodes --one-file-system /var | sort --numeric-sort
...
2265    /var/cache/salt/minion
3818    /var/lib/dpkg/info
3910    /var/lib/dpkg
4000    /var/cache/salt/master/gitfs/refs
4489    /var/lib
5709    /var/cache/salt/master/gitfs/hash
12954   /var/cache/salt/master/gitfs
225058  /var/cache/salt/master/jobs
241678  /var/cache/salt/master
243944  /var/cache/salt
244078  /var/cache
248949  /var

Ou avec des options plus courtes: du --inodes -x | sort -n. Malheureusement, toutes les versions de dul'option inodes ne sont pas disponibles .

OrangeDog
la source