← Terminal y Línea de Comandos en Linux Bloque 2 · Navegar el sistema de archivos · Tema 8 de 43

Tema 8

La jerarquía estándar de Linux

Al listar la raíz aparecen unos veinte directorios de nombres breves y poco transparentes: etc, usr, var, proc. No están puestos al azar. Cada uno tiene una función definida, la misma en casi todas las distribuciones, y conocerla permite saber dónde buscar un archivo de configuración, un registro o un programa sin haber visto nunca ese sistema. En este tema recorremos el mapa completo.

1. Un lugar para cada cosa

En muchos sistemas, cada programa se instala en una carpeta propia que contiene todo lo suyo: el ejecutable, la configuración, la documentación, los datos. Linux sigue el criterio opuesto, heredado de Unix. Los archivos se agrupan por función, no por programa: todos los ejecutables en un lugar, toda la configuración en otro, todos los registros en un tercero.

Los archivos de un programaEn Linux van a…
El ejecutable/usr/bin
Su configuración/etc
Su página del manual/usr/share/man
Los datos que genera al funcionar/var
Los ajustes personales de cada usuarioEl directorio personal

La consecuencia práctica es grande. Para hacer una copia de seguridad de toda la configuración del sistema alcanza con copiar un directorio; para encontrar el registro de cualquier servicio se mira en un solo lugar, y el PATH puede ser una lista corta porque los programas no están dispersos.

Esta organización está escrita en un documento, el Estándar de Jerarquía del Sistema de Archivos, conocido por su sigla en inglés, FHS. Las distribuciones lo siguen con variaciones menores, y por eso lo que aprendas aquí con Ubuntu vale para Debian, Fedora, Arch o un servidor en la nube. El propio manual lo resume: la página es man hier, de hierarchy.

2. El mapa de la raíz

Empecemos por mirar. Con lo aprendido en los dos temas anteriores:

terminal, en Ubuntu (puede variar levemente)
$ ls /
bin   cdrom  etc   lib    lost+found  mnt  proc  run   snap  swap.img  tmp  var
boot  dev    home  lib64  media       opt  root  sbin  srv   sys       usr

Son muchos nombres, pero se ordenan en cuatro grupos según una pregunta simple: ¿de quién es y cada cuánto cambia?

Los directorios de la raíz en cuatro grupos: lo de los usuarios, home y root; el sistema instalado, usr, etc, boot y opt; lo que cambia con el uso, var, tmp y run; y las ventanas al kernel, proc, sys y dev Lo de los usuarios /home /root documentos y ajustes personales lo escribes tú El sistema instalado /usr /etc /boot /opt programas y su configuración lo escribe el administrador Lo que cambia con el uso /var /tmp /run registros, cachés, temporales lo escriben los programas Ventanas al kernel /proc /sys /dev no están en el disco los fabrica el kernel
Los directorios principales de la raíz, agrupados por quién escribe en ellos. Resaltado, el único grupo que te pertenece.

Y esta es la lista completa, para tener a mano. Las secciones siguientes desarrollan los más importantes:

DirectorioContiene
/homeLos directorios personales de los usuarios.
/rootEl directorio personal del administrador.
/etcLa configuración del sistema y de los programas.
/usrLos programas instalados, sus bibliotecas y su documentación.
/bin, /sbin, /lib, /lib64Enlaces a los directorios del mismo nombre dentro de /usr.
/varDatos que cambian durante el funcionamiento: registros, cachés, colas.
/tmpArchivos temporales.
/devLos dispositivos, representados como archivos.
/proc, /sysInformación del kernel, los procesos y el hardware.
/runDatos de los programas en ejecución desde el último arranque.
/bootLo necesario para arrancar: el kernel y el cargador de arranque.
/optProgramas de terceros que se instalan en una carpeta propia.
/media, /mntLos puntos donde aparecen otros discos.
/srvDatos que el equipo ofrece a otros, como los de un sitio web.

3. /home y /root: lo de cada usuario

Lo vimos en el tema 6: cada usuario tiene su directorio personal dentro de /home, y la shell lo abrevia con la virgulilla. Es el único lugar del árbol que es enteramente tuyo, y por eso contiene dos clases de cosas:

