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.
Antes de seguir, predecí
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
| Estrategia | Lectura secuencial | Acceso aleatorio | Fragmentación |
|---|---|---|---|
| Contigua | la mejor | directa | mucha: hay que dejar huecos |
| Enlazada | buena | malísimo: hay que recorrer | ninguna |
| Indexada | buena | directa | poca |
| Extents | muy buena | directa | poca, y menos metadatos |
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?
Práctica