Vi esta pregunta en stackoverflow, pero no me gustaron las respuestas, y realmente es una pregunta que debería estar aquí en U&L de todos modos.
Básicamente se usa un inodo para cada archivo en el sistema de archivos. Por lo tanto, quedarse sin inodos generalmente significa que tienes muchos archivos pequeños por ahí. Entonces la pregunta realmente se convierte en "¿qué directorio tiene una gran cantidad de archivos?"
En este caso, el sistema de archivos que nos interesa es el sistema de archivos raíz /
, por lo que podemos usar el siguiente comando:
find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n
Esto volcará una lista de cada directorio en el sistema de archivos con el prefijo de la cantidad de archivos (y subdirectorios) en ese directorio. Por lo tanto, el directorio con el mayor número de archivos estará en la parte inferior.
En mi caso, esto resulta lo siguiente:
1202 /usr/share/man/man1
2714 /usr/share/man/man3
2826 /var/lib/dpkg/info
306588 /var/spool/postfix/maildrop
Así que básicamente /var/spool/postfix/maildrop
está consumiendo todos los inodes.
Tenga en cuenta que esta respuesta tiene tres advertencias en las que puedo pensar. No maneja adecuadamente nada con líneas nuevas en la ruta. Sé que mi sistema de archivos no tiene archivos con líneas nuevas, y dado que esto solo se usa para consumo humano, no vale la pena resolver el problema potencial (y siempre se puede reemplazar \n
con \0
y usar sort -z
arriba). Tampoco maneja si los archivos se extienden entre una gran cantidad de directorios. Sin embargo, esto no es probable, por lo que considero que el riesgo es aceptable. También contará los enlaces duros a un mismo archivo (por lo tanto, usando solo un inodo) varias veces. De nuevo, es poco probable que dé falsos positivos.
La razón clave por la que no me gustaron las respuestas de stackoverflow es que todas cruzan los límites del sistema de archivos. Dado que mi problema estaba en el sistema de archivos raíz, esto significa que atravesaría cada sistema de archivos montado. Lanzar -xdev
los comandos de búsqueda ni siquiera funcionaría correctamente.
Por ejemplo, la respuesta más votada es esta:
for i in `find . -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n
Si cambiamos esto en lugar de
for i in `find . -xdev -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n
a pesar de que /mnt/foo
es un montaje, también es un directorio en el sistema de archivos raíz, por lo que aparecerá find . -mount -type d
y luego ls -a $i
pasará al , que se sumergirá en el montaje.
En find
mi respuesta, en su lugar, se enumera el directorio de cada archivo en el montaje. Básicamente, con una estructura de archivos como:
/foo/bar
/foo/baz
/pop/tart
terminamos con
/foo
/foo
/pop
Entonces solo tenemos que contar el número de líneas duplicadas.
/tmp
y luego el sistema está configurado para montar un tmpfs/tmp
. Entonces no podrá encontrar los archivosfind
solo. Senario improbable, pero vale la pena señalar.-printf
parece ser una extensión de GNU para encontrar, ya que la versión BSD disponible en OS X no es compatible.Esto se vuelve a publicar desde aquí a instancias del autor de la pregunta:
Y si quieres permanecer en el mismo sistema de archivos que haces:
Aquí hay un ejemplo de salida:
AHORA CON LS:
Varias personas mencionaron que no tienen coreutils actualizados y que la opción --inodes no está disponible para ellos. Entonces, aquí está ls:
Si tiene curiosidad, el corazón y el alma de ese tedioso trozo de
regex
allí está reemplazando elfilename
de cada uno dels's
los resultados de búsqueda recursiva con el nombre del directorio en el que se encontró. A partir de ahí, solo es cuestión de apretar números de inodo repetidos y luego contar nombres de directorio repetidos y ordenarlos en consecuencia.La
-U
opción es especialmente útil con la clasificación, ya que específicamente no se clasifica, y en su lugar presenta la lista de directorios en orden original, o, en otras palabras, porinode
número.Y, por supuesto,
-1
es increíblemente útil, ya que garantiza un único resultado por línea, independientemente de las posibles nuevas líneas incluidas en los nombres de archivo u otros problemas espectacularmente desafortunados que pueden ocurrir cuando intenta analizar una lista.Y, por supuesto,
-A
para todos y-i
para el inodo y-R
para el recursivo y eso es todo.El método subyacente a esto es que reemplazo cada uno de los nombres de archivo de ls con su nombre de directorio que contiene en sed. Después de eso ... Bueno, yo también estoy un poco confusa. Estoy bastante seguro de que está contando con precisión los archivos, como puede ver aquí:
Esto me proporciona resultados prácticamente idénticos al
du
comando:DU:
LS:
Creo que la
include
cosa solo depende del directorio en el que se ve el programa al principio, porque son los mismos archivos y están vinculados. Un poco como la cosa de arriba. Sin embargo, podría estar equivocado al respecto, y agradezco la corrección ...DU DEMO
Haga un directorio de prueba:
Algunos directorios secundarios:
Crea algunos archivos:
Algunos enlaces duros:
Mira los enlaces duros:
Se cuentan solo, pero sube un directorio ...
Luego ejecuté mi script de ejecución desde abajo y:
Y de Graeme:
Así que creo que esto muestra que la única forma de contar inodos es por inodo. Y debido a que contar archivos significa contar inodos, no puede contar doblemente inodos: para contar archivos con precisión, los inodos no pueden contarse más de una vez.
fuente
--inodes
¿Qué versión agregada ? ¿Qué "variantes" / "sabores" / "posix-wannabes" / "implementaciones" / lo que sea que tenga?Utilicé esta respuesta de SO Q&A titulada: ¿Dónde se usan todos mis inodes? cuando nuestro NAS se agotó hace unos 2 años:
Ejemplo
Comprobación de los inodos del dispositivo
Dependiendo de su NAS, es posible que no ofrezca un
df
comando con todas las funciones . Entonces, en estos casos, puede recurrir a usar en sutune2fs
lugar:Cruzando los límites del sistema de archivos
Puede usar el
-xdev
interruptor para dirigirfind
la búsqueda restringida solo al dispositivo donde está iniciando la búsqueda.Ejemplo
Digamos que tengo mi
/home
directorio de montaje automático a través de recursos compartidos NFS desde mi NAS, cuyo nombre es mulder.Tenga en cuenta que el punto de montaje todavía se considera local para el sistema.
Ahora cuando inicio
find
:¡No encontró
/home
ninguno de los contenidos montados automáticamente porque están en un dispositivo diferente!Tipos de sistema de archivos
Usted puede utilizar el interruptor para
find
,-fstype
para controlar qué tipo de sistemas de archivosfind
estudiará.Ejemplo
¿Qué sistema de archivos tengo?
Entonces puedes usar esto para controlar el cruce:
solo ext3
solo nfs
ext3 y ext4
fuente
/
está lleno, y tienes sistemas de archivos de red montados, no quieres sumergirte en los sistemas de archivos de red.-fstype
tofind
.-xtype
excluye los sistemas de archivos, sino que busca mirar el tipo de archivo. Solo estoy encontrando ejemplos como este:find . \( -fstype nfs -prune \)
find
cruzar los límites del sistema de archivos. En su ex. menciona "Me gusta si está lleno, y tienes sistemas de archivos de red montados, no quieres sumergirte en los sistemas de archivos de red".Comando para encontrar el inodo utilizado:
fuente
Para enumerar el uso detallado del inodo para
/
, use el siguiente comando:fuente
Definitivamente responda con la máxima cantidad de votos positivos para ayudar a comprender el concepto de inodes en Linux y Unix, sin embargo, realmente no ayuda cuando se trata de resolver el problema real de eliminar o eliminar los inodes del disco. Una forma más sencilla de hacer esto en sistemas basados en ubuntu es eliminar los encabezados e imágenes no deseadas del kernel de Linux.
Haría eso por ti. En mi caso, el uso de inodes fue del 78% debido a lo cual recibí una alerta.
Después de ejecutar el
sudo apt-get autoremove
comando se había reducido al 29%Esta fue solo mi observación que me ahorró tiempo. La gente puede encontrar una solución mejor que esta.
fuente
Me resulta más rápido y fácil profundizar usando el siguiente comando:
Luego puede ir a,
var
por ejemplo, y ver cuál es el gran inodo que usa directorios allí.fuente
Cada respuesta hasta ahora asume que el problema es con muchos archivos en un solo directorio, en lugar de muchos subdirectorios que contribuyen al problema. Afortunadamente, la solución es simplemente usar menos banderas.
O con opciones más cortas:
du --inodes -x | sort -n
. Lamentablemente, no todas las versionesdu
tienen la opción de inodes.fuente