¿Cómo puedo aumentar el número de inodes en un sistema de archivos ext4?

61

Tuve un problema (nuevo para mí) la semana pasada. Tengo un sistema de archivos ext4 (Fedora 15). La aplicación que se ejecuta en el servidor se detuvo de repente. No pude encontrar el problema a primera vista.

dfmostró 50% de espacio disponible. Después de buscar durante aproximadamente una hora, vi una publicación en el foro donde usaba el tipo df -i. La opción busca el uso de inodes. El sistema estaba sin inodos, un problema simple que no me di cuenta. La partición tenía solo 3.2M inodos.

Ahora, mis preguntas son: ¿Puedo hacer que el sistema tenga más inodos? ¿Debe / puede establecerse al formatear el disco? Con los inodos de 3.2M, ¿cuántos archivos podría tener?

piovisqui
fuente
1
Cada archivo o directorio usa un inodo. Un enlace duro a un archivo no crea un inodo. en.wikipedia.org/wiki/Inode
Paul Tomblin

Respuestas:

33

Parece que tiene muchos más archivos de lo esperado.

No sé si hay una solución para cambiar el tamaño de la tabla de inodo dinámicamente. Me temo que necesita hacer una copia de seguridad de sus datos, crear un nuevo sistema de archivos y restaurar sus datos.

Para crear un nuevo sistema de archivos con una tabla de inodos tan grande, debe usar la opción '-N' de mke2fs (8).

Recomiendo usar primero la opción '-n' (que no crea la fs, pero muestra la información útil) para que pueda obtener el número estimado de inodes. Luego, si es necesario, use '-N' para crear su sistema de archivos con un número de inodo específico.

cinsk
fuente
11
Puede usar mke2fs -ipara especificar el número de inodes. Su documentación indica que "no es posible expandir el número de inodos en un sistema de archivos después de que se crea".
Gilles 'SO- deja de ser malvado'
2
@piovisqui: cada archivo consume en inodo, que es un puntero en el sistema de archivos. Si el archivo es un enlace duro a otro archivo, tiene el mismo inodo.
Hanan N.
66
@Gilles Las -iopciones especifican el tamaño del inodo, no cuántos hay. La -Nopción establece el número de inodos.
theillien
1
La relación entre inodes y números de archivo no es necesariamente 1: 1. El primer inodo contiene una lista de punteros a bloques donde se almacena el archivo. Si la lista de bloques no puede caber dentro de un inodo, entonces el inodo contiene una lista de punteros a inodes que enumeran los bloques donde se almacena el archivo. Si no cabe allí, entonces va 3 juegos de inodos de profundidad para esa lista de bloques, etc.
StuWhitby
2
@StuWhitby Eso no está del todo bien. Un inodo simple tiene varios punteros directos y un puntero indirecto simple, doble y triple. Si la lista de bloques no puede caber en los punteros directos, entonces el puntero indirecto único apuntará a un bloque de datos (NO otro inodo) que contenga más punteros. Si se necesitan más punteros que eso, el puntero doble indirecto apunta a un bloque que contiene punteros indirectos simples, y el triple indirecto en un bloque con punteros indirectos dobles. Entonces, un archivo, de hecho, solo usa un inodo, independientemente del tamaño.
user125355
11

Como otra solución alternativa, podría sugerir considerar empaquetar grandes colecciones de archivos en un tararchivo comprimido (!) Y luego usarlo archivemountpara montarlo como un sistema de archivos. Un archivo tar es mejor para compartir que una imagen del sistema de archivos y proporciona un rendimiento similar al realizar copias de seguridad en una nube u otro almacenamiento.


Si se supone que la colección es de solo lectura, squashfspuede ser una opción, pero requiere ciertas opciones habilitadas en el kernel, y la xzcompresión está disponible para tar también con el mismo rendimiento.

tijagi
fuente
2
Buena sugerencia
piovisqui
11

Con 3,2 millones de inodes, puedes tener 3,2 millones de archivos y directorios, en total (pero los enlaces duros múltiples a un archivo solo usan un inodo).

Sí, se puede configurar al crear un sistema de archivos en la partición. Las opciones -T usage-type, -N number-of-inodeso -i bytes-per-inodepueden establecer el número de inodos. Generalmente uso -i, después de comparar la salida de du -sy find | wc -lpara una colección similar de archivos y permitir un poco de holgura.

