Algoritmos y Estructuras de Datos Compiladores e Intérpretes Herramientas Lenguaje de programación
!Prog C/C++
Linux Matemáticas
Mates Discretas
Programación Orientada a Objetos Redes y Computación Distribuida Sistemas Operativos

Estructura de directorios

[date: 13-06-2023] [last modification: 09-01-2025]
[words: 3745] [reading time: 18min] [size: 42590 bytes]

La estructura de archivos de Linux es bastante diferente a la de Windows, y quizás un poco contraintuitiva; pero en este post se explica con detalle qué es cada carpeta y qué se debería almacenar en ella.

Resumen

/                     Directorio raíz del sistema, todo cuelga de aquí
bin   -> /usr/bin     Binarios de programas
sbin  -> /usr/sbin    Binarios del sistema (solo root)
lib   -> /usr/lib     Librerías de los programas y módulos del kernel
libXX -> /usr/libXX   Librerías en otros formatos
usr
    |-> bin, sbin, lib, libXX
    |-> games         Archivos de videojuegos
    |-> include       Archivos de cabecera (.h .hpp) para compilar
    |-> src           Código de fuente por referencia (normalmente del kernel)
    |-> share         Datos independientes de la plataforma
    |   |-> misc      Archivos únicos de aplicaciones
    |   |-> man       Documentos para el manual
    |-> local         Programas compilados localmente sin el package manager
        |-> bin       Binarios instalados localmente
        |-> sbin      Binarios del sistema instalados localmente
        |-> lib       Librerías locales
        |-> etc       Configuración de programas locales
        |-> games     Archivos de videojuegos locales
        |-> include   Archivos de cabecera locales
        |-> man       Documentación del programa man de programas locales
        |-> share     Datos independientes de la plataforma
        |-> src       Código fuente local
------------------------------------------------------------------
etc     Configuración a nivel del sistema
opt     Paquetes de software autocontenidos
------------------------------------------------------------------
root    Carpeta personal del usuario root
home    Carpetas personales de los usuarios (~)
    |-> .cache      $XDG_CACHE_HOME   Datos no esenciales
    |-> .config     $XDG_CONFIG_HOME  Configuración del usuario
    |-> .local
        |-> bin                           Ejecutables del usuario (en PATH)
        |-> share   $XDG_DATA_HOME        Datos del usuario
        |-> state   $XDG_STATE_HOME       Logs, historiales, archivos recientes...

    |-> Desktop     $XDG_DESKTOP_DIR      Archivos que aparecen en el escritorio
    |-> Downloads   $XDG_DOWNLOAD_DIR     Descargas de navegadores
    |-> Templates   $XDG_TEMPLATES_DIR    Plantillas para crear nuevos archivos
    |-> Public      $XDG_PUBLICSHARE_DIR  Documentos públicos
    |-> Documents   $XDG_DOCUMENTS_DIR    Documentos personales
    |-> Music       $XDG_MUSIC_DIR        Música
    |-> Pictures    $XDG_PICTURES_DIR     Fotografías
    |-> Videos      $XDG_VIDEOS_DIR       Vídeos
------------------------------------------------------------------
srv     Datos de servicios de este sistema
tmp     Archivos temporales
var     Datos variables (logs, BD, archivos de impresión)
svr     Datos para servidores y servicios
------------------------------------------------------------------
boot    Archivos del boot loader incluyendo el kernel
mnt     Punto de montaje para sistemas de archivos (manual)
media   Punto de montaje para unidades externas
dev     Device files: pseudo-archivos de acceso a periféricos
proc    Información del sistema (CPU, memoria...) y sus procesos
sys     Información de dispositivos (brillo de pantalla, carga de batería)
run     Datos relevantes de procesos en ejecución

Introducción

El sistema de archivos de Linux es diferente a Windows, y seguramente este sea uno de los temas más fundamentales que un usuario experto debería conocer.

Antes de Windows, Linux y los otros sistemas modernos que se conocen hoy en día; existía DOS (Disk Operating System). Era únicamente CLI, sin GUIs. Sin embargo, era posible instalar Windows por encima de DOS.

