Atlasingeniería

Arquitectura y sistemas operativosSistemas operativosTema 6

Sistemas de archivos

Un disco es un arreglo de bloques numerados. Convertirlo en carpetas, nombres y permisos —y que sobreviva a un corte de luz en la mitad de una escritura— es el trabajo del sistema de archivos.

Para este tema conviene tener claro:Buses, interrupciones y E/S

El disco no sabe qué es una carpeta. Ofrece bloques numerados que se leen y se escriben, y nada más. Toda la estructura de nombres, jerarquías, permisos y tamaños es una convención que el sistema de archivos mantiene arriba de eso.

El inodo y el nombre, que son cosas distintas

La pieza central en los sistemas tipo Unix es el inodo: una estructura con todos los metadatos de un archivo —tamaño, permisos, dueño, fechas— y los punteros a sus bloques de datos. Lo que no contiene es el nombre.

El nombre vive en el directorio, que es un archivo que asocia nombres a números de inodo. Esa separación explica los enlaces duros: dos nombres, el mismo inodo, el mismo archivo. Y explica por qué borrar es en realidad quitar un nombre: el archivo desaparece cuando no quedan nombres ni procesos con él abierto.

El directorio es una tabla de nombres a inodos. «notas.txt» vive en el inodo 42, que tiene un solo enlace.

1 / 5
Mirá el contador de enlaces del inodo 42 mientras aparecen y desaparecen nombres. Borrar un nombre no borra el archivo: le resta uno al contador. El archivo se va cuando el contador llega a cero, y no antes.

Antes de seguir, predecí

Borrás un archivo de 2 GB. ¿Cuántos datos escribe el sistema?

Cómo se ubican los bloques

Los bloques de un archivo hay que ubicarlos. La asignación contigua da lecturas rápidas y sufre fragmentación. La enlazada evita ese problema y hace imposible el acceso aleatorio eficiente.

La solución clásica es indexada con varios niveles: el inodo tiene punteros directos a los primeros bloques, y después punteros indirectos a bloques que contienen más punteros. Así los archivos chicos se resuelven en un acceso y los grandes siguen siendo posibles. Los sistemas modernos usan extents: rangos contiguos descritos por inicio y largo, más compactos para archivos grandes.

El problema difícil es el corte de luz

El problema difícil es la consistencia. Crear un archivo implica varias escrituras —el inodo, el directorio, el mapa de bloques libres— y un corte de luz en el medio deja el sistema en un estado imposible: bloques marcados como usados sin dueño, o un nombre apuntando a un inodo vacío.

La respuesta es el journaling: antes de tocar las estructuras, se escribe en un registro qué se va a hacer. Al reiniciar, se relee ese registro y se rehace o descarta lo que quedó a medias. Es la misma idea que el log de una base de datos.

El journaling tiene grados

El journaling tiene grados. Registrar sólo los metadatos es lo habitual: rápido, y garantiza que la estructura quede consistente aunque el contenido de un archivo pueda quedar a medio escribir. Registrar también los datos es más seguro y más lento.

Esa distinción explica un caso que confunde: después de un corte, el sistema de archivos está sano pero un archivo quedó truncado o lleno de ceros. No es una contradicción: la consistencia prometida era la de la estructura.

Escribir no es guardar

Escribir no es guardar. Una escritura va a la caché de páginas y el sistema la baja a disco cuando le conviene; el proceso sigue mucho antes de que el dato esté a salvo. Para forzarlo está fsync, y es costoso porque implica esperar al disco.

De ahí un detalle que se olvida: renombrar un archivo temporal sobre el definitivo es atómico dentro del sistema de archivos, pero para que el contenido esté garantizado hay que sincronizar el archivo antes del renombre y también el directorio. Es el patrón correcto para escribir un archivo de configuración sin dejarlo a medias.

La capa virtual: todo se ve como un archivo

La otra idea grande es la capa virtual de sistema de archivos: una interfaz común —abrir, leer, escribir, cerrar— que permite montar implementaciones distintas en el mismo árbol.

Por eso conviven ext4, XFS, un disco de red y sistemas que no son discos en absoluto: /proc expone información del núcleo como si fueran archivos. Esa uniformidad es lo que permite que una herramienta escrita hace treinta años siga funcionando sobre almacenamiento que no existía entonces.

Lo que hay que saber al escribir archivos

Cómo se asignan los bloques

EstrategiaLectura secuencialAcceso aleatorioFragmentación
Contiguala mejordirectamucha: hay que dejar huecos
Enlazadabuenamalísimo: hay que recorrerninguna
Indexadabuenadirectapoca
Extentsmuy buenadirectapoca, y menos metadatos
Los sistemas modernos usan extents —rangos contiguos descritos por inicio y largo— porque combinan lo mejor de las tres: pocos metadatos para archivos grandes y acceso directo.

Cierre

Inodos con metadatos, directorios que asocian nombres a inodos, asignación indexada o por extents. El journaling mantiene la estructura consistente ante un corte, aunque no siempre el contenido, y escribir no es guardar hasta que hay fsync.

Autoevaluación

¿Lo entendiste?

¿Qué NO contiene un inodo?
¿Cuándo desaparece realmente un archivo?
¿Qué ofrece el disco por debajo del sistema de archivos?
La asignación contigua de bloques, ¿qué problema tiene?