Vous êtes ici:

Menu

Inodes, quand ils te tiennent !

logo_tux
Lors dune intervention pour réaliser une maquette sur une de mes machines virtuelles, j'ai voulu upgrader ma distribution Debian. La mise à jour s'est soldée par un échec sans raison apparente. Une constatation : un grand nombre d'erreurs lors de la création de dossiers temporaires. Ces erreurs m'ont paru bizarres car les filesystem supervisés par Centreon ne m'ont pas alerté d'un éventuel problème d'espace disque. En vérifiant, en ligne de commande, tout me paraissait correct :

df -h
Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur
/dev/dm-0 5,2G 1,1G 3,9G 23% /
udev 10M 0 10M 0% /dev
tmpfs 201M 4,4M 196M 3% /run
tmpfs 501M 0 501M 0% /dev/shm
tmpfs 5,0M 0 5,0M 0% /run/lock
tmpfs 501M 0 501M 0% /sys/fs/cgroup
/dev/vda1 236M 33M 191M 15% /boot
/dev/mapper/vmitop--vg-home 5,8G 53M 5,4G 1% /home
/dev/mapper/vmitop--vg-tmp 360M 2,1M 335M 1% /tmp
/dev/mapper/vmitop--vg-var 2,7G 651M 1,9G 26% /var

En y regardant de plus près dans les erreurs de mise à jour, le problème se situait dans le filesystem /var. Le système ne pouvait créer de répertoire !
Après quelques recherches sur le web, je comprenais le problème : plus d'inodes disponibles dans /var. En utilisant la commande ci-dessous, le constat est sans appel :

df -i
Sys. de fichiers Inœuds IUtil. ILibre IUti% Monté sur
/dev/dm-0 352704 44691 308013 13% /
udev 125828 341 125487 1% /dev
tmpfs 128039 452 127587 1% /run
tmpfs 128039 1 128038 1% /dev/shm
tmpfs 128039 6 128033 1% /run/lock
tmpfs 128039 13 128026 1% /sys/fs/cgroup
/dev/vda1 62248 328 61920 1% /boot
/dev/mapper/vmitop--vg-home 389376 26 389350 1% /home
/dev/mapper/vmitop--vg-tmp 97536 21 97515 1% /tmp
/dev/mapper/vmitop--vg-var 179520 0 179520 100% /var

On découvre qu'il ne reste aucune inode disponible.
Les inodes sont très importants dans un système de fichiers UNIX/LINUX. Chaque fichier ou dossier (sous Unix, tout est fichier) doit correspondre à un numéro d'inode. Celui-ci contient les métadonnées des fichiers et en particulier les droits d'accès. La quantité d'inodes est déterminée lors du formatage de la partition. Le nombre maximum dépend de la taille de partition.
Maintenant que le problème avait été identifié. Je devais comprendre qu'elle en était la cause. J'ai commencé par rechercher l'endroit d'où provenait le trop grand nombre d'utilisation d'inode (fichier ou dossier). J'ai donc utilisé cette commande ci-dessous en commençant par la racine de /var

find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n

Cette commande indique le nombre d'inodes utilisé par les fichiers et sous-dossiers. Ensuite, je me suis déplacé de sous-dossier en sous-dossier pour terminer au dossier /var/www/html/glpi/files/_sessions. Celui-ci est utilisé par GLPI pour les sessions du plugin webservice. Un nombre très impressionnant de fichiers de session avait été créé par une expérimentation du module Centreon-glpi. Malheureusement pour moi, je n'avais pas arrêté le mode debug et les fichiers ont continué à alimenter ce dossier, mais pas suffisamment pour diminuer l'espace d'occupation du disque. Extrait des fichiers créés