Para las unidades de memoria se utilizan:

En DOS podías instalar tus programas donde al usuario le pareciese. Windows, sin embargo, se instalaba en su propia carpeta: Windows. Con el paso del tiempo, Windows se independizó de DOS y la estructura de archivos se mantuvo más o menos igual.

En cambio, Linux es diferente. Por ejemplo, puedes tener múltiples archivos cuya única diferencia sea una letra mayúscula o minúscula:

Esto está permitido en Linux, pero no en Windows. De la misma forma, los usuarios de Apple se sentirán más cómodos con la estructura de archivos de Linux, ya que evolucionaron desde el mismo lugar: Unix.

Nota

Por cierto, esta estructura se encuentra recogida en el FHS (Filesystem Hierarchy Standard).

No todas las distribuciones Linux siguen el estándar (por ejemplo NixOS), pueden haber pequeñas variaciones. Pero por lo general, esto se cumple.

El sistema de archivos

Se pueden distinguir dos tipos:

ShareableUnshareable
Estático/usr/etc
/opt/boot
Variable/var/mail/var/run

Usuarios

/home

Nota
Para escribir más rápido la carpeta del usuario /home/magno (por ejemplo) usa ~. También se puede usar la variable $HOME.

Aquí dentro cada usuario tiene su propia carpeta. Allí puede guardar sus documentos y otros, como la carpeta personal de Windows.

Puede que sea una buena idea también colocar esta carpeta en una nueva partición de disco, por si ocurre algo con el sistema principal, tus documentos importantes estén seguros. De la misma forma, puede ser buena idea montar un sistema de copias de seguridad.

Dotfiles de usuario

freedesktop.org (antes llamados Cross Desktop Group, XDG) es un proyecto que trabaja en la tecnología base que comparten los entornos de escritorio gratuitos para el X Window System (X11) y Wayland en sistemas basados en Unix2. Tienen muchas especificaciones y utilidades intentando estandarizar la experiencia de usuario dentro de un entorno de escritorio, en concreto la especificación XDG Base Directory describe la estructura de la carpeta del usuario.

Para ello, se crean algunas variables de entorno donde se espera que los datos del usuario se encuentren, para que las aplicaciones sepan donde están los documentos y donde pueden guardar la configuración específica del usuario.

Por defecto, solo XDG_RUNTIME_DIR tiene un valor asignado (debido a pam_systemd(8)). El resto de variables, es responsabilidad del usuario definirlas según la especificación3. Sin embargo, si no están definidas, los programas compatibles deberán utilizar los valores por defecto. Por tanto, solo es útil definir las variables si se decide cambiar los valores predeterminados.

Importante

No todos los programas siguen la especificación, de hecho, solo unos pocos. Este problema da lugar al dotfile madness, donde el usuario tiene los archivos de configuración de programas por todas partes. No es para tanto, dado que la mayoría simplemente se almacenan en ~/.<programa>.

En la Arch Wiki hay una lista de programas, indicando cuáles siguen el estándar y cuáles no.

Las variables más importantes son:

VariableValor por defectoDescripción del contenido
$XDG_DATA_HOME~/.local/shareDatos shareables
$XDG_CONFIG_HOME~/.configConfiguración (análogo a /etc).
$XDG_STATE_HOME~/.local/stateEstado del usuario como logs, historiales, archivos recientes, etc.
$XDG_CACHE_HOME~/.cacheDatos no esenciales (caché) del usuario (análogo a /var/cache).
$XDG_RUNTIME_DIRArchivos runtime y otro tipo de objetos como sockets

Estos directorios son únicos: no existen otras localizaciones dónde almacenar ese tipo de archivos.

También hay otro directorio para almacenar ejecutables del usuario, por defecto en ~/.local/bin. La distribución se debe asegurar que estos directorios estén en PATH. Hay que tener cuidado cuando /home se comparta entre varios sistemas, es posible que los ejecutables no funcionen allí.

Carpetas estándar

Además de estos archivos, la gente de freedesktop.org provee de la utilidad xdg-user-dirs, que ayuda a manejar los conocidos directorios del usuario:

