miércoles, 3 de agosto de 2011

Entendiendo lo básico ¿que cosa es un inode?

Este es muy básico, pero si les interesa es un punto de partida. Al final les dejo algunos otros recursos por si quieren seguir. El concepto de inode (el articulo no lo dice pero según Prabhat K. Andleigh, viene de "index node") es primario para la comprensión del funcionamiento de los sistemas de archivos *nix, sobre todo si lo que ud conoce es NTFS. Creo que para los que inician es válido. El original es de Linux Magazine. . Sustituí la imagen original de la ejecución del "ls -li" por una que hice en un FreeNAS que administro (con doble intención, aquí todo el tiempo hablan de Linux, pero el inode y la estructura implícita es común a todos los *nix, o al menos hasta donde yo se). No hay mas, así que aquí les va y provecho!


Entendiendo lo básico, ¿que cosa es un inode?
Como te habrás dado cuenta, nos encanta hablar de los sistemas de archivos. En estas discusiones, empleamos a menudo el término "inode"
. Pero, ¿qué es un inode y cómo se relaciona con un sistema de archivos? Me alegro que lo pregunten.
En las páginas electrónicas de Linux Magazine, los sistemas de archivos son comúnmente discutidos. Es un hecho! En estas discusiones se puede ver el término "inodo" usado para referirse a un sistema de archivos. Bastante a menudo la gente la pregunta, "¿qué es un inode?" para que puedan entender la discusión (recuerde, no existen las preguntas tontas - al menos en su mayor parte).

Para muchas de las personas que leen estos artículos sobre almacenamiento esto puede parecer una pregunta elemental, pero para muchas personas que recién se inician en Linux, este concepto puede ser extraño. Además de que siempre es bueno revisar el concepto, pero mantengamos cualquier comentario civilizado y constructivo (especialmente si están dirigidos al autor). Permítanme también decirles que no soy experto en sistemas de archivos así que, por favor, pueden corregir cualquier error, indicando así mismo las referencias, para que la gente de lea los comentarios puedan explorar el tema.

Los sistemas de archivos, en general, tienen dos partes: (1) los metadatos, o los "datos" sobre los datos, y (2) los datos en sí. La primera parte, los metadatos, pueden sonar graciosos, ya que son datos acerca de los datos, pero este es un componente clave de los sistemas de archivos. Se compone de información sobre los datos. Más precisamente, incluye información como el nombre del archivo, la fecha en que se modificó el archivo, el propietario del archivo, los permisos de archivos, etc Este tipo de información es clave para un sistema de archivo pues de otra manera sólo tendríamos un puñado de bits en los medios de almacenamiento sin mucho significado. Los inodes (o nodos-i)(*) almacenan esta información de metadatos y por lo general también almacenan información sobre dónde se encuentran los datos en el medio de almacenamiento.

Inodo.
En general para los sistemas de archivos *nix, hay un inode asociado a cada archivo o directorio. Como se mencionó anteriormente, aquí es donde se almacenan los metadatos y el inode es representado típicamente como un número entero. El origen del término inode no se sabe con certeza. Desde la página de wikipedia sobre los inodes, uno de los creadores originales de Unix, Dennis Ritchie, dice lo siguiente sobre el origen del término inode:

...En verdad, yo tampoco lo sé. Fue sólo un término que empezamos a utilizar. "Índice" es mi mejor estimación, debido a la estructura un poco inusual del sistema de archivos que almacena la información de acceso de los archivos como un conjunto plano en el disco, con toda la información jerárquica de directorios existiendo al margen de este. Así, el i-número es un índice de este arreglo, y el i-nodo es el elemento seleccionado de la matriz. (La notación "i-" se utilizó en la primera edición del manual, pero el guión fue abandonado poco a poco.)

¿Cómo se crean los inodos e incluso si son creados, depende del sistema de archivos específico. Varios sistemas de archivos crean todos los inodos cuando el sistema de archivos mismo es creado lo cual resulta en un número fijo de inodos. Por ejemplo, ext3 es un sistema de archivos que hace esto. El resultado es que el sistema de archivos tiene un número determinado de archivos que pueden almacenarse. Sí - en realidad es posible tener la capacidad en el medio de almacenamiento y no ser capaz de almacenar más datos (no sucede a menudo, pero en teoría es posible). Si necesita más inodos tendrá que rehacer el sistema de archivos perdiendo todos los datos en el mismo.
Una forma de evitar la trampa del número fijo de inodes es algo utilizado por algunos sistemas de archivos y que es llamado localización y / o extensión dinámica a de inodos. Estos sistemas de archivos, básicamente, puede hacer crecer el sistema de archivos y / o aumentar el número de inodos.

Los inodos no son algo misterioso a lo que debe temer, sino algo que es parte de Linux. Por ejemplo, ud puede ver los inodos de sus archivos simplemente usando la opción "-i" en el comando "ls". Por ejemplo:

Clic para ampliar.
El número de la izquierda es el número de inodo asociado con el archivo. Observe también que hay un directorio "TRIM_WORKS" que también tiene un inodo asociado. Cada vez que se crea o destruye un archivo o directorio se crea o destruye un inodo.