En el directorio personalEjemplos
Tus archivosDocumentos, Descargas, practica
Tu configuración, en archivos y directorios ocultos.bashrc, .config, .ssh
Datos de tus programas, también ocultos.cache, .local/share

Aquí aparece una regla general del sistema. Casi todo programa tiene dos niveles de configuración: uno para todo el equipo, en /etc, y otro para cada usuario, en su directorio personal. El segundo tiene prioridad. Bash es un ejemplo: lee primero /etc/bash.bashrc, que vale para todos, y luego tu ~/.bashrc.

El administrador es la excepción a la ubicación: su directorio personal es /root, en la raíz y no dentro de /home. La razón es práctica. En muchas instalaciones /home está en otro disco, y si ese disco falla, el administrador debe poder entrar igual a reparar el sistema. No hay que confundir /root, el directorio de un usuario, con /, el directorio raíz, aunque en inglés ambos se llamen root.

4. /etc: la configuración

/etc guarda la configuración de todo el sistema: cómo se llama el equipo, qué usuarios existen, qué discos se conectan al arrancar, cómo se comporta cada servicio. El nombre viene de et cetera: en los primeros Unix era el directorio de «todo lo demás», y con los años se especializó.

Tiene una característica que define la manera de administrar Linux: su contenido son archivos de texto. No hay una base de datos opaca ni hace falta un programa especial. La configuración se lee con cat y se cambia con un editor.

terminal (segunda salida abreviada)
$ cat /etc/hostname
equipo
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.1 LTS (Noble Numbat)"
ID=ubuntu
ID_LIKE=debian
…

Varios de los archivos de /etc van a acompañarnos durante el curso:

ArchivoContieneLo vemos en
/etc/hostnameEl nombre del equipo.—
/etc/os-releaseLa distribución y su versión.Tema 37
/etc/passwdLa lista de usuarios.Tema 16
/etc/groupLa lista de grupos.Tema 16
/etc/shadowLas contraseñas, cifradas. No es legible por usuarios comunes.Tema 20
/etc/sudoersQuién puede actuar como administrador.Tema 19
/etc/fstabLos discos que se conectan al arrancar.Tema 38
/etc/hostsNombres de equipos conocidos y sus direcciones.Tema 40
/etc/shellsLas shells instaladas. Lo consultamos en el tema 1.—
/etc/servicesLos nombres de los servicios de red. Es el archivo que copiamos como informe.txt.—

Al listar /etc verás muchos directorios terminados en .d, como /etc/apt/sources.list.d o /etc/sudoers.d. Es una convención: en lugar de un único archivo de configuración largo, el programa lee todos los archivos pequeños que haya en ese directorio. Así, cada paquete puede agregar su parte sin modificar el archivo de otro.

Leer en /etc es libre, salvo unos pocos archivos reservados. Escribir exige permisos de administrador: es el tema 19.

5. /usr: los programas

/usr es el directorio más grande del sistema. Contiene casi todo lo que se instala: los programas, las bibliotecas que usan y sus archivos auxiliares. A pesar del nombre, no tiene nada que ver con los archivos de los usuarios; es una herencia histórica, de cuando en ese directorio estaban también los directorios personales.

Por dentro repite, en pequeño, una estructura reconocible:

DirectorioContieneEjemplo
/usr/binLos programas de uso general. Es donde están casi todos los comandos del curso./usr/bin/ls
/usr/sbinLos programas de administración./usr/sbin/useradd
/usr/libLas bibliotecas: código compartido que los programas cargan al ejecutarse./usr/lib/x86_64-linux-gnu/libc.so.6
/usr/shareDatos que no dependen del tipo de procesador: documentación, iconos, traducciones./usr/share/man, /usr/share/doc
/usr/includeArchivos de cabecera para compilar programas en C./usr/include/stdio.h
/usr/localLo que el administrador instala por su cuenta, fuera del gestor de paquetes./usr/local/bin

Varias de estas rutas ya las cruzamos. /usr/share/man es de donde man saca sus páginas, y /usr/share/doc, la documentación adicional que mencionamos en el tema 4. Y la lista del PATH del tema 3 se entiende ahora entera:

