¿Por qué la tabla de inodo no suele ser redimensionable?

19

Los sistemas de archivos Unix generalmente tienen una tabla de inodo, y el número de entradas en esta tabla generalmente se fija en el momento en que se crea el sistema de archivos. Esto a veces lleva a las personas con mucho espacio en el disco a recibir mensajes de error confusos sobre la falta de espacio libre, e incluso después de descubrir cuál es el problema, no hay una solución fácil para qué hacer al respecto.

Pero parece (para mí) que sería muy deseable evitar todo este desorden asignando inodos bajo demanda, de forma totalmente transparente a los usuarios y administradores de sistemas. Si te gustan los hacks lindos, incluso podrías hacer que la tabla de inodo sea un archivo, y así reutilizar el código que ya tienes que encuentra espacio libre en el disco. Si tiene suerte, incluso podría terminar con los inodos cerca de los archivos mismos, sin tratar explícitamente de lograr este resultado.

Pero nadie (que yo sepa) realmente hace esto, por lo que probablemente haya una trampa que me estoy perdiendo. ¿Alguna idea de lo que pueda ser?

Mark VY
fuente
44
Acaba de reinventar el Directorio de archivos maestros y el Índice de archivos-11 en VMS, el precursor de la Tabla de archivos maestros en NTFS.
JdeBP
¿Reinventé el precursor de la MFT? ¡Frio!
Mark VY

Respuestas:

26

Digamos que hizo que la tabla de inodo sea un archivo; entonces la siguiente pregunta es ... ¿dónde almacena información sobre ese archivo? Por lo tanto, necesitaría inodes "reales" e inodes "extendidos", como una tabla de particiones de MS-DOS. Dado, solo necesitaría uno (o tal vez algunos, por ejemplo, para que su diario sea un archivo). Pero en realidad tendrías casos especiales, código diferente. Cualquier corrupción en ese archivo también sería desastrosa. Y tenga en cuenta que, antes de escribir en el diario, era común que los archivos se escribieran, por ejemplo, cuando se cortó la electricidad y sufrieron daños graves. Sus operaciones de archivo tendrían que ser mucho más robustas frente a fallas de energía / bloqueo / etc. de lo que estaban, por ejemplo, ext2.

Los sistemas de archivos tradicionales de Unix encontraron una solución más simple (y más robusta): coloque un bloque de inodo (o grupo de bloques) cada bloque X. Luego los encuentras por simple aritmética. Por supuesto, entonces no es posible agregar más (sin reestructurar todo el sistema de archivos). E incluso si pierde / corrompe el bloque de inodo en el que estaba escribiendo cuando falló la alimentación, eso solo está perdiendo unos pocos inodes, mucho mejor que una parte sustancial del sistema de archivos.

Los diseños más modernos usan cosas como las variantes del árbol B. Los sistemas de archivos modernos como btrfs, XFS y ZFS no sufren límites de inodo.

derobert
fuente
2
Cuando dice "no sufrir límites de inodo", ¿eso significa que los nuevos inodes se asignan completamente detrás de escena, o alguien necesita ejecutar un comando como "expand-table-now-please"?
Mark VY
3
@MarkVY completamente detrás de escena (si los inodos se usan realmente).
derobert
Bien, entonces mi conocimiento está muy atrasado aparentemente. Gracias por la respuesta detallada. Nunca pensé en lo que sucedería en caso de pérdida de potencia o similar. Entonces, mi lindo truco es bastante peligroso a menos que "agregar a archivo" ya sea una operación atómica en el sistema de archivos. Lo que afirmas fue bastante raro en los viejos tiempos.
Mark VY
Recuerdo XFS y Btrfs muy de vez en cuando sufren de la corrupción del sistema de archivos leve - ZFS también? No es un riesgo para algunos, pero podría ser un riesgo para datos importantes y el costo de la asignación dinámica. Para XFS en esta tienda, su problema decisivo era la incapacidad total de reducir un sistema de archivos por cualquier medio.
user2066657
Btrfs puede no sufrir límites de inodo, pero sufre de una falla completamente diferente que causa síntomas igualmente confusos (básicamente, se queda sin espacio de metadatos mientras todavía tiene suficiente espacio de datos disponible, debido al uso ineficiente de grupos de bloques). Esto no solo hace que informe errores de disco lleno cuando dfinforma mucho espacio disponible, sino que no se puede solucionar eliminando archivos porque eliminar un archivo requiere asignar espacio de metadatos.
Marcar el
17

Muchos sistemas de archivos tienen una tabla de inodo asignable dinámicamente (o su equivalente moral) (XFS, BTRFS, ZFS, VxFS ...)

Sin embargo, el Unix UFS original tenía inodos que se arreglaron en el momento de la creación del sistema de archivos y los sistemas de archivos derivados de él (Linux EXT, Solaris UFS) a menudo continuaron el esquema. Es robusto y más sencillo de implementar. Tantos casos de uso encajan bien, que diseñar un nuevo sistema de archivos solo para evitar ese problema no es fácil de justificar.

BowlOfRed
fuente
Sin embargo, las personas que han resuelto problemas que no son fáciles de justificar han logrado mucho progreso en la informática.
user253751
2
Pero también, mucho progreso en soluciones no fáciles de resolver :) Los primeros sistemas de archivos "complejos" - NT era NTFS, reiserfs - tenían una forma de fallar catastróficamente CUANDO fallaban ...
rackandboneman el
6

Hay sistemas de archivos que asignan inodos dinámicamente: fuera de mi cabeza, al menos Veritas VxFS (= el sistema de archivos predeterminado de HP-UX, y una de las opciones disponibles en Solaris) y XFS (el tipo de sistema de archivos estándar en RHEL 7) funcionan de esa manera. Btrfs y JFS de IBM también.

telcoM
fuente