Los nombres describen bastante bien el significado del directorio, excepto Templates y Public, que pueden ser un poco confusos.

Nota

En KDE con Dolphin, la creación de plantillas es algo más complicado. En la carpeta ~/.local/share/templates crea un archivo .desktop por cada plantilla de la siguiente forma:

[Desktop Entry]
Name    = Nombre que aparecerá en el menú "Create new" de Dolphin
Comment = Texto que aparece cuando se le da un nombre
URL     = $HOME/Templates/plantilla
Type    = Link
Icon    = $HOME/icon.png

Esta utilidad lee el archivo de configuración $XDG_CONFIG_HOME/user-dirs.dirs, que permite al usuario cambiar estos últimos. Simplemente edita este archivo con el nuevo valor que se desee, como traducir los títulos. Este es mi el mio:

XDG_DESKTOP_DIR="$HOME"
XDG_DOWNLOAD_DIR="$HOME/Downloads"
XDG_TEMPLATES_DIR="$HOME/Templates"
XDG_PUBLICSHARE_DIR="$HOME/Public"
XDG_DOCUMENTS_DIR="$HOME/Files"
XDG_MUSIC_DIR="$HOME/Music"
XDG_PICTURES_DIR="$HOME/Images"
XDG_VIDEOS_DIR="$HOME/Videos"

De esta forma, desde la terminal, puedo escribir una letra en la terminal y usar tabulador para moverme rápidamente entre mis archivos.

Si deseas recuperar los valores por defecto, estos están en /etc/xdg/user-dirs.defaults. Además, si deseas eliminar un directorio, no borres o comentes la línea, simplemente déjalo a $HOME.

Ojo, el comando xdg-user-dirs-update no crea las carpetas, simplemente verifica que el archivo de configuración es correcto y está actualizado.

Todo este sistema puede ser útil para algunas aplicaciones, que consulten el user-dirs.dirs para ver donde colocar los archivos. Repito, esto solo es un estándar y puede que algunos programas no lo usen.

/root

Esta es la carpeta personal del usuario root. Puedes guardar archivos sin ningún problema, mientras seas el usuario root: sudo su.

/usr

Originalmente en Unix aquí se almacenaban las carpetas de los usuarios, al igual que ahora sucede con home. Pero actualmente su uso ha disminuido a solamente «programas que puede usar el usuario y otros datos»: contiene binarios del sistema, documentación, librerías, archivos de cabecera… El acrónimo «oficial» es Unix System Resources.

En esta carpeta se almacena la mayoría del contenido, por lo tanto es una de las más importantes. En su interior podemos encontrar los sub-directorios obligatorios de los apartados siguientes.

Según el estándar, los tipos de archivos que contiene se catalogan como shareables y de solo lectura instalados por la distribución.

Son solo de lectura (salvo por instalación o actualización) porque los archivos de configuración van en /etc.

/usr/bin

Nota
Ver también /bin para más detalles.

bin es la forma corta de binaries, que quiere decir archivos binarios o programas. Contiene los comandos que puede usar tanto el administrador del sistema como los distintos usuarios.

Además, si un programa se instala con el package manager de tu distro (pacman, apt, etc), también acabará aquí.

No debe haber subdirectorios en /usr/bin.

/usr/sbin

Por otro lado, sbin también almacena programas, pero estos son mucho más sensibles, ya que se tratan de los ejecutables del administrador (system admin). Estos archivos están restringidos al super-usuario y no pueden ser utilizados por otros.

Estos binarios son esenciales para iniciar, recuperar y/o reparar el sistema; como por ejemplo shutdown, fdisk, getty, ifconfig y mkfs. Más ejemplos aquí.

El único requerimiento del estándar es que no existan subdirectorios dentro de esta carpeta.

Nótese que los programas de este tipo localmente instalados deben ir en /usr/local/sbin.

Nota
PATH guarda alguna de estas direcciones para saber donde buscar los programas del terminal. Usa which para conocer su carpeta concreta de un comando.

/usr/lib

Finalmente; lib, lib32, lib64 y otras variantes son directorios en los que se almacenan las librerías de determinados programas. Estos son otros archivos binarios que añaden funcionalidad a algunas aplicaciones.

También es útil para poder compilar de forma sencilla, ya que el linker mirará por defecto en ellas:

gcc -o exe main.c -llibreria

Y la librería en cuestión está en /usr/lib/liblibreria.so.

Nota
Los paquetes del kernel generalmente se instalan en /usr/lib/modules/*

/usr/local

El motivo de hacer esta separación es el de tener otro directorio usr que se pueda montar en solo lectura en algún otro lugar. Sin embargo, hoy en día, solo se usa para guardar programas de terceros o autocompilados.

Es utilizado por el administrador del sistema para instalar software localmente, de esta forma está seguro de sobreescrituras cuando los programas de sistema se actualizan.

Este incluye (y ninguno más):

Tienen el mismo uso que los que ya se describieron

Tras una instalación limpia, estas carpetas deben estar vacías.

/usr/share

Esta carpeta contiene archivos de solo lectura que se pueden compartir y archivos independientes de la arquitectura de software: documentación, iconos, fuentes, imágenes de fondo… Sin embargo, no está pensada para compartir con otros sistemas operativos.

Cualquier programa o paquete que contenga o necesite datos que no tengan que ser modificados también se pueden guardar aquí (o en /usr/local/share).

Se recomienda que se cree un subdirectorio para los datos correspondientes, y si la aplicación solo guarda un único archivo, debe guardare en /usr/share/misc.

Algunas subcarpetas importantes:

Y más como: color, dict, locale, nls

Otros

/bin, /sbin y /libXX

En 1970, en el sistema Unix, los discos tenían bastante poco espacio. Los binarios del sistema ocupaban cada vez más, tanto que se necesitaban varios discos para ellos.

Los desarrolladores tuvieron que separarlos en varias carpetas para poder montarlos por separado. Cuando /bin estaba lleno, se instalaba en /usr/bin, que por aquel momento era la carpeta del usuario.

Después, se intentaron montar justificaciones arbitrarias sobre lo que debía ir en /bin frente a /usr/bin, pero de forma informal:

Lo mismo sucedía para /lib.

Con el paso del tiempo, las carpetas de los usuarios se mezclaban con las del sistema, por lo que finalmente se movieron a la nueva carpeta de /home y mantener /usr para «cosas del sistema».

Luego apareció el estándar FHS, que decidió formalizar este estándar. Por tanto, los nombres Unix Source Repository o Unix System Resources con solo para «parchear» el problema de que originalmente era de user.

Actualmente, estas carpetas se conservan por algunos programas que todavía utilizan estas direcciones. Por eso en distribuciones actuales de Linux, son solamente enlaces simbólicos a /usr/bin, /usr/sbin y /usr/libXX; cuyo propósito es el mismo.

Esto hace que el sistema sea más compatible con Unix y se simplifica la jerarquía de carpetas: anteriormente era necesario diferenciar los programas a nivel de equipo o usuario y esencial o no esencial.

Fuente: AskUbuntu

/opt

Significa optional. Aquí es donde se instala software manualmente e incluso los programas que has hecho tú mismo, pero que sea self-contained. Esto significa que el programa no se separa en bin, lib, share, etc y que le llega con tener una única carpeta. Suelen ser programas comerciales.

Cada paquete debe ir en /opt/<paquete> o /opt/proveedor.

/etc

Finalmente se ha confirmado que el nombre de esta carpeta quiere decir etcétera. Aquí es donde se guardas todas las configuraciones de programas a nivel de todo el sistema, no de un solo usuario.

Requerimientos del estándar4:

Por ejemplo, allí podrás encontrar información sobre el package manager apt: en esta carpeta se guarda la lista de los repositorios, paquetes instalados y sus archivos de configuración.

Lista de algunos archivos de configuración más importantes:

Usuarios y grupos:

Redes:

Package managers:

Otros:

Otros ejemplos de archivos aquí.

Nótese que la disposición de algunos archivos pueden cambiar dependiendo de la propia distribución. Consulta la documentación de cada uno para obtener más detalles.

/svr

Datos específicos que utilizados por servidores que se estén ejecutando en el sistema.

/var

Este es el directorio variable, contiene carpetas y archivos dedicados a guardar datos que suelen aumentar en tamaño, como logs de sistema, caché y demás.

/tmp

Lugar para almacenar datos temporalmente durante una sesión. Por ejemplo, si estás escribiendo un archivo en un programa de ofimática, es posible que el programa guarde copias de seguridad regularmente, por si ocurre un error, se va la luz u otros inconvenientes. Luego podrás recuperar esos datos.

Generalmente se borra al reiniciar el sistema.

Sistema

/boot

Contiene las imágenes de vmlinuz y initramfs, además de la configuración del bootloader y cualquier otro tipo de información que se necesite antes de que el kernel ejecute programas de usuario.

Solo es necesario que esté presente durante el arranque y durante la actualización del kernel (se necesita regenerar el initramfs).

Normalmente se utiliza el formato FAT32 para evitar que los bootloaders no conozcan las nuevas características de los sistemas de archivos.

Aquí se guardan los archivos que necesita el sistema operativo para encenderse (ejecutables del bootloader) y el propio kernel. Por este motivo, no es recomendable toquetear los archivos de este directorio. Normalmente es una partición separada.

/media y /mnt

/media y /mnt son los directorios en donde el sistema monta los dispositivos como USBs, floppy disks, discos duros externos, CDs y demás. Las distribuciones actuales de Linux los montan automáticamente unidades externas removibles en la carpeta de /media.

Por lo tanto, el USB que insertes estará en /media/<usuario>/<nombre del dispositivo>. Pero si quieres montar algo manualmente con el comando mount, déjalo en /mnt

/dev

En este directorio, el kernel de Linux almacena pseudo-archivos, que representan dispositivos (de ahí el nombre devices) y pseudo-dispositivos.

Algunos ejemplos de dispositivos:

Ejemplos de pseudo-dispositivos:

/proc

proc de procedures. Contiene información de todos los procesos que se están ejecutando en el momento, que principalmente son pseudo-archivos. No son archivos del disco realmente, el kernel los traduce a archivos, por lo que no ocupan espacio.

Cada uno de estos procesos tendrá un subdirectorio con el nombre del identificador del proceso (PID):

/proc es una elegante interfaz con el espacio de direcciones de cada proceso. Permite a un usuario leer y modificar el espacio de direcciones de otro proceso y realizar tareas de control sobre el mismo, simplemente usando la interfaz del sistema de archivos.

Paralelamente puedes encontrar información sobre propio sistema:

Directorios con más información:

/sys

De forma similar a /proc, da información sobre los dispositivos conectados, como el nivel de la batería, el brillo de la pantalla, etc.

/run

Funciona en RAM, lo que significa que todo se borrará al apagar el ordenador. Aunque diferentes distribuciones lo utilizan de formas un poco diferentes, generalmente sirve para guardar datos al iniciar la máquina, usuarios conectados y deamons en ejecución.

Dudas frecuentes

¿Dónde instalar programas?

Instalado por el sistemaInstalado por el administrador/usuario
Todo el sistema/usr/bin/usr/local/bin
Solo un usuario~/.local
Si es self-contained/opt~/.local/opt

Cuando digo bin, también me refiero a otros directorios como lib, share o include. Por este motivo, casi siempre se repite la misma estructura en varios sitios.

Un programa self-contained es aquel que no se separa entre estas carpetas y solamente se instala en una sola (como más o menos sucede en Windows).

Cuando un usuario (o el administrador) instala un programa desde su código fuente, es decir:

./configure
make
sudo make install

Generalmente el valor por defecto es /usr/local. Solo se cambia si el usuario lo quiere instalar solo para sí mismo:

./configure --prefix=$HOME/.local
Nota
flatpak y snaps se colocan en directorios completamente diferentes.

¿Dónde está mi configuración?

Si el programa sigue el estándar de FHS y freedesktop.org:

De lo contrario, deberías consultar la documentación del programa, aunque podrías empezar mirando por algo como ~/.<programa> o ~/.<vendor>.

Anterior: Instalación Volver a Linux Siguiente: Shell y Bash