La mia soluzione:
Prova a scoprire se si tratta di un problema di inode con:
df -ih
Prova a trovare cartelle root con un numero elevato di inode:
for i in /*; do echo $i; find $i |wc -l; done
Prova a trovare cartelle specifiche:
for i in /src/*; do echo $i; find $i |wc -l; done
Se si tratta di intestazioni Linux, prova a rimuovere le più vecchie con:
sudo apt-get autoremove linux-headers-3.13.0-24
Personalmente li ho spostati in una cartella montata (perché per me l'ultimo comando non è riuscito) e ho installato l'ultimo con:
sudo apt-get autoremove -f
Questo ha risolto il mio problema.
La mia situazione era che avevo esaurito gli inode e avevo già cancellato tutto ciò che potevo.
$ df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 942080 507361 11 100% /
Sono su Ubuntu 12.04LTS e non sono riuscito a rimuovere i vecchi kernel Linux che occupavano circa 400.000 inode perché apt era rotto a causa di un pacchetto mancante. E non ho potuto installare il nuovo pacchetto perché avevo esaurito gli inode, quindi ero bloccato.
Ho finito per eliminare manualmente alcuni vecchi kernel Linux per liberare circa 10.000 inode
$ sudo rm -rf /usr/src/linux-headers-3.2.0-2*
Questo è stato sufficiente per permettermi di installare il pacchetto mancante e riparare il mio apt
$ sudo apt-get install linux-headers-3.2.0-76-generic-pae
e quindi rimuovere il resto dei vecchi kernel Linux con apt
$ sudo apt-get autoremove
le cose ora vanno molto meglio
$ df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 942080 507361 434719 54% /
È abbastanza facile per un disco avere un gran numero di inode utilizzati anche se il disco non è molto pieno.
Un inode è allocato a un file, quindi, se hai miliardi di file, tutti da 1 byte ciascuno, finirai gli inode molto prima di esaurire il disco.
È anche possibile che l'eliminazione dei file non riduca il conteggio degli inode se i file hanno più collegamenti reali. Come ho detto, gli inode appartengono al file, non la voce della rubrica. Se un file ha due voci di directory collegate ad esso, eliminarne una non libererà l'inode.
Inoltre, puoi eliminare una voce di directory ma, se un processo in esecuzione ha ancora il file aperto, l'inode non verrà liberato.
Il mio consiglio iniziale sarebbe quello di eliminare tutti i file che puoi, quindi riavviare la scatola per assicurarti che non rimangano processi che tengono aperti i file.
Se lo fai e hai ancora un problema, faccelo sapere.
A proposito, se stai cercando le directory che contengono molti file, questo script può aiutarti:
#!/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_$$
Se sei molto sfortunato, hai utilizzato circa il 100% di tutti gli inode e non riesci a creare lo scipt. Puoi verificarlo con df -ih
.
Allora questo comando bash può aiutarti:
sudo find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
E sì, ci vorrà del tempo, ma puoi individuare la directory con il maggior numero di file.