el PATH, leído con el mapa
/usr/local/sbin    administración, instalado a mano
/usr/local/bin     uso general, instalado a mano
/usr/sbin          administración, de la distribución
/usr/bin           uso general, de la distribución
/sbin              enlace a /usr/sbin
/bin               enlace a /usr/bin

El orden tiene un sentido. /usr/local va primero para que un programa que instalaste por tu cuenta tenga prioridad sobre el de la distribución con el mismo nombre. Y como el gestor de paquetes nunca escribe en /usr/local, lo tuyo no se pisa con lo suyo: cada uno administra su parte.

6. /bin, /sbin y /lib

En la raíz hay directorios con los mismos nombres que los de /usr. En las distribuciones actuales no son directorios reales:

terminal
$ ls -ld /bin /sbin /lib
lrwxrwxrwx 1 root root 7 abr 22  2024 /bin -> usr/bin
lrwxrwxrwx 1 root root 7 abr 22  2024 /lib -> usr/lib
lrwxrwxrwx 1 root root 8 abr 22  2024 /sbin -> usr/sbin

La l inicial y la flecha, que aprendimos a leer en el tema 7, indican que son enlaces simbólicos. /bin/ls y /usr/bin/ls son el mismo archivo, alcanzado por dos caminos.

La duplicación tiene una explicación histórica. Durante décadas, /bin contenía los programas mínimos para arrancar y reparar el sistema, y /usr/bin el resto, que podía estar en otro disco. Esa separación dejó de ser útil, y las distribuciones unificaron todo en /usr. Los enlaces se conservan porque miles de scripts empiezan con una ruta como /bin/bash o /bin/sh, y deben seguir funcionando.

La otra distinción, entre bin y sbin, sí sigue vigente:

binsbin
ContieneProgramas para cualquier usuarioProgramas de administración
Ejemplosls, cp, grepuseradd, fdisk, reboot
Sección del manual18

Un usuario común puede ejecutar muchos programas de sbin, pero la mayoría solo hace algo útil con permisos de administrador.

7. /var: lo que cambia

Los programas de /usr no se modifican al usarlos. Pero al funcionar producen datos: anotan lo que hacen, guardan copias para ir más rápido, acumulan trabajos pendientes. Todo eso va a /var, de variable.

DirectorioContiene
/var/logLos registros: lo que el sistema y los servicios van anotando.
/var/cacheDatos que se pueden volver a obtener, guardados para ahorrar tiempo. Por ejemplo, los paquetes descargados.
/var/libEl estado que los programas necesitan conservar: bases de datos, la lista de paquetes instalados.
/var/spoolTrabajos en cola: impresiones, correo, tareas programadas.
/var/tmpTemporales que deben sobrevivir a un reinicio.

De los cinco, el que más vas a visitar es /var/log. Cuando algo falla, la explicación suele estar escrita allí:

terminal (salida abreviada; varía en cada sistema)
$ ls /var/log
apt  auth.log  boot.log  dmesg  dpkg.log  journal  kern.log  syslog  …

Son, otra vez, archivos de texto: se leen con los comandos del tema 12 y se filtran con los del bloque 6. Los estudiamos en el tema 39, y el proyecto final del curso, en el tema 42, consiste en analizar uno.

La separación entre /usr y /var explica un problema clásico de los servidores. /var es el directorio que crece: los registros se acumulan día tras día. Cuando un sistema se queda sin espacio en disco, es el primer lugar donde mirar.

8. /tmp: lo provisorio

/tmp es el directorio para archivos temporales: los que un programa necesita por un rato y no importa perder. Tiene dos propiedades que lo distinguen de todos los demás.

La primera: cualquier usuario puede escribir en él. Es, junto con tu directorio personal, el único lugar donde puedes crear archivos sin permisos especiales.

terminal
$ ls -ld /tmp
drwxrwxrwt 18 root root 4096 oct 12 11:05 /tmp

Los tres grupos de permisos tienen la w: todos pueden escribir. La t final, en lugar de la x habitual, es una protección adicional que impide que un usuario borre los archivos de otro. La explicamos en el tema 21.

La segunda: su contenido se borra. En Ubuntu se vacía en cada arranque; en otras distribuciones ni siquiera está en el disco, sino en memoria. La regla es la misma en todas:

Nada que quieras conservar va en /tmp

