Algoritmos y Estructuras de Datos Herramientas Lenguaje de programación
!Prog C/C++ Rust
Linux Matemáticas
Mates Discretas
Programación Orientada a Objetos Sistemas Operativos

Estructura directorios

[date: 13-06-2023 00:00] [last modification: 08-01-2024 22:05]
[words: 3045] [reading time: 15min] [size: 37495 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.

Fuente: vídeo de DorianDotSlash y documentación de FHS.

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.

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

Otra nota, no todas las distribuciones Linux siguen este patrón, pueden haber pequeñas variaciones. Pero por lo general, esto se cumple.

Resumen

bin   -> /usr/bin     Binarios esenciales: ls, cat, uname
sbin  -> /usr/sbin    Binarios del sistema esenciales (solo root)
lib   -> /usr/lib     Librerías esenciales y módulos del kernel
libXX -> /usr/libXX   Otros formatos de librerías esenciales
usr
    |-> bin, sbin, lib, libXX
    |-> local         Datos no esenciales y 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
    |   |-> share     Datos independientes de la plataforma
    |   |-> src       Código fuente local
    |-> share         Datos independientes de la plataforma, datos de
    |   |             aplicaciones, etc.
    |   |-> misc      Archivos únicos de aplicaciones
    |-> games         Archivos de videojuegos
    |-> include       Archivos de cabecera (.h .hpp) para compilar
    |-> src           Código de fuente por referencia
------------------------------------------------------------------
etc     Configuración del sistema
opt     Paquetes de software adicionales o instalado manualmente
------------------------------------------------------------------
boot    Archivos estáticos del boot loader (NO TOCAR)
mnt     Punto de montaje para sistemas de archivos (manual)
media   Punto de montaje para unidades externas
dev     Device files
run     Datos relevantes de procesos en ejecución
srv     Datos de servicios de este sistema
tmp     Archivos temporales
var     Datos variables
svr     Datos para servidores
------------------------------------------------------------------
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

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 ~.

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.

$HOME/.config, $HOME/.local, etc

freedesktop.org (antes llamados Cross Desktop Group, XDG) es un proyecto que trabaja en en la tecnología base que comparten los entornos de escritorio gratuitor para el X Window System (X11) y Wayland en Linux y otros 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.

Conceptos básicos:



Por defecto, solo XDG_RUNTIME_DIR tiene un valor debido a pam_systemd(8); para el resto es responsabilidad del usuario definirlas según la especificación3. Sin embargo, si no están definidas, se toma el valor por defecto; por tanto, solo es útil definir las variables si se decide cambiar lo predeterminado.

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.

$HOME/Downloads, $HOME/Templates, $HOME/Documents

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:

1[Desktop Entry]
2Name    = Nombre que aparecerá en el menú "Create new" de Dolphin
3Comment = Texto que aparece cuando se le da un nombre
4URL     = $HOME/Templates/plantilla
5Type    = Link
6Icon    = $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:

1XDG_DESKTOP_DIR="$HOME"
2XDG_DOWNLOAD_DIR="$HOME/Downloads"
3XDG_TEMPLATES_DIR="$HOME/Templates"
4XDG_PUBLICSHARE_DIR="$HOME/Public"
5XDG_DOCUMENTS_DIR="$HOME/Files"
6XDG_MUSIC_DIR="$HOME/Music"
7XDG_PICTURES_DIR="$HOME/Images"
8XDG_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

En versiones de Unix anteriores 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…

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

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.

/usr/bin

Ver también /bin

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.

Son obligatorios los siguientes comandos:

cat        Contatenar archivos con stdout
chgrp      Cambiar el dueño del grupo del archivo
chmod      Cambiar los permisos de un archivo
chown      Cambiar el dueño y grupo de un archivo
cp         Copiar archivos y directorios
date       Mostrar y configurar la fecha del sistema
dd         Copiar y convertir un archivo
df         Uso de espacio en disco
dmesg      Mostrar o controlar el buffer de mensajes del kernel
echo       Mostrar una línea de texto
false      Hacer nada en fracaso
hostname   Mostrar o configurar el nombre del host del sistema
kill       Enviar señales a procesos
ln         Crear enlaces simbólicos entre archivos
login      Iniciar una sesión en el sistema
ls         Listar contenidos de los directorios
mkdir      Crear directorios
mknod      Crear bloques u otros archivos especiales
more       Paginar texto
mount      Montar sistemas de archivos
mv         Mover o renombrar archivos
ps         Mostrar procesos y su estado
pwd        Mostrar la carpeta de trabajo
rm         Borrar archivos o directorios
rmdir      Borrar directorios vacíos
sed        Editor de stream
sh         Shell de comandos compatible con POSIX
stty       Configurar la terminal
su         Cambiar el ID de usuario
sync       Flush los buffers del sistema de archivos
true       Hacer nada en éxito
umount     Desmontar sistemas de archivos
uname      Mostrar información del sistema

Y entre otros muchos, los siguientes opcionales:

ed        Editor ed
tar       Crear archivos tar
gzip      Comprimir archivos
gunzip    Descomprimir archivos
zcat      Descomprimir archivos
netstat   Mostrar estadísticas de red
ping      Probar ICMP

/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.

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.

Estas carpetas también suelen estar en la PATH para poder compilar de forma sencilla:

1gcc -o exe main.c -llibreria

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

/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

Binarios y configuración

/bin, /sbin y /libXX

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.

/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.

Otros ejemplos de archivos aquí.

/opt

Significa opcional. Aquí es donde se instala software manualmente e incluso los programas que has hecho tú mismo.

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

Los directorios

están reservados para el uso del administrador, dado que los programas que ejecute el usuario deben seguir el patrón de /opt/<paquete>.

Tras una instalación limpia esta carpeta debería estar vacía.

Sistema

/boot

Aquí se guardan los archivos que necesita el sistema operativo para encenderse (boot), en otras palabras, aquí están los ejecutables del bootloader. Por este motivo, no es recomendable toquetear los archivos de este directorio. Normalmente es una partición separada.

/dev

Quiere decir devices o dispositivos. En Linux (y también en Unix), todo es un archivo: desde un archivo de texto en el que guardas las contraseñas de tus redes sociales, USBs, teclados, discos duros, etc.

Los drivers, el kernel y determinadas aplicaciones acuden a este directorio para saber con qué dispositivos cuenta tu ordenador. Por ejemplo, un disco sería sda y una partición sda1, sda2

/media y /mnt

Media y mount son los directorios en donde el sistema coloca los dispositivos como USBs, floppy disks, discos duros externos, CDs y demás. Las distribuciones actuales de Linux los montan automáticamente 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/

/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

Este es el sitio donde las aplicaciones guardan 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.

/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). Cada uno de estos procesos tendrá un sub-directorio con el nombre del identificador del proceso (ID).

Paralelamente puedes encontrar información sobre el CPU (/proc/cpuinfo) u otras utilidades (/proc/uptime).

/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.

/sys

Es la carpeta para interactuar con el kernel, y es similar al directorio /run.

/svr

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

Comparación con Windows

En Windows, cada dispositivo conectado es una unidad de ficheros diferente, empezando por la letra C, que es donde está Windows instalado.

En C:

Anterior: Archivos de link Volver a Linux Siguiente: Awesome WM