Recuerde que, en general, Linux es compatible con POSIX, lo que requiere ciertos atributos de archivo. En particular,

  • El tamaño del archivo en bytes
  • ID de dispositivo
  • ID de usuario del archivo
  • ID de grupo del archivo
  • El modo de archivo que determina el tipo de archivo y la forma en que el propietario, grupo y otros (el resto) pueden acceder al archivo
  • Banderas adicionales de sistema y usuario para proteger aún más el archivo (nota: esto puede ser usado para limitar el uso y modificación de los archivos)
  • Marcas de tiempo que especifican cuando ha sido modificado por última vez el inodo mismo (ctime, "change time"), cuando el contenido del archivo fue modificado por última vez (mtime "modification time"), y cuando fue accedido el archivo por última vez (atime "access time")
  • Un contador de enlace que indica cuántos enlaces duros apuntan al inodo
  • Punteros a los bloques del disco que almacenan el contenido del archivo (más sobre esto adelante)
Cualquier sistema de archivos de Linux que sea compatible con POSIX debe tener esta información contenida en el inodo para cada archivo o ser capaz de reproducir esta información como si hubieran inodos. Por ejemplo, ReiserFS no usa inodos tradicionales. En lugar de metadatos, entradas de directorios, listas de bloques de inodos (más sobre esto más adelante), y colas de archivos todo se encuentra en una única combinación de árbol B+ regido por un ID universal de objeto. Así pues ReiserFS tiene que proporcionar información POSIX cuando se le pregunta si se considera compatible con POSIX.


Estructura del puntero del inodo.
En la definición del estándar POSIX de un sistema de archivos, hay un elemento en el inodo llamado estructura de puntero del inodo Recuerde que el inodo sólo almacena información de metadatos incluida una clase de lista de los bloques donde se almacenan los datos en el medio de almacenamiento. La estructura del puntero del inodo es la estructura de datos universalmente utilizada en el inodo para listar los bloques (o bloques de datos) asociados con el archivo.

Según el artículo de wikipedia, la estructura suele tener 11 o 13 punteros, pero los sistemas de archivos más modernos utilizan 15 indicadores almacenados en la estructura de datos. De Wikipedia, para el caso donde hay 12 punteros en la estructura de datos, los punteros son:

  • Doce punteros que apuntan directamente a los bloques que contienen los datos del archivo. Estos se llaman punteros directos.
  • Un puntero indirecto único. Este puntero apunta a un bloque de punteros que apuntan a bloques que contienen los datos del archivo.
  • Un puntero doblemente indirecto. Este puntero apunta a un bloque de punteros que apuntan a su vez a otros bloques de punteros que apuntan a bloques que contienen los datos del archivo.
  • Un puntero triplemente indirecto. Este indicador apunta a un bloque de punteros que apuntan a otros bloques de punteros que apuntan a otros bloques de punteros que apuntan a bloques que contienen los datos del archivo.
Para facilitar las cosas, la Figura 1 de la wikipedia, muestra los diferentes tipos de punteros.
Figura 1: Estructura puntero del inodo (De Wikipedia, Wikimedia Commons)
En la figura se puede ver los indicadores directos, indirectos, y doblemente indirectos. Un puntero triplemente indirecto es similar al puntero doblemente indirecto con otro nivel de punteros entre los bloques de datos y el inodo.


Resumen
El concepto de un inodo es bastante fundamental para los sistemas de archivos en Linux y otros sistemas operativos * nix. Conceptualmente un inodo es bastante fácil de entender - es sólo los metadatos de los datos. Esto es, contiene información acerca de los datos en sí que es muy útil. Por ejemplo, puede contener el dueño del archivo y el grupo del archivo, los permisos de los archivos, y varias marcas de tiempo. Así que cuando se ejecutan comandos en Linux, como un "ls", los metadatos de todos los inodos utilizados son escaneados y la información se recopila y presenta al usuario.

Algunos sistemas de ficheros tales como ext3 crean todos los inodos cuando el sistema de archivos es creado. Por lo tanto, es posible quedarse sin espacio de almacenamiento si todos los inodos son usados​, aun cuando el medio de almacenamiento todavía tenga capacidad sin utilizar. Para ayudar a solucionar esto otros sistema de archivos como ext4 o xfs, crean inodos, según sea necesario.
La comprensión del concepto de un inodo puede serle de mucha utilidad. Armado con los conceptos básicos de inodos ud puede examinar los distintos sistemas de archivos y determinar cuál es el mas adecuado para usted. También puede utilizar el concepto de un inodo para entender por qué algo tan simple como "ls -l" toma tanto tiempo. Sugerencia - vea la cantidad de archivos que tiene y cuántos inodos deberá consultar "ls" para recopilar la información.



(*)- En inglés "inode" lo pueden encontrar así mismo en español, o como "nodo-i", o aún inodo aquí lo usamos indistintamente (NDT) Regresar.
Recursos adicionales.
1.- Arquitectura de sistemas Unix. Prabhat K. Andleigh
2.- Busquen las fuentes (si están en Linux aquí tienen un punto de partida inmejorable). Si están en FreeBSD solo tienen que descargar las fuentes del sistema y revisar las implementaciones correspondientes de la parte del filesystem, es denso pero ¿querían seguirle?. :-)