Módulo 8: Sistemas de archivos

Sistemas de archivos: inodos y enlaces

Un archivo no es su nombre. Sigue cada operación por el directorio, la tabla de inodos y los bloques, y descubre cuándo se borran de verdad los datos.

30 min

Antes de empezar

  • Qué es un proceso (lección Procesos y sus estados).
  • La idea de bloque: un trozo de tamaño fijo del disco, como las páginas y los marcos de la memoria (la lección Memoria virtual y paginación ayuda, pero no es necesaria).

Teoría

Un sistema de archivos divide el disco en bloques: aquí de 4 bytes, en los sistemas reales de 4 KiB.

Cada archivo tiene un inodo, identificado por su número. El inodo guarda el tipo (archivo, directorio o enlace simbólico), el tamaño, el contador de enlaces y los punteros a sus bloques de datos. El inodo no guarda el nombre.

Un directorio es un archivo especial cuyo contenido es una lista de entradas nombre → número de inodo. Aquí hay un solo directorio, la raíz /: inodo 0, guardado en el bloque 0.

Dos mapas de bits dicen qué inodos y qué bloques están en uso (1) o libres (0). Los inodos y bloques nuevos toman el número libre más bajo.

Operación Equivale a Qué hace
create nombre open con O_CREAT | O_EXCL Inodo nuevo, archivo vacío, entrada nueva. Falla si el nombre existe.
write nombre texto escribir el archivo entero Libera los bloques viejos y toma ⌈longitud ÷ 4⌉ nuevos.
link viejo nuevo ln viejo nuevo Enlace duro: otra entrada para el mismo inodo; su contador sube.
symlink destino nuevo ln -s destino nuevo Enlace simbólico: un inodo nuevo cuyo contenido es el nombre destino.
unlink nombre rm nombre Borra la entrada; el contador baja.
open nombre / close fd Da y devuelve un descriptor de archivo (3, 4…).
cat nombre / read fd Lee a través de un nombre o de un descriptor.
rename viejo nuevo mv viejo nuevo Cambia el nombre de la entrada.

Ejemplo: create a y después write a "hey": inodo 1, tamaño 3, y el bloque 1 guarda hey.

Predecir

El tablero empieza con el guion Enlaces:

  1. create notas.txt
  2. write notas.txt "hola mundo"
  3. link notas.txt copia.txt
  4. symlink notas.txt atajo
  5. unlink notas.txt
  6. cat copia.txt
  7. cat atajo

¿Qué muestra el paso 6? ¿Y el paso 7? Para cada uno: «hola mundo», un archivo vacío o un error. Responde en el panel Tu predicción antes de ejecutar.

Ejecutar

Guion de operaciones

Una operación por paso. Nombres en minúsculas, cifras, punto, guion o guion bajo; textos de hasta 12 caracteres.

  1. Paso 1
  2. Paso 2
  3. Paso 3
  4. Paso 4
  5. Paso 5
  6. Paso 6
  7. Paso 7
Escenarios

Tu predicción

¿Qué muestra cada lectura del guion?

El tablero antes de empezar

Un solo directorio, 8 inodos y 12 bloques de 4 bytes.

Mapas de bits

Inodos
Bloques

Directorio /

  • Sin entradas

Descriptores abiertos

  • Ninguno

Tabla de inodos

Bloques de datos

  1. 0 directorio
  2. 1 libre
  3. 2 libre
  4. 3 libre
  5. 4 libre
  6. 5 libre
  7. 6 libre
  8. 7 libre
  9. 8 libre
  10. 9 libre
  11. 10 libre
  12. 11 libre

Qué pasó en este turno

Pulsa Ejecutar o avanza paso a paso. Aquí verás qué capa toca cada operación: nombres, inodos o bloques.

Salida

Todavía no hay lecturas.

Mientras avanza, fíjate en cuatro momentos:

  • Paso 2: ¿cuántos bloques ocupa «hola mundo»? ¿Quién apunta a ellos?
  • Paso 3: ¿se reserva algún bloque o algún inodo nuevo?
  • Paso 5: desaparece la entrada notas.txt. ¿Desaparecen también el inodo 1 y sus bloques?
  • Paso 7: ¿qué nombre busca el sistema al seguir atajo?

Las fichas unen las tres capas: la misma forma y el mismo color marcan una entrada del directorio, su inodo y sus bloques.

Explicar

Esta etapa se abre cuando ejecutas la simulación hasta el final.

Ir a la simulación

Lo correcto era: el paso 6 muestra «hola mundo» y el paso 7 da un error.

El nombre no es el archivo. El directorio solo relaciona nombres con números; todo lo demás está en el inodo. Tras el paso 3, notas.txt y copia.txt son dos nombres para el inodo 1, y ninguno es «el original». Al borrar notas.txt, el contador de enlaces del inodo 1 baja de 2 a 1 y nada más cambia. Con ls -i ves los números de inodo y con stat, el contador de enlaces.

