23 de noviembre de 2013

¿Qué es un inodo?

En UNIX, el inodo es la estructura guarda la información del archivo, como la fecha de creación, el usuario que es dueño del archivo, su tamaño e información sobre dónde se encuentran físicamente los bloques de datos que guardan los bytes de ese archivo en el disco, para que cuando se tenga que leer o escribir en él el sistema operativo sepa dónde apuntar con la aguja en el disco duro. No contiene ningún nombre, pese a lo que inicialmente puedas pensar. En su lugar, un inodo se identifica por un número; cada archivo tiene un número de inodo distinto.

La estructura del inodo también contiene información sobre el tipo de archivo que tiene el inodo. El tipo de archivo no es el tipo que podemos pensar de "archivo de texto", "imagen", "archivo de música". En realidad, el tipo de archivo hace referencia a si es un archivo de datos normal, a una carpeta, a un enlace simbólico... Por ejemplo, la carpeta es un tipo de archivo más con una entrada en la tabla de inodos. La diferencia es que cuando el sistema ve que es de tipo carpeta lo trata de forma especial y no como si fuera otro archivo.



Si un inodo no guarda el nombre, ¿cómo sabe UNIX el nombre de los archivos y por qué nos lo muestra cuando usamos el gestor de archivos o el comando ls? La respuesta es: porque el nombre se guarda dentro del bloque de datos de la carpeta en el disco duro. El contenido de una carpeta, que para nosotros es una lista de archivos, para el ordenador es una tabla que guarda para cada archivo que contenga dos cosas: el nombre que va a tener ese archivo, y el número de inodo que habrá detrás de ese nombre.

Un disco duro UNIX contiene dos partes principales: una tabla de inodos, que es un área donde el ordenador puede rellenar información sobre distintos inodos. En un disco duro normal hoy en día caben millones de inodos. Otra parte principal es el área de bloques de datos donde se guardan los bloques de datos de los distintos archivos que haya en el disco duro.

Por ejemplo, supongamos que tenemos una carpeta que tiene tres archivos: carta.txt, foto.jpg y cancion.mp3. Dentro de la tabla de inodos, habrá una entrada para esta carpeta que tendrá información como la siguiente:

Número de inodo = 12500 (por ejemplo)
Tipo de archivo = Carpeta
Dirección del bloque de datos = ...


En el bloque de datos (donde se guardan los bytes reales de los archivos del ordenador) de esta carpeta, se encuentra la siguiente información:

.           12500
..           6000
carta.txt   12510
foto.jpg    12525
cancion.mp3 12670


Como se ve, dentro de la carpeta se encuentran los nombres de los archivos. Realmente, en la estructura de inodos, sólo existen números. Concretamente, los tres archivos que hay en la carpeta son el inodo 12510, el inodo 12525 y el inodo 12670. Es la carpeta quien se encarga de nombrar un inodo.

Probablemente te hayas fijado en los archivos . (punto) y .. (doble punto) y en los inodos a los que apunta el archivo. El archivo . (punto) apunta a la propia carpeta, por eso su inodo es 12500, como la propia carpeta. El archivo .. (doble punto) apunta a la carpeta superior, es decir, la carpeta en la que esta carpeta esté introducida. Es decir, que el archivo 6000 es otra carpeta, que dentro tendrá definido un archivo que apunte también al inodo 12500.

Al principio puede parecer un lío, pero cuando se analiza detenidamente, la forma en la que UNIX guarda sus archivos es curiosa y muy bien estructurada. Como extra, si tienes curiosidad por saber cuál es el número de inodo de los archivos de tu ordenador puedes usar el comando ls -i. Si usas el flag -i, junto a cada archivo te mostrará su número de inodo.