No, no se puede cambiar in situ en un sistema de archivos existente. Sin embargo:

  • Si está ejecutando LVM o el sistema de archivos está en el LUN de una SAN (ya sea directamente en el LUN o como la última partición en el LUN), o si tiene un espacio vacío en el disco después de la partición, puede aumentar la partición y luego use resize2fspara expandir el sistema de archivos. Esto agrega más inodos en proporción al espacio agregado, aproximadamente. Si desea evitar quedarse sin inodos antes del espacio, suponiendo que los archivos futuros en promedio tengan aproximadamente el mismo tamaño, establezca un porcentaje de bloque reservado lo suficientemente alto usando tune2fs -m.
  • Si tiene suficiente espacio y puede desconectar el sistema de archivos, desconéctelo, cree un nuevo sistema de archivos con más inodos y copie todos los archivos.
  • Si solo un subconjunto de los archivos está utilizando muchos de los inodos y tiene suficiente espacio libre, cree un sistema de archivos en un dispositivo de bucle respaldado por un archivo en el sistema de archivos, cree un sistema de archivos con más inodos (y quizás también bloques más pequeños) en él, y mover los directorios ofensivos en él. Probablemente sea un golpe de rendimiento y una molestia de mantenimiento, pero es una alternativa.
  • Y, por supuesto, si puede eliminar muchos archivos innecesarios, eso también debería ayudar.
david
fuente
6

Tengo soluciones alternativas para esta situación. Digamos que tienes 1000 inodos en una partición de 10G. Pero debido al límite de inodes no se supone que use todo el espacio de partición . Pero en estas soluciones podrá utilizar el espacio restante de la partición sin formatearla .

$ df -i  # see list ( I need just one free inode here so move just one file into other PARTITION)
/dev/part1  1000 999 1 99.9%     /data

$ dd if=/dev/zero of=/data/new_data
$ mkfs.ext4 /data/new_data
$ mkdir /data1
$ mount /data/new_data /data1

para montaje permanente

$ echo "/data/new_data /data1 ext4 defaults 0 1" >> /etc/fstab
SANJEET
fuente
2
Bienvenido a U&L. Me tomé la libertad de volver a formatear su respuesta a la representación más habitual del código aquí, insertando un prompt ( $) para distinguir claramente entre comandos y resultados (si solo fueran comandos, el prompt normalmente se omite). También cambié los GRITOS en el énfasis de la fase en negrita, que es lo que creo que pretendías. Puede revertir los cambios si tergiversé las cosas
Anthon,
Creo que esta solución tiene lógica, pero debe administrar el tamaño cuando ejecuta dd.
piovisqui
3
Los detalles son incorrectos, necesitaría usar un dispositivo de bucle, y tal vez incluso unionfs dependiendo de la aplicación, pero esta es la única solución que evita el formateo y la restauración de la copia de seguridad, lo que no es divertido cuando tiene prisa con millones de archivos. ¡Hay circunstancias en las que esto podría salvar el día!
medoc
6

Recientemente me encontré con este problema al usar apt o aptitude upgrade.

df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  5.1G  2.3G  70% /

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 521497   2791  100% /

Comando emitido:

du /|sort -k1 -n

Revelado, la mayoría de los archivos estaban en subcarpetas para varias versiones de kernel dentro de:

/usr/src/linux-headers

Se eliminaron esas subcarpetas y se solucionó el problema del inodo.

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 104986 419302   21% /
kph0x1
fuente
¿"du / | sort -k1 -n" muestra inodes?
Huérfanos el
No. Eso fue para ordenar los directorios, mostrando cuáles tenían la mayoría de los archivos en ellos, carpetas que consumían muchos inodes pero menos uso de espacio real: la situación de 30% de espacio libre en disco pero 100% de uso de inodo que se muestra arriba.
kph0x1
Sinceramente, no entiendo cómo "du" muestra cuántos archivos hay con alguna bandera. ¿Podría por favor explicar más en detalle?
Huérfanos el
No hay banderas para el ducomando. El uso es para la raíz del sistema de archivos en el ejemplo anterior, mirando solo el espacio. La salida se canaliza para ordenar para mostrar qué directorios contienen la mayoría de los archivos. No se realizó un recuento en el ejemplo anterior para los archivos, la parte de "cuántos archivos" de su pregunta. Sin duembargo, los de origen del núcleo fueron los culpables que se muestran en la salida; por ejemplo, muchos archivos pequeños, subcarpetas de compilaciones pasadas, lo que es ideal para eliminar con el fin de liberar inodos. Todavía queda un manual, la revisión humana de la dusalida, /usr/src/linux-headersera entonces obvia.
kph0x1
1
du muestra SOLO bytes, no archivos. Y está canalizando la salida solo desde el comando du en orden. Entonces, ¿cómo sort -k1 -n ordena la salida de la manera que propusiste? Lo único que puedo ver es que "du / | sort -k1 -n" solo ordena cada fila en función del tamaño en bytes. Nada más
Huérfanos
2

pruebe du -s --inodes * 2>/dev/null |sort -gel cd en el último directorio de salida y repita.

Divulgación completa: no todos los sistemas operativos son compatibles --inodescon el comando du command (mi Mac OS no), pero muchos sistemas operativos Linux sí.

Otto Leichliter
fuente