Un enlace duro no es una copia. No se reservó ningún bloque: los datos existen una sola vez. Un enlace duro no puede cruzar sistemas de archivos (los números de inodo son de cada sistema), y la mayoría de sistemas no permiten enlaces duros a directorios, para que el árbol no tenga ciclos.

Un enlace simbólico guarda un nombre. atajo es un inodo aparte cuyo contenido es el texto notas.txt. Para leerlo, el sistema busca ese nombre en el directorio, y en el paso 7 ya no está: es un enlace colgante. Los enlaces simbólicos pueden cruzar sistemas de archivos y apuntar a directorios, pero no mantienen vivo a nadie. ext4 guarda los destinos cortos (menos de 60 bytes) dentro del propio inodo, sin usar bloques, como este simulador.

Cuándo se liberan los datos. Solo cuando el contador de enlaces llega a 0 y ningún proceso tiene el archivo abierto. Un proceso puede seguir leyendo un archivo después de que se borre su último nombre; el espacio vuelve al cerrarlo (guion Archivo abierto). lsof +L1 lista esos archivos abiertos y borrados; en Linux también aparecen como (deleted) en /proc/<pid>/fd.

Renombrar no mueve datos. mv dentro del mismo sistema de archivos reescribe una entrada del directorio; el número de inodo y todos los bloques se quedan donde estaban. Por eso mover un archivo de 10 GB es instantáneo.

También se acaban los inodos. df -i muestra cuántos quedan. Muchos archivos diminutos pueden agotar los inodos aunque sobren bloques.

Sistemas reales. ext4 usa inodos de 256 bytes y bloques de 4 KiB, y describe los datos con extents (un bloque inicial y una longitud) en lugar de un puntero por bloque. El inodo de ext2 y ext3 (como el de BSD FFS) tiene 12 punteros directos y bloques indirectos simple, doble y triple.

Experimentar

Esta etapa se abre cuando ejecutas la simulación hasta el final.

Ir a la simulación

Usa el tablero para resolver estos retos. Cada uno tiene una solución posible al desplegarlo.

1. Lee los datos de un archivo después de borrar todos sus nombres.

Carga Archivo abierto. En el paso 4 se borra log.txt, pero el paso 5, read 3, muestra «datos»: el descriptor apunta al inodo, que sigue vivo mientras esté abierto. Al cerrar, en el paso 6, se liberan el inodo y sus bloques, y el paso 7 vuelve a usar el inodo 1.

2. Libera los bloques de un archivo que tiene dos nombres.

En Enlaces, cambia el paso 6 por unlink copia.txt. El contador llega a 0, nadie lo tiene abierto y se liberan el inodo 1 y los bloques 1, 2 y 3.

3. Haz que atajo vuelva a funcionar sin tocarlo.

En Enlaces, después del paso 5: create notas.txt, write notas.txt "otra" y cat atajo. El enlace simbólico vuelve a buscar el nombre y encuentra el nuevo inodo 3: se lee «otra».

4. Demuestra que renombrar no toca los datos.

En Enlaces, cambia el paso 6 por rename copia.txt final.txt. La entrada cambia de nombre, pero sigue apuntando al inodo 1, con los mismos bloques 1, 2 y 3.

Comprobar

Esta etapa se abre cuando ejecutas la simulación hasta el final.

Ir a la simulación
1. ln a b (enlace duro). ¿Cuántos inodos y cuántas copias de los datos hay ahora?
2. Un archivo tiene contador de enlaces 2. Haces rm de uno de sus nombres. ¿Se liberan sus bloques?
3. Un proceso tiene un archivo abierto y borras su único nombre. ¿Cuándo vuelve el espacio?
4. ln -s a b y después rm a. ¿Qué hace cat b?
5. mv grande.iso copia.iso en el mismo sistema de archivos. ¿Qué cambia?
6. ¿Dónde se guarda el nombre de un archivo?

Profundizar

  • Subdirectorios, . y .., y por qué el contador de enlaces de un directorio es 2 más su número de subdirectorios.
  • Diario y consistencia ante fallos. Qué pasa si se va la luz entre actualizar el mapa de bits y el inodo.
  • Extents y bloques indirectos de ext4: qué tamaño de archivo puede describir un inodo.
  • Sistemas de archivos con copia en escritura (Btrfs, ZFS) y los reflinks: copias que comparten bloques hasta que alguien escribe.

Para leer más:

  • Arpaci-Dusseau y Arpaci-Dusseau, Operating Systems: Three Easy Pieces, cap. 39 (secciones 39.14 y 39.15) y cap. 40. Gratis en línea.
  • Silberschatz, Galvin y Gagne, Operating System Concepts, 10.ª ed., caps. 13 y 14.
  • Manuales unlink(2) y symlink(7): man7.org.
  • Documentación del núcleo Linux, ext4 Data Structures and Algorithms: docs.kernel.org.