martes, 1 de octubre de 2013

Así funcionan: sistemas de ficheros

Todos nuestros ordenadores y dispositivos móviles han de manejar alguna vez archivos y directorios. Es algo a lo que estamos suficientemente habituados como para no preguntarnos cómo funciona.
Aunque, como sabéis, de vez en cuando nos gusta profundizar en asuntos que muchas veces pasamos por alto. En esta ocasión vamos a hablar de sistemas de ficheros, piezas indispensables de todo sistema operativo de hoy, y de cómo funcionan por dentro.

Lo básico: ¿qué es un archivo y un directorio?

Desde el punto de vista de un sistema de ficheros, un archivo no es sino una colección de bytes con un formato determinado. Estos bytes, en el disco duro y a bajo nivel, se estructuran en sectores o bloques.
De hecho, es el sistema de ficheros quien se encarga de darle sentido a esa colección de bytes: almacena y controla qué bloques pertenecen a qué archivos y qué bloques no pertenecen a ningún archivo (es decir, están disponibles para ser utilizados por otros ficheros.
¿Y un directorio? Hay distintas aproximaciones para implementar este concepto en los sistemas de ficheros, aunque a grandes rasgos podríamos decir que un directorio no es más que un fichero con un formato especial. Profundizaremos en distintos sistemas de ficheros algo más adelante, en este mismo artículo.

FAT: antiguo, sencillo, limitado y robusto

FAT es un sistema de ficheros muy simple. Originalmente fue utilizado en MS-DOS, aunque su soporte perdura (con distintas actualizaciones y nuevas versiones) en todos los sistemas operativos de hoy. Esto es así porque, realmente, sigue siendo usado, sobre todo en dispositivos extraíbles no ópticos.
Pongamos un caso de uso: queremos acceder a un fichero en un directorio. Los ficheros-directorio contienen el nombre del fichero, algunos atributos extendidos (si es read-only, por ejemplo), así como el número identificador del primer clúster en el que el fichero está contenido.
Claro que habitualmente un fichero es más grande que un clúster (que apenas suele ocupar unos cuantos kilobytes). En este caso haremos uso de la llamada file allocation table: una tabla en la quese almacena el siguiente clúster a uno previamente dado. De este modo, si un fichero comienza en el clúster 5, buscaremos la entrada 5 en la FAT para conocer el siguiente clúster de ese fichero. Cuando llegamos al final la FAT pone una marca especial (algo parecido a NULL). Esta tabla es en sí también parte del sistema de ficheros, y está en una zona del disco concreta y establecida en el momento de formatearlo.
Esta tabla debería mantenerse siempre en la memoria RAM, dado que todas las lecturas de ficheros requieren acceder a ella, y pueden hacerse especialmente lentas, sobre todo cuando hablamos de acceso aleatorio (no secuencial). Esto es así porque para saber la dirección de un clúster debemos conocer la del clúster que le precede y realizar la consulta correspondiente a la FAT.
Existen distintas variantes de FAT: FAT12, FAT16, FAT32, exFAT, FATX (para sistemas Xbox). Son distintas entre sí, evidentemente, aunque el concepto principal no cambia: únicamente lo hacen algunos detalles de su implementación para adaptarse a los tiempos o a dispositivos concretos.

NTFS


NTFS es el sistema de ficheros que forma parte de la rama NT de Windows desde siempre (con distintas actualizaciones, por supuesto). Tiene muchas mejoras sobre FAT, como el hecho de utilizarjournaling, listas de control de acceso, el soporte de metadatos para cada fichero, el soporte integrado para compresión y el uso de estructuras de datos avanzadas para mejorar el rendimiento y optimizar el uso que hacemos de nuestro disco.
La madre de todo volumen formateado con NTFS es la Master File Table, una base de datos que contiene los atributos de todos los ficheros. Podríamos considerarlo similar en funciones a la FAT, aunque hace mucho más.
Cada fichero tiene asociada una entrada en la MFT que contiene una serie de atributos. Debemos distinguir entre atributos internos (almacenados en el propio registro de la MFT) y externos, que son referenciados mediante punteros en la MFT. Casi todos los atributos de cada fichero pueden ser internos o externos.
¿Qué atributos se almacenan de cada fichero? Una cabecera, que es siempre interna; un atributo con información estándar (timestamps para creación, modificación y acceso de cada fichero), así como si un fichero es de solo lectura, oculto y demás; otro atributo con el nombre del fichero (teniendo en cuenta que es posible que cada fichero tenga muchos nombres, dado que podemos realizar hard links en distintos directorios a un mismo archivo); otro atributo con los datos del propio fichero, y un descriptor de seguridad (como las listas de control de acceso).
Adicionalmente, los directorios indizan los archivos en estructuras más complejas que en el caso deFAT. De meras colecciones de registros pasamos a utilizar una estructura compleja como es el caso de un árbol B+, ofreciendo un rendimiento bastante superior en operaciones que involucren a subconjuntos de ficheros o a ficheros únicos.
La principal desventaja de NTFS es que, como podemos imaginar, la MFT puede transformarse en un verdadero monstruo (dado que controla todo el sistema de ficheros). En el momento de formatear un volumen con este sistema de fichero se reserva aproximadamente un 12,5% del tamaño del volumen para la MFT (dado que contiene que esté almacenada en zonas contiguas del disco). Esto hace de NTFS un sistema de ficheros poco adecuado para sistemas de archivos pequeños.

HFS+

El diseño del sistema de archivos por defecto de OS X es en cierto modo “similar” al de NTFS. Obviamente difieren en mucho, pero hay algunos detalles en conceptos que los hacen similares.
Por ejemplo, el catálogo. Se trata de un árbol B+ (volvemos a toparnos con esa estructura) que contiene entradas para todo fichero y directorio que esté en ese volumen.
Por lo demás es similar a todos los demás, con un detalle: cuando OS X almacena metadatos de un fichero lo hace en este catálogo. Cuando el sistema de archivos es distinto, lo suele hacer en una serie de archivos, siendo .DS_Store el más conocido.

ext

Los sistemas de archivos de Linux, particularmente ext3 y ext4, son a la vez similares y distintos a los anteriores. Son similares porque existe una estructura por cada volumen con información de los archivos. Son distintos, a su vez, por el tipo de estructura.
Es inevitable hablar de inodos: registros identificados por un número entero que contienen los metadatos de los archivos. El concepto fue acuñado por Dennis Ritchie y se trata, realmente, de una estructura de datos que contiene características de todo objeto contenido en un sistema de ficheros, salvo su nombre, que se almacena en los ficheros de directorio.
Los directorios siguen siendo ficheros especiales con registros que, en esta ocasión, contienen referencias a los inodos de los archivos que contiene. Más de un directorio puede tener referencias a un inodo concreto (lo que se llama un enlace duro o hard link).
Obviamente la estructura de inodo no es imprescindible (ReiserFS, de hecho, podría prescindir de la estructura como tal), aunque la información tendría que ser almacenada en otro sitio y el sistema tendría que seguir contando con una funcionalidad equivalente, aunque no existieran los inodos “como ente”.

No hay comentarios:

Publicar un comentario