/tmp sirve para pruebas y para archivos intermedios. Lo que se deja allí desaparece al reiniciar, sin aviso. Además, lo que escribas puede ser visto por los demás usuarios del equipo, salvo que cuides sus permisos.

/tmp/var/tmp
Sobrevive a un reinicioNoSí
Se limpiaEn cada arranqueCuando los archivos llevan semanas sin usarse
ParaLo que dura una sesiónLo que debe durar unos días

9. /dev: los dispositivos

Una de las ideas centrales de Unix es que los dispositivos se manejan como si fueran archivos: se los abre, se lee de ellos, se escribe en ellos. Para eso cada dispositivo tiene un nombre dentro de /dev, de devices.

ArchivoRepresenta
/dev/sda, /dev/nvme0n1Un disco completo.
/dev/sda1, /dev/nvme0n1p1Una partición de ese disco.
/dev/tty, /dev/pts/0Una terminal.
/dev/nullUn sumidero: todo lo que se escribe en él se descarta.
/dev/zeroUna fuente inagotable de bytes con valor cero.
/dev/urandomUna fuente inagotable de bytes al azar.

Los tres últimos no corresponden a ningún aparato: son dispositivos que el kernel simula porque resultan útiles. El más usado es /dev/null, que sirve para deshacerse de una salida que no interesa; lo usaremos a partir del tema 23.

En el tema 1 vimos que el comando tty responde con el nombre de la terminal en uso, algo como /dev/pts/0. Ahora se ve qué es: un archivo de dispositivo. Lo que un programa escribe en ese archivo aparece en tu ventana.

Estos archivos no ocupan espacio: no contienen datos, son puertas. Por eso en el listado largo tienen tipo c o b y, en lugar de tamaño, los dos números que vimos en el tema anterior.

Los archivos de disco no se abren para probar

Leer /dev/null o /dev/urandom es inofensivo. Escribir sobre /dev/sda destruye el contenido del disco, sin papelera y sin pregunta. El sistema lo impide a un usuario común, y es una de las razones por las que no se trabaja habitualmente como administrador.

10. /proc y /sys: ventanas al kernel

Estos dos directorios son distintos de todos los anteriores: no existen en el disco. Sus archivos no están guardados en ninguna parte. El kernel fabrica su contenido en el momento en que alguien los lee, con el estado del sistema en ese instante.

terminal (salidas abreviadas)
$ cat /proc/version
Linux version 6.8.0-45-generic (buildd@…) (x86_64-linux-gnu-gcc-13 …) #45-Ubuntu SMP …
$ head -3 /proc/meminfo
MemTotal:        8039916 kB
MemFree:         3482120 kB
MemAvailable:    5820344 kB
$ ls -l /proc/version
-r--r--r-- 1 root root 0 oct 12 11:20 /proc/version

El tercer comando delata el truco: el archivo tiene tamaño cero, y sin embargo cat mostró una línea entera. No hay contradicción. No hay nada almacenado; el texto se genera al leerlo. Si repites head -3 /proc/meminfo, los números de memoria libre habrán cambiado.

ArchivoInforma
/proc/versionLa versión del kernel.
/proc/cpuinfoLos procesadores.
/proc/meminfoEl uso de la memoria.
/proc/uptimeCuánto hace que arrancó el sistema, en segundos.
/proc/1234Un directorio por cada proceso en ejecución, con su número como nombre.
/proc/selfEl proceso que está leyendo: cada programa se ve a sí mismo.

Los directorios numerados permiten ver cualquier dato de un proceso. Uno de ellos conecta con el tema 6:

terminal, en ~/practica
$ ls -l /proc/self/cwd
lrwxrwxrwx 1 ana ana 0 oct 12 11:20 /proc/self/cwd -> /home/ana/practica

cwd es la sigla de current working directory. Allí está el directorio de trabajo, que dijimos que era un dato de cada proceso: el kernel lo expone como un enlace.

Muchos comandos que usaremos son, en el fondo, lectores de /proc que presentan esos datos de forma cómoda: ps y top recorren los directorios numerados, free lee meminfo, uptime lee uptime. El curso anterior, Fundamentos de Sistemas Operativos, usa estos archivos para observar el kernel por dentro.

