« No space left on device » : vous manquez peut-être d’inodes ?
Il y a quelques temps, j’avais un souci sur un de mes serveurs Linux : certains services ne démarraient plus. En tentant de les démarrer manuellement, j’avais un message d’erreur pour un problème d’espace disque.
1 | No space left on device. |
Premier réflexe, vérifier l’espace disque restant sur les partitions avec la commande df :
1 | monitor01:~# df -h |
J’avais bien assez d’espace disponible sur tous les volumes, y compris sur la partition /root. Après quelques recherches, je me suis souvenu qu’il y a un nombre limité de fichiers par volumes, défini par le nombre d’inodes disponibles sur un volume.
Pour info, les inode (contraction des mots « index » et « node ») sont des fichiers descripteurs de données, et contiennent les informations (métadatas) sur les fichiers de données : pour chaque fichier, un seul inode.
Pour connaitre le nombre d’inode, c’est toujours la commande df, mais avec le paramètre « -i« .
1 | monitor01:~# df -i |
…qui m’a donné le résultat suivant :
Je tenais mon problème, il n’y avait plus d’inode de libre sur la partition /root (malgré le total de 1240320 inodes sur la partition, sic). Ce type de symptôme est souvent caractéristique d’un nombre important de petits fichiers.
Pour savoir où sont ces fichiers, on peut utiliser la commande suivante : elle va chercher le nombre de fichiers dans chaque répertoire. On commence par la racine /.
1 | monitor01:~# for x in /* ; do echo $x ; find $x | wc -l ; done |
Le résultat est présenté très simplement : le nom du répertoire, et le nombre de fichiers associés. En utilisant ce résultat, on peut continuer avec une commande similaire mais en remplaçant /* par /le-repertoire/* …et ainsi de suite !
Une fois trouvé le bon répertoire (/usr/local/pnp4nagios/var/spool/ dans mon cas), il fallait encore faire le ménage : j’ai tenté un « rm -rf », mais j’ai eu une surprise.
1 2 | monitor01:~# rm -rf * /bin/rm: Argument list too long. |
Heureusement, j’ai trouvé la solution (et l’explication) sur cette page :
1 | monitor01:~# find . -name '*' | xargs rm |
Petite astuce : dans mon cas, il a fallu le faire en plusieurs fois, par groupe de fichiers.
Note : pour la petite histoire, il s’agissait d’un serveur de monitoring Shinken, et le répertoire /usr/local/pnp4nagios/var/spool/ était rempli de fichiers perfdata.XXX. Il s’avérait que le processus NPCD qui doit utiliser ces fichiers n’était pas lancé.