Bloque II · Módulo 2 · Unidad 2.1
Árbol de archivos, metadatos y persistencia
Cómo Linux resuelve rutas, relaciona nombres con objetos, mantiene descriptores y contabiliza espacio a través de filesystems y mounts.
Antes de empezar#
En la Unidad 1.1 seguimos operaciones por capas. Ahora abrimos una de esas capas: el árbol de archivos. La idea cotidiana «un archivo es una ruta» sirve para orientarse, pero falla en cuanto aparecen enlaces, mounts, procesos con descriptores abiertos o dos herramientas que contabilizan espacios distintos.
Dependencias. Capas e interfaces (1.1), composición de comandos (1.2) y diagnóstico basado en evidencia (1.3).
Alcance. Rutas, entradas de directorio, inodos como modelo observable,
enlaces, mounts, permisos tradicionales, umask, descriptores, archivos
retirados todavía abiertos y diferencias entre df y du.
Fuera de alcance. Implementación interna completa de ext4 o XFS, recuperación forense, RAID, cuotas, LVM y administración de particiones. Los estudiaremos cuando el objetivo sea operar almacenamiento.
1. Ruta, nombre y objeto#
Una ruta es una instrucción para recorrer nombres desde un punto de partida. No es el contenido ni una identidad global. El kernel resuelve cada componente y termina en un objeto del filesystem si todo el recorrido existe y el proceso tiene acceso suficiente.
/srv/app/config.yaml
└┬─┘ └─┬─┘ └────┬────┘
raíz directorio nombre final
↓
entrada de directorio
↓
objeto/inodo
↓
datos + metadatos
Una entrada de directorio relaciona un nombre con un objeto dentro de un filesystem. El inode es una identidad útil dentro de ese filesystem y contiene metadatos; el nombre vive en el directorio. Por eso un mismo objeto puede tener varios nombres y un nombre puede pasar a referenciar otro objeto.
| Pregunta | Observación | Límite |
|---|---|---|
| ¿Qué nombre sigo? | readlink, ruta canónica, directorio de trabajo. | Una ruta canónica no es una identidad permanente. |
| ¿Qué objeto alcanzó? | stat: device e inode. | Puede cambiar entre observación y uso. |
| ¿Quién lo mantiene abierto? | lsof o /proc/PID/fd. | Depende de permisos y del namespace observado. |
| ¿Qué filesystem aporta espacio? | findmnt, mount, df. | No identifica por sí solo qué nombres consumen espacio. |
2. Resolver una ruta#
La resolución empieza en la raíz del proceso si la ruta comienza por /; una
ruta relativa empieza en su directorio de trabajo. Después se recorren los
componentes intermedios. En cada directorio hace falta permiso de búsqueda
—representado normalmente por x— y puede aparecer un symlink que redirige el
recorrido.
proceso
├─ root directory
├─ current working directory
├─ credenciales
└─ ruta solicitada
↓ componente a componente
mounts + dentries + symlinks + permisos
↓
objeto final o error
Errores distintos revelan fronteras distintas:
ENOENT: falta un componente o un symlink termina en un destino ausente;ENOTDIR: un componente intermedio no es directorio;EACCES: una comprobación de búsqueda o acceso denegó;ELOOP: demasiados symlinks o un ciclo;EXDEV: una operación que exige el mismo filesystem intentó cruzarlo.
3. Metadatos e inodos#
stat separa varias propiedades que ls -l resume:
- tipo y modo;
- UID y GID propietarios;
- device e inode;
- número de enlaces;
- tamaño lógico y bloques asignados;
- tiempos de acceso, modificación y cambio de metadatos.
El tiempo ctime no es «creación»: registra cambios del inode como modo,
propiedad o enlaces, además de otras transiciones. La disponibilidad de un
tiempo de nacimiento depende del filesystem y de la interfaz.
stat -c 'dev=%d inode=%i links=%h mode=%A uid=%u gid=%g size=%s blocks=%b' -- archivo
Este formato es una demostración, no una plantilla universal. Para scripts, elige campos explícitos y documenta unidades. Para diagnóstico interactivo, conserva el comando y el fragmento que respalda la conclusión.
4. Enlaces duros y simbólicos#
Un enlace duro añade otro nombre para el mismo objeto. Comparten device e inode y el contador de enlaces aumenta. No suele permitirse para directorios y no cruza filesystems, porque el número de inode pertenece a uno.
Un enlace simbólico es un objeto diferente cuyo contenido es otra ruta. Puede
cruzar filesystems y puede quedar roto. lstat observa el symlink; stat
normalmente sigue su destino.
| Enlace duro | Enlace simbólico | |
|---|---|---|
| Identidad | Mismo objeto. | Objeto que contiene una ruta. |
| Destino ausente | El otro nombre sigue alcanzando el objeto. | Puede quedar roto. |
| Otro filesystem | No conserva el mecanismo. | Puede apuntar a él. |
| Observación | stat muestra device/inode iguales. | readlink muestra el texto guardado. |
rename dentro del mismo filesystem cambia nombres atómicamente desde la
perspectiva de resolución, sin copiar el contenido. Cruzar filesystems exige
otro flujo —normalmente copiar y retirar— y cambia los riesgos de consistencia.
5. Mounts y árbol compuesto#
Linux presenta un árbol único compuesto por filesystems montados. Un mount asocia la raíz de otro filesystem a un punto del árbol. Los nombres que ya existían bajo el punto quedan ocultos mientras el mount está activo; no han sido borrados.
antes después de mount en /srv/data
/srv/data/local.txt /srv/data/remote.txt
↑ oculto mientras el otro filesystem ocupa el punto
findmnt, mount y /proc/self/mountinfo muestran perspectivas del árbol de
mounts. En namespaces distintos, dos procesos pueden ver composiciones
distintas.
El FHS ofrece convenciones útiles (/etc, /var, /run, /usr, /home),
pero no convierte cada distribución o aplicación en idéntica. Descubre el
layout real antes de asumir dónde está configuración, estado mutable o datos.
6. Permisos y umask#
El modo tradicional expresa bits para propietario, grupo y resto. En archivos,
r, w y x significan leer contenido, modificar y ejecutar. En directorios,
leer lista nombres, escribir entradas y buscar/atravesar son capacidades
distintas.
La umask retira permisos de un modo solicitado al crear objetos; no modifica
retroactivamente archivos existentes. Tampoco explica ACL por sí sola.
modo solicitado para archivo: 0666
umask: 0027
resultado base: 0640
Esto no es una suma ni un permiso predeterminado universal: la aplicación elige el modo solicitado, y ACL por defecto u otras políticas pueden intervenir.
La identidad, grupos, ACL y mínimo privilegio pertenecen en profundidad a la
Unidad 2.4. Aquí basta recordar que el acceso ocurre durante la resolución y
sobre el objeto, no únicamente en la última línea de ls -l.
7. Descriptores y ciclo de vida#
Al abrir un archivo, el proceso obtiene un número pequeño: el file
descriptor. Ese número referencia una descripción abierta que conserva modo
de acceso, posición y objeto. El proceso opera mediante el descriptor; no
resuelve otra vez el nombre en cada read o write.
proceso tabla de descriptores objeto
fd 3 ─────────────► descripción abierta ───────────► inode + datos
Tras fork, procesos pueden heredar descriptores. Tras exec, sobreviven salvo
que estén marcados close-on-exec. Cuando se cierra la última referencia abierta
y no quedan enlaces, el objeto puede liberar su almacenamiento.
/proc/PID/fd/ contiene symlinks representando descriptores del proceso.
lsof +L1 puede localizar objetos abiertos con link count menor que uno. Ambas
vistas tienen límites de permisos, namespaces y tiempo.
8. df, du y archivos abiertos#
df informa uso del filesystem que contiene una ruta. du recorre nombres
accesibles bajo un árbol y suma uso asignado según sus reglas. No responden la
misma pregunta.
df: contabilidad del filesystem
du: objetos alcanzables por el recorrido solicitado
Una diferencia puede deberse a:
- archivo sin enlaces todavía abierto;
- otro punto de montaje incluido o excluido;
- permisos que impiden recorrer;
- bloques reservados, metadatos o snapshots;
- archivos dispersos, reflinks o reglas de contabilización;
- carrera: el estado cambia durante la medida.
9. Método de observación#
Una secuencia de solo lectura para una discrepancia de ruta o espacio puede ser:
- identificar proceso, operación, perspectiva y momento;
- localizar el filesystem con
findmntodf; - observar la ruta componente a componente;
- comparar device, inode, links, size y blocks con
stat; - recorrer uso nombrado con un
duacotado al filesystem; - buscar referencias abiertas cuando la hipótesis lo justifica;
- correlacionar antes de cambiar.
| Herramienta | Pregunta | Precaución |
|---|---|---|
pwd/readlink | ¿Desde dónde y hacia qué texto se resuelve? | No identifica el objeto final por sí solo. |
stat | ¿Qué metadatos expone este nombre ahora? | Instantánea susceptible a carreras. |
find | ¿Qué nombres cumplen criterios? | Delimita filesystem, permisos y acciones. |
lsof//proc | ¿Qué proceso conserva una referencia? | Requiere contexto y permisos. |
df/du | ¿Qué contabiliza el filesystem y qué alcanza el árbol? | No compares sin igualar alcance. |
10. Errores conceptuales frecuentes#
11. Síntesis y dominio#
El árbol es una composición de nombres y mounts. Las rutas se resuelven bajo el contexto del proceso; los nombres conducen a objetos; los descriptores conservan referencias; y las herramientas observan alcances distintos.
Has alcanzado el dominio esperado cuando puedes:
- predecir rename, unlink, enlace y mount sin confundir nombre con objeto;
- elegir metadatos que demuestran identidad dentro de un filesystem;
- explicar por qué un descriptor sobrevive a retirar el último nombre;
- distinguir tamaño lógico, bloques asignados,
dfydu; - investigar una discrepancia de permisos o espacio sin
777ni borrado a ciegas.
Prácticas relacionadas#
SYS-Q-201: predecir nombres, enlaces y mounts.SYS-L-201: observar inodos, descriptores, df y du.SYS-I-201: investigar un filesystem lleno.
12. Fuentes#
- Linux man-pages — path_resolution(7)
Algoritmo observable de resolución, symlinks y permisos de búsqueda.
- Linux kernel — Virtual File System
Relación entre superblock, inode, dentry, file y operaciones VFS.
- Linux kernel — /proc filesystem
Vista /proc/PID/fd de descriptores abiertos.
- GNU Coreutils — File space usage
Contratos de df, du y stat.