/sys sigue la misma idea, dedicada al hardware y a los controladores: cada dispositivo conectado aparece como un directorio, con archivos que describen su estado. Por ejemplo, ls /sys/class/net lista las interfaces de red del equipo.

11. El resto de la raíz

Quedan los directorios que se visitan menos, pero que conviene reconocer:

DirectorioPara qué sirve
/bootContiene el kernel, un archivo llamado vmlinuz- seguido de la versión, y el cargador de arranque. No se toca a mano: lo mantiene el gestor de paquetes.
/runDatos de los servicios que están funcionando ahora. Vive en memoria y empieza vacío en cada arranque.
/mediaDonde aparecen las memorias USB y los discos externos al conectarlos: /media/ana/NOMBRE.
/mntUn lugar libre para que el administrador conecte un disco a mano, de forma provisoria.
/optProgramas de terceros que no siguen el reparto estándar y traen todo en una carpeta propia, como algunos navegadores y editores comerciales.
/srvDatos que el equipo sirve a otros. En un equipo personal suele estar vacío.
/snapEn Ubuntu, los programas instalados con el formato snap. Tema 36.
/lost+foundDonde la herramienta de reparación del disco deja los fragmentos de archivos que recupera. Normalmente está vacío.

/media y /mnt responden la pregunta que quedó pendiente en el tema 6: en un sistema con un solo árbol, un segundo disco se ve como un directorio. Al conectarlo, su contenido aparece «colgado» de uno de esos puntos. La operación se llama montar y es parte del tema 38.

En tu sistema puede haber algún nombre más. swap.img es un archivo, no un directorio: el espacio de intercambio que usa el kernel cuando falta memoria. Y cdrom es un resto de la instalación.

12. Dónde buscar cada cosa

El valor del mapa está en poder usarlo al revés: partir de una necesidad y saber adónde ir.

Busco…Miro en…
Un archivo mío~
La configuración de un programa, para todo el sistema/etc
La configuración de un programa, solo para mí~/.config, o un archivo oculto en ~
Por qué falló algo/var/log
Dónde está un comando/usr/bin o /usr/sbin; lo dice type
La documentación de un paquete/usr/share/doc
Un lugar para una prueba descartable/tmp
Una memoria USB recién conectada/media
Datos del procesador, la memoria o un proceso/proc
Qué ocupa el disco/var y /home, para empezar

Para un comando concreto, whereis muestra de una vez cómo se reparten sus archivos por el árbol:

terminal
$ whereis bash
bash: /usr/bin/bash /usr/share/man/man1/bash.1.gz

El ejecutable, en /usr/bin; la página del manual, en /usr/share/man, dentro del directorio de la sección 1. A eso se suman su configuración general en /etc/bash.bashrc y la tuya en ~/.bashrc. Cuatro lugares para un programa, cada archivo en el que le corresponde por su función: es la idea con la que empezó el tema.

13. Qué se puede tocar

El mapa sirve también para medir riesgos. No todos los directorios admiten el mismo trato:

Directorio¿Puedes escribir como usuario común?Criterio
~SíEs tuyo. El único riesgo es para tus propios archivos.
/tmpSíPara pruebas. Nada permanente.
/etcNoSe modifica como administrador, un archivo por vez, y conviene guardar una copia del original antes.
/usr, /bootNoLo administra el gestor de paquetes. No se crean ni se borran archivos a mano; la excepción es /usr/local.
/varNoLo escriben los programas. Se lee, sobre todo /var/log.
/proc, /sys, /devNoSe leen para obtener información. Escribir en ellos cambia el comportamiento del kernel o de un dispositivo.

La tabla tiene una lectura tranquilizadora. Como usuario común puedes mirar casi todo el sistema —listar, leer, explorar— sin posibilidad de dañarlo, porque los permisos te impiden escribir fuera de dos lugares. Explorar con cd, ls y cat es seguro, y es la mejor manera de aprender cómo está hecho un sistema.

El riesgo empieza cuando se antepone sudo a un comando: en ese momento las protecciones dejan de aplicarse. De ahí la regla que repetiremos: con sudo, antes de pulsar Enter se lee la línea completa, y sobre todo la ruta.

Hemos visto nombres de archivos de a uno. En el tema 9 aprendemos a nombrar muchos a la vez con los comodines, y a controlar con las comillas lo que la shell hace con cada carácter especial.