-rw------- 1 www-data www-data 4836 oct.  30 11:58 sess_kokg1brvo5bberg4n4metgrok7
-rw------- 1 www-data www-data 4836 août 23 00:43 sess_kokngagajp6olvgo8aio429q57
-rw------- 1 www-data www-data 4836 sept. 5 16:43 sess_kokq1tfts61mlhgjf0pb1iuoe6
-rw------- 1 www-data www-data 4836 oct. 6 19:25 sess_koksekgael9rrlccbvp9jqqv80
-rw------- 1 www-data www-data 4836 juil. 25 00:59 sess_kol3g9hb8hig166giv66nd4kt4
-rw------- 1 www-data www-data 4836 sept. 28 01:20 sess_kol3iabshq2asmv210t7vone64
-rw------- 1 www-data www-data 2043 juil. 29 02:07 sess_kol9lijfl4pjdoj1f3pfb1l003
-rw------- 1 www-data www-data 4836 oct. 16 03:51 sess_kolckbhi6i75c81sas6481k7v7
-rw------- 1 www-data www-data 4836 sept. 22 20:06 sess_koliud04em2a9hbocv9sgarge3
-rw------- 1 www-data www-data 4836 oct. 8 14:55 sess_kolmd214l3ok2a9u2nsngb6op7
-rw------- 1 www-data www-data 4836 sept. 30 23:56 sess_kolpv9jtnjn2j6ngs7s617j157
-rw------- 1 www-data www-data 4836 oct. 21 10:25 sess_kolthgifq6sg5586jojclt4d36

La cause étant identifiée, j'ai donc décidé d'arrêter la connexion provoquant la création des fichiers. Ensuite, il fallait supprimer les fichiers existant pour libérer les inodes. J'utilisais donc la commande rm et je pensais que le tour était joué. Malheureusement, à cause du nombre impressionnant de fichier, j'ai eu droit au résultat suivant :
root@vmitop:/var/www/html/glpi/files/_sessions# rm sess*

bash: /bin/rm: Liste d'arguments trop longue

Retour aux recherches sur la toile pour trouver la commande qui tue :

root@vmitop:/var/www/html/glpi/files/_sessions# find . -type f -name 'sess*' -delete

Au bout de quelques minutes, la situation est devenue correcte avec un nombre d'inode libre suffisant.

df -i
Sys. de fichiers Inœuds IUtil. ILibre IUti% Monté sur
/dev/dm-0 352704 42431 310273 13% /
udev 125831 341 125490 1% /dev
tmpfs 128041 450 127591 1% /run
tmpfs 128041 1 128040 1% /dev/shm
tmpfs 128041 6 128035 1% /run/lock
tmpfs 128041 13 128028 1% /sys/fs/cgroup
/dev/mapper/vmitop--vg-tmp 97536 21 97515 1% /tmp
/dev/mapper/vmitop--vg-home 389376 26 389350 1% /home
/dev/vda1 62248 328 61920 1% /boot
/dev/mapper/vmitop--vg-var 179520 18579 160941 11% /var

Maintenant, pour éviter ce genre de problème, il reste une chose importante à réaliser : superviser le taux d'utilisation des inodes de mon serveur. Grâce aux plugins de Centreon réalisés par Quentin Garnier, c'est un jeu d'enfant !
J'ai donc opté par le module os::linux::snmp::plugin avec le mode inodes. Attention, prérequis pour le SNMP, ajouter la directive

includeAllDisks  10%

Première méthode


La commande vérifie tous les systèmes de fichier. Pour éviter un trop grand nombre de métriques, l'utilisation de l'option filter-perfdata est nécessaire. Nous utiliserons la commande suivante :

./centreon_plugins.pl --plugin=os::linux::snmp::plugin --mode=inodes --snmp-community=public --hostname=192.168.0.241 --snmp-version=2 --filter-perfdata='^used_/$|^used_/boot$|^used_/home$|^used_/tmp$|^used_/var$' --warning-usage=70 --critical-usage=90

Dans Centreon la commande sera sous cette forme :

$CENTREONPLUGINS$/centreon_plugins.pl --plugin=os::linux::snmp::plugin --mode=inodes --warning-usage=$_SERVICEWARNING$ --critical-usage=$_SERVICECRITICAL$ --hostname=$HOSTADDRESS$ --snmp-version=$_HOSTSNMPVERSION$ --snmp-community=$_HOSTSNMPCOMMUNITY$  --filter-perfdata=$_SERVICEFILTER$

Il suffira de créer le modèle de service et de compléter chaque service avec la macro FILTER.

Deuxième méthode


Lorsque certains systèmes de fichiers spécialisés génère des faux positifs comme cet exemple :

./centreon_plugins.pl --plugin=os::linux::snmp::plugin --mode=inodes --snmp-community=public --hostname=192.168.0.163 --snmp-version=2 --filter-perfdata='^used_/$|^used_/boot$|^used_/home$|^used_/tmp$|^used_/var$' --warning-usage=70 --critical-usage=90
CRITICAL: Inode partition '/dev/pts' Used: 100 % - Inode partition '/proc' Used: 100 % - Inode partition '/sys' Used: 100 % - Inode partition '/var/lib/nfs/rpc_pipefs' Used: 100 % | 'used_/'=7%;0:70;0:90;0;100 'used_/boot'=0%;0:70;0:90;0;100 'used_/home'=0%;0:70;0:90;0;100 'used_/tmp'=0%;0:70;0:90;0;100 'used_/var'=6%;0:70;0:90;0;100

