¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Cómo encuentra el sistema un archivo (inodos)

Después de esta lección: Puedo explicar cómo el sistema convierte una ruta en los bloques de un archivo.

Lección de 60 min11 comandosLaboratorio de comandos de Linux de cada día: los treinta comandos que se escriben de memoria

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

PalabraQué significaEjemplo
Inodola ficha de un archivo: tipo, tamaño y dónde están sus bloques
Directorioun archivo que enlaza nombres con inodos
Bloqueun trozo de tamaño fijo del disco4096 bytes
Enlace durootro nombre para el mismo inodo
Rutala 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 permisosSíEn el inodo
Tamaño en bytesSíEn el inodo
Números de los bloquesSíEn el inodo
Número de enlacesSíEn el inodo
NombreNoEn el directorio
ContenidoNoEn los bloques

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Crea un archivo de cinco bytes

Comando
printf 'hola\n' > ~/enlace-a.txt

Se 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

Comando
stat -c '%s' ~/enlace-a.txt

Se 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

Comando
ln ~/enlace-a.txt ~/enlace-b.txt

Se 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

Comando
stat -c '%h' ~/enlace-a.txt

Se 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

Comando
ls -i ~/enlace-a.txt ~/enlace-b.txt | awk '{print $1}' | uniq | wc -l

Se 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

Comando
rm ~/enlace-a.txt

Se 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

Comando
stat -c '%h' ~/enlace-b.txt

Se 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

Comando
cat ~/enlace-b.txt

Se 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

PasoSe buscaEn el inodoResultado
1/raíz, inodo 2directorio
2home2inodo 3, directorio
3ana3inodo 5, directorio
4notas.txt5inodo 7, archivo
5sus bloques7bloques 41, 42 y 43

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Mira cada paso de una ruta real

Comando
namei /etc/passwd

Se 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

Comando
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

Comando
rm ~/enlace-b.txt

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Sobre este laboratorio y su código: Laboratorio de comandos de Linux de cada día: los treinta comandos que se escriben de memoria

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.