« 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é.
Commentaire by Cybervince — 10 avril 2013 @ 13:06
Ahhh tout ça me parle bien. C’est du vécu.
Commentaire by Paje — 10 avril 2013 @ 13:35
une commande qui aurait marché du premier coup:
find . -name ‘*’ -type f -exec rm -f {} \; # recherche tous les fichiers et pour chaque fichier invoque la commande d’effacement
Commentaire by Romain — 10 avril 2013 @ 15:08
@Cybervince > ça fait bizarre au début hein, quand tu as un moment de doute et que tu cherches
@Paje > Merci pour la commande. Globalement elle fait la même chose que celle que j’ai utilisé, la méthode d’invocation de RM est changée.
Commentaire by Paje — 10 avril 2013 @ 16:07
Sauf que la tienne a un pb de nb d’argument autour de xargs, mais effectivement c’est le meme esprit
Commentaire by Romain — 10 avril 2013 @ 22:56
@Paje > OK, je comprends : tu dis ça car j’ai du le faire en plusieurs fois ?
J’ai plus fait comme ça par habitude, car j’utilise régulièrement « xargs ».
Commentaire by Montessori — 12 mars 2018 @ 15:28
Merci ! j’était en train de jouer avec mon dovecot à la recherche du bug quand je suis tombé sur ce post, impressionnant en effet le manque de place alors qu’un « df -h » nous dit que tout vas bien !
Commentaire by dhiya — 12 septembre 2018 @ 13:44
bon je viens de faire ce que tu as écris mais malheureusement le postfix mail ça marchait plus …