Ma solution :
Essayez de trouver s'il s'agit d'un problème d'inodes avec :
df -ih
Essayez de trouver des dossiers racine avec un grand nombre d'inodes :
for i in /*; do echo $i; find $i |wc -l; done
Essayez de trouver des dossiers spécifiques :
for i in /src/*; do echo $i; find $i |wc -l; done
S'il s'agit d'en-têtes Linux, essayez de supprimer les plus anciens avec :
sudo apt-get autoremove linux-headers-3.13.0-24
Personnellement, je les ai déplacés dans un dossier monté (car pour moi la dernière commande a échoué) et j'ai installé le dernier avec :
sudo apt-get autoremove -f
Cela a résolu mon problème.
Ma situation était que je n'avais plus d'inodes et que j'avais déjà supprimé tout ce que je pouvais.
$ df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 942080 507361 11 100% /
Je suis sur un Ubuntu 12.04LTS et je n'ai pas pu supprimer les anciens noyaux Linux qui occupaient environ 400 000 inodes car apt était cassé à cause d'un paquet manquant. Et je n'ai pas pu installer le nouveau paquet car je n'avais plus d'inodes donc j'étais bloqué.
J'ai fini par supprimer quelques anciens noyaux Linux à la main pour libérer environ 10 000 inodes
$ sudo rm -rf /usr/src/linux-headers-3.2.0-2*
Cela a suffi pour me permettre d'installer le paquet manquant et de réparer mon apt
$ sudo apt-get install linux-headers-3.2.0-76-generic-pae
puis supprimez le reste des anciens noyaux Linux avec apt
$ sudo apt-get autoremove
ça va beaucoup mieux maintenant
$ df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 942080 507361 434719 54% /
Il est assez facile pour un disque d'avoir un grand nombre d'inodes utilisés même si le disque n'est pas très plein.
Un inode est alloué à un fichier donc, si vous avez des milliards de fichiers, tous de 1 octet chacun, vous manquerez d'inodes bien avant de manquer de disque.
Il est également possible que la suppression de fichiers ne réduise pas le nombre d'inodes si les fichiers ont plusieurs liens physiques. Comme je l'ai dit, les inodes appartiennent au fichier, pas l'entrée du répertoire. Si un fichier a deux entrées de répertoire qui lui sont liées, en supprimer une ne libérera pas l'inode.
De plus, vous pouvez supprimer une entrée de répertoire mais, si un processus en cours a toujours le fichier ouvert, l'inode ne sera pas libéré.
Mon premier conseil serait de supprimer tous les fichiers que vous pouvez, puis de redémarrer la boîte pour vous assurer qu'aucun processus ne laisse les fichiers ouverts.
Si vous faites cela et que vous rencontrez toujours un problème, faites-le nous savoir.
Au fait, si vous recherchez les répertoires qui contiennent beaucoup de fichiers, ce script peut vous aider :
#!/bin/bash
# count_em - count files in all subdirectories under current directory.
echo 'echo $(ls -a "$1" | wc -l) $1' >/tmp/count_em_$$
chmod 700 /tmp/count_em_$$
find . -mount -type d -print0 | xargs -0 -n1 /tmp/count_em_$$ | sort -n
rm -f /tmp/count_em_$$
Si vous êtes très malchanceux, vous avez utilisé environ 100 % de tous les inodes et vous ne pouvez pas créer le scipt. Vous pouvez vérifier cela avec df -ih
.
Alors cette commande bash peut vous aider :
sudo find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
Et oui, cela prendra du temps, mais vous pouvez localiser le répertoire avec le plus de fichiers.