14. Resumen

15. Preguntas de repaso

Intenta responder cada una antes de abrir la respuesta.

1. ¿Con qué criterio se reparten los archivos de un programa en Linux?

Por función: el ejecutable va con los demás ejecutables, la configuración con las demás configuraciones, los registros con los demás registros. No se agrupan en una carpeta por programa.

2. ¿Qué es el FHS y qué ventaja da que las distribuciones lo sigan?

Es el estándar que define qué contiene cada directorio del sistema. Gracias a él, lo que se aprende en una distribución sirve en las demás: los archivos están en los mismos lugares.

3. ¿Qué diferencia hay entre /, /root y /home?

/ es el directorio raíz, el que contiene todo. /root es el directorio personal del administrador. /home contiene los directorios personales de los demás usuarios.

4. Un programa tiene configuración en /etc y en tu directorio personal. ¿Qué alcance tiene cada una?

La de /etc vale para todos los usuarios del equipo. La del directorio personal vale solo para ti, y tiene prioridad sobre la general.

5. ¿Qué tienen en común casi todos los archivos de /etc?

Son archivos de texto, que se pueden leer con cat y modificar con un editor.

6. ¿Qué diferencia hay entre /usr/bin y /usr/sbin?

bin contiene los programas de uso general, para cualquier usuario. sbin, los de administración del sistema.

7. ¿Por qué /bin/ls y /usr/bin/ls son el mismo archivo?

Porque /bin es un enlace simbólico a /usr/bin. Se conserva para que sigan funcionando los scripts que usan las rutas antiguas.

8. ¿Para qué sirve /usr/local?

Para los programas que el administrador instala por su cuenta. El gestor de paquetes no escribe allí, y en el PATH figura antes que /usr/bin, de modo que tienen prioridad.

9. Un servidor se quedó sin espacio en disco. ¿En qué directorio conviene mirar primero, y por qué?

En /var, en particular /var/log: es donde se acumulan los datos que los programas generan al funcionar.

10. ¿Por qué no hay que guardar archivos importantes en /tmp?

Porque su contenido se borra al reiniciar, y porque es un directorio compartido por todos los usuarios.

11. ¿Qué es /dev/null?

Un dispositivo simulado por el kernel que descarta todo lo que se escribe en él. Se usa para deshacerse de una salida que no interesa.

12. ls -l /proc/version muestra tamaño cero, pero cat muestra texto. ¿Cómo es posible?

Porque el archivo no está guardado en el disco. El kernel genera su contenido en el momento en que se lo lee.

13. Conectas una memoria USB. ¿Dónde aparece su contenido?

Dentro de /media, en un directorio con tu nombre de usuario y el nombre de la memoria. No aparece una unidad aparte, porque hay un solo árbol.

14. ¿En qué directorios puede crear archivos un usuario común?

En su directorio personal y en /tmp, además de /var/tmp. En el resto del sistema puede leer casi todo, pero no escribir.

Para practicar

  1. Ejecuta ls -l / y clasifica cada entrada: ¿directorio, enlace o archivo? ¿A qué grupo del diagrama pertenece?
  2. Abre man hier y compara su descripción de /usr/local y de /var/tmp con la de este tema.
  3. Muestra el contenido de /etc/os-release, /etc/hostname y /etc/shells. Intenta lo mismo con /etc/shadow y lee el mensaje de error.
  4. Lista /etc y cuenta cuántos directorios terminan en .d. Entra en uno y mira qué contiene.
  5. Con ls -lSh /usr/bin | head, averigua cuáles son los programas más grandes de tu sistema.
  6. Ejecuta ls -ltr /var/log. ¿Qué registro se modificó por última vez?
  7. Ejecuta cat /proc/uptime dos veces, con unos segundos de diferencia, y luego uptime. ¿Qué relación hay entre las salidas?
  8. Ejecuta ls -l /proc/self/cwd desde tres directorios distintos.
  9. Ejecuta tty y luego ls -l sobre la ruta que respondió. ¿De qué tipo es el archivo y quién es su dueño?
  10. Usa whereis con ls, passwd y tar, e indica a qué directorio del mapa corresponde cada ruta.