Nous allons utiliser l'option diskpath mais comme nous voulons superviser plusieurs système de fichier en même temps, nous utiliserons la désignation numérique. Pour connaître la position numérique de vos Filesystem, lancer la commande en mode debug :

./centreon_plugins.pl --plugin=os::linux::snmp::plugin --mode=inodes --snmp-community=public --hostname=192.168.0.163 --snmp-version=2  --debug
OK: All inode partitions are ok | 'used_/'=7%;;;0;100 'used_/boot'=0%;;;0;100 'used_/dev'=0%;;;0;100 'used_/dev/pts'=100%;;;0;100 'used_/home'=0%;;;0;100 'used_/proc'=100%;;;0;100 'used_/run'=0%;;;0;100 'used_/run/lock'=0%;;;0;100 'used_/run/shm'=0%;;;0;100 'used_/sys'=100%;;;0;100 'used_/tmp'=0%;;;0;100 'used_/usr'=39%;;;0;100 'used_/var'=6%;;;0;100 'used_/var/lib/nfs/rpc_pipefs'=100%;;;0;100
disk path : '/', device : 'rootfs'
disk path : '/var', device : '/dev/mapper/deb260full-var'
disk path : '/sys', device : 'sysfs'
disk path : '/proc', device : 'proc'
disk path : '/dev', device : 'udev'
disk path : '/dev/pts', device : 'devpts'
disk path : '/run', device : 'tmpfs'
disk path : '/run/lock', device : 'tmpfs'
disk path : '/run/shm', device : 'tmpfs'
disk path : '/boot', device : '/dev/vda1'
disk path : '/home', device : '/dev/mapper/deb260full-home'
disk path : '/tmp', device : '/dev/mapper/deb260full-tmp'
disk path : '/usr', device : '/dev/mapper/deb260full-usr'
disk path : '/var/lib/nfs/rpc_pipefs', device : 'rpc_pipefs'
Inode partition '/' Used: 7 %
Inode partition '/boot' Used: 0 %
Inode partition '/dev' Used: 0 %
Inode partition '/dev/pts' Used: 100 %
Inode partition '/home' Used: 0 %
Inode partition '/proc' Used: 100 %
Inode partition '/run' Used: 0 %
Inode partition '/run/lock' Used: 0 %
Inode partition '/run/shm' Used: 0 %
Inode partition '/sys' Used: 100 %
Inode partition '/tmp' Used: 0 %
Inode partition '/usr' Used: 39 %
Inode partition '/var' Used: 6 %
Inode partition '/var/lib/nfs/rpc_pipefs' Used: 100 %

Nous déterminons nos FileSystem numériquement par ordre d'arrivée :

1 -> /
2 -> /var
10 -> /root
11 -> /home
12 -> /tmp
13 -> /usr

Nous pouvons créer notre commande comme ceci:

./centreon_plugins.pl --plugin=os::linux::snmp::plugin --mode=inodes --snmp-community=public --hostname=192.168.0.163 --snmp-version=2  --diskpath=1,2,10,11,12,13  --warning-usage=70 --critical-usage=90

Nous compléterons notre précédente commande avec l'option diskpath.

$CENTREONPLUGINS$/centreon_plugins.pl --plugin=os::linux::snmp::plugin --mode=inodes --warning-usage=$_SERVICEWARNING$ --critical-usage=$_SERVICECRITICAL$ --hostname=$HOSTADDRESS$ --snmp-version=$_HOSTSNMPVERSION$ --snmp-community=$_HOSTSNMPCOMMUNITY$  --diskpath=$_SERVICEDISKPATH$ —filter-perfdata=$_SERVICEFILTER$

Lors de la création du service, il ne faudra pas compléter la macro FILTER mais il faudra affecter les valeurs des FileSystem dans la macro DISKPATH.
Et voici le graphe généré par la supervision.

graphe_inodes

Vous allez me dire que ce n'est pas transcendant mais cette vérification me permettra d'éviter quelques désagréments šŸ˜€.

graphe_inodes1

blog comments powered by Disqus
 Vous êtes ici: