Elegir espacio

Dos espacios

¿Qué quieres consultar?

Elige el espacio al que quieres entrar.

Recorrido · SistemasBloque II · Unidad 2.1

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.

PreguntaObservaciónLí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 duroEnlace simbólico
IdentidadMismo objeto.Objeto que contiene una ruta.
Destino ausenteEl otro nombre sigue alcanzando el objeto.Puede quedar roto.
Otro filesystemNo conserva el mecanismo.Puede apuntar a él.
Observaciónstat 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:

  1. identificar proceso, operación, perspectiva y momento;
  2. localizar el filesystem con findmnt o df;
  3. observar la ruta componente a componente;
  4. comparar device, inode, links, size y blocks con stat;
  5. recorrer uso nombrado con un du acotado al filesystem;
  6. buscar referencias abiertas cuando la hipótesis lo justifica;
  7. correlacionar antes de cambiar.
HerramientaPreguntaPrecaució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, df y du;
  • investigar una discrepancia de permisos o espacio sin 777 ni borrado a ciegas.

Prácticas relacionadas#

12. Fuentes#