De la ruta al archivo en el disco
Un sistema de archivos es la forma en que el sistema operativo organiza los datos del disco. Cuando abres /home/ana/notas.txt, el sistema recorre la ruta nombre a nombre hasta dar con los bloques del disco donde está el contenido.
Entender ese recorrido explica por qué renombrar es instantáneo y por qué borrar un archivo no siempre libera espacio.
Al final de esta lección
Nota
Puedo explicar cómo el sistema convierte una ruta en los bloques de un archivo.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Inodo | la ficha de un archivo: tipo, tamaño y dónde están sus bloques | |
| Directorio | un archivo que enlaza nombres con inodos | |
| Bloque | un trozo de tamaño fijo del disco | 4096 bytes |
| Enlace duro | otro nombre para el mismo inodo | |
| Ruta | la lista de nombres que lleva a un archivo | /etc/passwd |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
La ficha de un archivo se llama inodo
Cada archivo tiene un inodo, una ficha con sus datos. Dice de qué tipo es, quién es su dueño, qué permisos tiene, cuánto mide y en qué bloques del disco está.
El inodo no guarda el nombre. El nombre está en otro sitio, en el directorio. Así se puede cambiar un nombre sin tocar los datos.
Qué guarda un inodo y qué no
| Dato | ¿Está en el inodo? | Dónde está |
|---|---|---|
| Tipo (archivo o directorio) | Sí | En el inodo |
| Dueño y permisos | Sí | En el inodo |
| Tamaño en bytes | Sí | En el inodo |
| Números de los bloques | Sí | En el inodo |
| Número de enlaces | Sí | En el inodo |
| Nombre | No | En el directorio |
| Contenido | No | En los bloques |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Crea un archivo de cinco bytes
printf 'hola\n' > ~/enlace-a.txtSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Pide al inodo el tamaño
stat -c '%s' ~/enlace-a.txtSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
stat lee los datos del inodo
La primera orden crea el archivo con la palabra hola y una línea nueva. La segunda imprime 5: cuatro letras y el salto de línea.
El tamaño sale del inodo, no de leer el archivo entero.
Un directorio enlaza nombres con inodos
Un directorio es un archivo cuyo contenido es una lista de pares: un nombre y un número de inodo. Cada par es una entrada.
Un enlace duro es una segunda entrada que apunta al mismo inodo. Los dos nombres son el mismo archivo. El inodo cuenta cuántos nombres tiene y solo se libera cuando llega a cero.
Da un segundo nombre al archivo
ln ~/enlace-a.txt ~/enlace-b.txtSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Cuenta los nombres del inodo
stat -c '%h' ~/enlace-a.txtSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Cuántos inodos hay tras los dos nombres
ls -i ~/enlace-a.txt ~/enlace-b.txt | awk '{print $1}' | uniq | wc -lSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Borra el primer nombre
rm ~/enlace-a.txtSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Cuenta otra vez los nombres
stat -c '%h' ~/enlace-b.txtSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Lee el contenido por el otro nombre
cat ~/enlace-b.txtSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Borrar un nombre no borra los datos
Tras ln, stat imprime 2: el inodo tiene dos nombres. La tubería imprime 1: ls -i mostró el mismo número de inodo con los dos nombres, y uniq los junta.
Tras rm, stat imprime 1 y cat sigue imprimiendo hola. rm quita un nombre y resta un enlace. Los datos se liberan al llegar a cero.
Un error frecuente
Advertencia
Mucha gente cree que rm borra el contenido del archivo. rm quita un nombre del directorio y resta un enlace al inodo. Los bloques se liberan solo cuando no quedan nombres, y tampoco debe haber ningún programa con el archivo abierto.
Resolver una ruta es seguir entradas de directorio
Para abrir /home/ana/notas.txt el sistema empieza en el inodo de la raíz, /. Busca home en su lista y obtiene otro inodo, que es un directorio.
Busca ana en él, y después notas.txt. El último inodo es el del archivo, y de él salen los bloques. Si falta un nombre, o un paso intermedio no es un directorio, la ruta falla.
Ejemplo: la ruta /home/ana/notas.txt
| Paso | Se busca | En el inodo | Resultado |
|---|---|---|---|
| 1 | / | raíz, inodo 2 | directorio |
| 2 | home | 2 | inodo 3, directorio |
| 3 | ana | 3 | inodo 5, directorio |
| 4 | notas.txt | 5 | inodo 7, archivo |
| 5 | sus bloques | 7 | bloques 41, 42 y 43 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Mira cada paso de una ruta real
namei /etc/passwdSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
namei enseña el recorrido paso a paso
La orden imprime cuatro líneas. La primera dice f: /etc/passwd, la ruta completa. Las otras tres, con una letra delante, son los pasos: d /, d etc y - passwd.
La d marca un directorio. El guion marca un archivo normal, el último paso.
Un inodo apunta a los bloques de datos
Un archivo mediano ocupa varios bloques. En el modelo clásico, el inodo guarda 12 números de bloque directos y uno más que apunta a un bloque lleno de números.
Con bloques de 4 KiB y números de 4 bytes, un bloque guarda 1024 números. Los sistemas modernos, como ext4, usan extensiones, pero la idea es la misma.
Capacidad de 12 directos y un indirecto
python3 -c "print((12 + 1024) * 4)"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Limpia tu archivo de prueba
rm ~/enlace-b.txtSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.