¿Por qué el kernel de Linux informa "sin espacio en disco" cuando en realidad no tiene i-nodos

10

Un amigo mío al que le gusta programar en el entorno Linux, pero no sabe mucho sobre la administración de Linux, recientemente se encontró con un problema en el que su sistema operativo (Ubuntu) informaba "sin espacio en disco en el volumen XXX". Pero cuando fue a verificar el volumen, todavía quedaban 700 GB. Después de perder mucho tiempo, finalmente pudo darse cuenta de que se había quedado sin inodos. (Estaba almacenando muchas pequeñas actualizaciones incrementales de un sistema de respaldo en este volumen y se quemó a través de todos sus inodos).

Me preguntó por qué el kernel de Linux informó el mensaje de error ("sin espacio en disco") en lugar de informar correctamente ("sin inodos"). No lo sabía, así que pensé en preguntarle a StackExchange.

Alguien sabe por qué pasa esto? ¿Y por qué no se ha solucionado después de todos estos años? (Recuerdo que un amigo diferente me contó sobre este problema en 1995).

Galleta salada
fuente

Respuestas:

18

Se ENOSPCutiliza un solo número de error, para informar ambas situaciones, de ahí el mismo mensaje de error.

Para mantener el cumplimiento de los estándares ISO Cy POSIX, los desarrolladores del kernel no tienen más remedio que usar un único número de error para ambos eventos. Agregar un nuevo número de error rompería los programas existentes.

Sin embargo, como apegarse a los mensajes de error tradicionales no es obligatorio para AFAIK, nada debería prohibir a un desarrollador que aclare el mensaje individual, como por ejemplo out of disk/inode space

Técnicamente, si estar fuera del espacio de inodo o fuera del espacio de datos es lo mismo, es decir, no hay suficiente espacio libre en el disco para que la llamada del sistema tenga éxito.

Supongo que no te ibas a quejar si tu disco se informa como lleno mientras todavía hay ranuras de inodes libres.

Tenga en cuenta que los sistemas de archivos como JFS, XFS, ZFSy btrfsasignan dinámicamente inodos también lo hacen no presentan este problema más.

jlliagre
fuente
Los sistemas de archivos recientes incluyen ext4?
Camilo Martin
@CamiloMartin No creo que lo haga.
jlliagre
@CamiloMartin Desafortunadamente no, ext4asigna inodes en el momento de la creación de fs como ext2 / 3 y no puede modificarse más tarde.
Matt
@mindthemonkey ¡Maldición! Probablemente sea algo de compatibilidad con versiones anteriores, supongo. ¿Qué otro sistema de archivos tiene buenas características pero es lo suficientemente estable (es btrfs estable)? ext4 parece ser una especie de "opción predeterminada" (al menos desde mi perspectiva de novato).
Camilo Martin
1
Sí, las extensiones siempre han sido extensiones de la versión anterior y compatibles con versiones anteriores, por lo que no hay cambios importantes, pero eso significa que se mantuvo bastante sólido y estable. Yo personalmente hago todo mi almacenamiento de gran volumen en cajas freebsd con ZFS. BTRFS todavía se considera "inestable", aunque la mayoría de las distribuciones al menos le permitirán usarlo.
Matt
2

Supongo que su amigo está usando una extensión fs, porque es una de las pocas f sensibles que pueden quedarse sin inodos.

Al parecer, tu amigo jugueteó con su sistema de archivos y lo rompió o tiene un volumen ridículamente grande de varios TB. Los inodos no son una cosa de usar una vez y tirar. Si realmente se quedó sin inodos, significa que tiene ridículamente muchos archivos y directorios ... lo que puede suceder en un volumen> 4TB (conjetura educada), donde "solo" 700GB son gratuitos. Para la familia ext de fs, el número de inodes se determina cuando se crea fs. Desde la mkfs.ext4página del manual:

-i bytes-per-inode
          Specify  the  bytes/inode ratio.  mke2fs creates an inode for every bytes-per-inode
          bytes of space on the disk.  The larger the bytes-per-inode ratio, the fewer inodes
          will  be  created.  This value generally shouldn't be smaller than the blocksize of
          the filesystem, since in that case more inodes would be made than can ever be used.
          Be  warned  that  it is not possible to expand the number of inodes on a filesystem
          after it is created, so be careful deciding the correct value for this parameter.

Para acortar el resto de esta respuesta: Esto significa que mkfsse le proporciona dicha proporción o asumirá una. Si su amigo usa fs de manera diferente a la asumida, la proporción elegida puede ser incorrecta para su caso de uso y obtiene ese error ... llenar un solo volumen de TB múltiple con toneladas de archivos pequeños puede contar como tal.

¿Utiliza su amigo algún entorno de escritorio que implemente el concepto de "bote de basura" para archivos o cualquier otra forma de copia de seguridad que pueda crear grandes cantidades de archivos? Tal vez pueda solucionar su problema simplemente deshaciéndose de los archivos innecesarios.

Recuerdo este problema con ext2 desde el momento en que el kernel 2.4 era bastante nuevo. Como regla general, siempre uso XFS para volúmenes que son muy grandes en comparación con lo que actualmente es común. Actualmente, llamaría a todo entre 250GB a 1TB común para un solo volumen y podemos comprar discos duros de 4TB. Entonces, para todo> 3 TB, prefiero usar XFS que ext. Solo una regla general, pero no se ha quedado sin inodes durante mucho tiempo ...

Bananguin
fuente
1
Me temo que no está respondiendo a la pregunta formulada.
jlliagre
Cierto. Estaba tratando de responder la primera pregunta en línea que presioné "¿Alguien sabe por qué sucede esto?", Pero no la del título.
Bananguin
Derecha. Mi amigo sabe lo que pasó. Estaba haciendo algún tipo de sistema de respaldo donde almacenaba cambios incrementales sin comprimir (ni TAR) para que todos estos pequeños archivos ocuparan espacio. No creo que haya tenido un FS tan grande anteriormente, por lo que quedarse sin inodos fue algo nuevo para él. Ergo, se sintió frustrado cuando escribió "df -h" y pensó: "huh, todavía me queda mucho espacio". Francamente, estoy de acuerdo con él. Para el núcleo decir "sin espacio", cuando en realidad debería tener un mensaje separado "sin inodos" es muy confuso.
Pretzel
@Bananguin - ¿Sabes cuál es la relación byte / inode predeterminada?
Pretzel
@Pretzel: Creo recordar que el valor predeterminado es un inodo por cada 4k. Acabo de comprobar mi computadora ( tune2fs -l /dev/sda1) y tengo una relación de 1 inodo por cada cuatro bloques y cada bloque tiene un tamaño de 1k. Sin embargo, no sé cuánto se puede considerar "predeterminado".
Bananguin