Estructura del árbol de directorios de Linux

January 17th, 2023

Si eres usuario familiarizado con un entorno Windows, la estructura del sistema de archivos de Linux puede parecerte particularmente extraña. Las letras de unidad y especialmente la unidad C:\ no existen, siendo reemplazadas por directorios como / y /mnt, la mayoría de los cuales tienen nombres de tres letras.

El Estándar de jerarquía del sistema de archivos (Filesystem Hierarchy Standard o FHS) define la estructura de los sistemas de archivos en Linux y otros sistemas operativos similares a UNIX. Sin embargo, los sistemas de archivos Linux también incluyen algunos directorios que no están definidos por el estándar.

En el sistema operativo Linux todo es un archivo, los directorios son archivos, los archivos son archivos e incluso los dispositivos como el ratón, el teclado, la impresora, etc, también son archivos. Podemos clasificarlos en tres tipos de archivos:

  • Archivos generales: también llamados archivos ordinarios. Puede ser una imagen, video, programa o archivos de texto simples. Estos tipos de archivos pueden estar en formato ASCII o binario. Es el archivo más utilizado en el sistema Linux.

  • Archivos de directorio: estos tipos de archivos son un almacén para otros tipos de archivos. Puede ser un archivo de directorio dentro de un directorio (subdirectorio).

  • Archivos de dispositivo: en un sistema operativo similar a Windows, los dispositivos como CD-ROM y los discos duros se representan como letras de unidad, mientras que en el dispositivo del sistema Linux se representan como archivos; por ejemplo, /dev/sda1, /dev/sda2 y así sucesivamente.

El sistema de ficheros raíz (/)

En un sistema Linux todo se encuentra en el directorio /, conocido como el directorio raíz. Podemos pensar que el directorio / es similar al C:\ en Windows, pero esto no es estrictamente cierto, ya que Linux no tiene letras de unidad. Mientras que en Windows otra partición se ubicaría en D:\, en Linux esta otra partición aparecería en otra carpeta bajo /.

Cualquier ruta a un archivo o carpeta en Linux comienza por el directorio raíz, seguido de todos los directorios y subdirectorios que lo contienen, separados cada uno de ellos por /.

linux1

A continuación, hablaremos en profundidad de los directorios más importantes en un sistema Linux.

Binarios esenciales de usuario (/bin)

El directorio /bin contiene los binarios de usuario esenciales (programas) que deben estar presentes cuando el sistema se monta en modo de usuario único, como catcd, cp, echogrepgzipkilllsmvrmpingsupstar y vi. Pueden ser utilizados tanto por el administrador del sistema como por los usuarios. También puede contener comandos que son utilizados indirectamente por scripts.

Aplicaciones como Firefox se almacenan en /usr/bin, mientras que los programas y utilidades importantes del sistema, como la shell bash, se encuentran en /bin. Colocar estos archivos en el directorio /bin garantiza que el sistema tenga estas utilidades importantes incluso si no hay otros sistemas de archivos montados.

El directorio /sbin es similar, aunque contiene binarios esenciales de administración del sistema, y que solamente pueden ser utilizados por el usuario root.

Ficheros de arranque estáticos (/boot)

El directorio /boot contiene los archivos necesarios para arrancar el sistema, por ejemplo, los archivos del gestor de arranque GRUB.

Por lo tanto, en /boot se almacenan datos que se utilizan antes de que el kernel comience a ejecutar programas en modo usuario. Esto puede incluir sectores de arranque maestro guardados.

Los programas necesarios para organizar el gestor de arranque para poder arrancar un archivo deben colocarse en /sbin. Los archivos de configuración para los cargadores de arranque que no son necesarios en el momento del arranque deben colocarse en /etc.

Punto de montaje histórico para CD-ROM (/cdrom)

El directorio /cdrom no es parte del estándar FHS, pero aún se puede encontrar en distribuciones Ubuntu y otros sistemas operativos.

Es una ubicación temporal para los CD-ROM insertados en el sistema. Sin embargo, la ubicación estándar para los medios temporales está dentro del directorio /media.

Ficheros de dispositivos (/dev)

Linux muestra los dispositivos como archivos, y el directorio /dev contiene una serie de archivos especiales que representan dispositivos. Estos no son archivos reales tal como los conocemos, aunque aparecen como archivos. Por ejemplo, /dev/sda representa la primera unidad SATA en el sistema.

Este directorio también contiene pseudo-dispositivos, que son dispositivos virtuales que en realidad no corresponden al hardware. Por ejemplo, /dev/random produce números aleatorios. En el caso de /dev/null es un dispositivo especial que no produce salida y descarta automáticamente toda la entrada. Cuando canalizamos la salida de un comando a /dev/null, lo que estamos haciendo es descartarla.

Ficheros de configuración (/etc)

El directorio /etc contiene archivos de configuración, que generalmente se pueden editar a mano en un editor de texto.

Debemos tener en cuenta que el directorio /etc/ contiene archivos de configuración de todo el sistema, pudiendo contener scripts ejecutables, como los scripts de comando comúnmente llamados por init para iniciar y apagar el sistema e iniciar procesos demonio (Daemon).

Un binario ejecutable en este contexto se refiere al código máquina directo o pseudocódigo que no está en un formato legible por humanos.

Los archivos de configuración específicos del usuario se encuentran en el directorio home de cada usuario.

Un archivo de configuración es un archivo local utilizado para controlar el funcionamiento de un programa. Debe ser estático y no puede ser un archivo binario ejecutable. Es recomendable que los archivos se almacenen en subdirectorios de /etc, y no directamente en /etc.

Directorios de usuario (/home)

El directorio /home contiene una carpeta particular para cada usuario. Por ejemplo, en mi caso el nombre de usuario es jlopez, teniendo una carpeta de inicio ubicada en /home/jlopez.

linux2

Esta carpeta particular contiene los archivos de datos del usuario y los archivos de configuración específicos del usuario. Cada usuario solo tiene acceso de escritura a su propia carpeta de inicio y debe obtener permisos elevados (convertirse en el usuario raíz) para modificar otros archivos en el sistema.

Las cuentas que no inician sesión (nologin) creadas con fines administrativos a menudo tienen sus directorios home en otros lugares.

En muchas distribuciones Linux es una práctica común el hecho de ubicar /home en una partición separada del resto.

En sistemas más pequeños, el directorio de inicio de cada usuario se implementa típicamente como un subdirectorio directamente bajo /home. En sistemas grandes (especialmente cuando los directorios /home se comparten entre muchos hosts que usan NFS) es útil subdividir los directorios de inicio del usuario. La subdivisión se puede hacer mediante el uso de subdirectorios como /home/empleados, /home/invitados, /home/operadores, etc.

Librerías esenciales compartidas (/lib)

El directorio /lib contiene las librerías necesarias para los binarios esenciales de la carpeta /bin y /sbin. Las librerías que necesitan los archivos binarios de la carpeta /usr/bin se encuentran en /usr/lib.

Puede haber una o más variantes del directorio /lib en sistemas que admiten más de un formato binario que requieren librerías separadas. Esto se usa comúnmente para el soporte de 64 bits o 32 bits en sistemas que admiten múltiples formatos binarios, pero requieren librerías del mismo nombre.

linux3

Ficheros recuperados (/lost+found)

Cada sistema de archivos Linux tiene un directorio lost+found. Si el sistema de archivos falla o corrompe, se realizará una comprobación del sistema de archivos en el siguiente arranque. Cualquier archivo dañado encontrado se colocará en el directorio /lost+found, para que pueda intentar recuperar la mayor cantidad de datos posible.

Dispositivos temporales (/media)

El directorio /media contiene subdirectorios donde se montan temporalmente los dispositivos multimedia extraíbles insertados en el equipo, ya sean unidades externas USB, otras particiones de disco, etc. Cuando inserta un CD en su sistema Linux, se crea automáticamente un directorio dentro del directorio /media, pudiéndose acceder al contenido del CD dentro de este directorio.

Históricamente se han utilizado otros directorios para montar medios extraíbles como /cdrom, /mnt o /mnt/cdrom. Habilitar los puntos de montaje para todos los medios extraíbles directamente en el directorio raíz puede resultar en un gran número de directorios adicionales en /. A pesar de que el uso de subdirectorios en /mnt como punto de montaje ha estado muy extendido, entra en conflicto con una tradición más antigua de usar /mnt directamente como un punto de montaje temporal.

Puntos de montaje temporal (/mnt)

El directorio /mnt es donde los administradores del sistema siempre han montado sistemas de archivos temporales mientras los usaban. Por ejemplo, si se monta una partición de Windows para realizar algunas operaciones de recuperación de archivos, podemos montarla en /mnt/windows. Sin embargo, podemos montar otros sistemas de archivos en cualquier lugar del sistema.

Este directorio no debe ser utilizado por los programas de instalación; en su lugar, se debe utilizar un directorio temporal adecuado que no esté en uso por el sistema.

Paquetes opcionales (/opt)

El directorio /opt contiene subdirectorios para paquetes de software opcionales. Es comúnmente utilizado por software propietario que no está basada en la jerarquía estándar del sistema de archivos.

Los directorios /opt/bin, /opt/doc, /opt/include, /opt/info, /opt/lib y /opt/man están reservados para uso del administrador del sistema.

Los archivos de paquete que son variables (cambian en el funcionamiento normal) deben instalarse en /var/opt. No debería existir ningún otro archivo de paquete fuera de los directorios /opt, /var/opt y /etc/opt, excepto aquellos que deben permanecer en ubicaciones específicas dentro del árbol del sistema de archivos para funcionar correctamente. Por ejemplo, los archivos de bloqueo de dispositivo deben colocarse en /var/lock.

Ficheros de proceso y kernel (/proc)

El directorio /proc es parecido al directorio /dev porque no contiene archivos estándar. Contiene toda la información de un sistema Linux, incluyendo el kernel, procesos y parámetros de configuración.

El directorio /proc es creado cada vez que se arranca el sistema. Se requiere tener privilegios de root para poder examinar el directorio en su totalidad. Algunos de los archivos (tales como los relacionados a procesos) son propiedad del usuario con el que ejecuta.

Directorio home de usuario root (/root)

El directorio /root es el directorio principal del usuario root. En lugar de estar ubicado en /home/root, se encuentra en /root. Hay que tener en cuenta que es distinto de /, que, como hemos comentado anteriormente, es el directorio raíz del sistema.

Archivos estado de aplicación (/run)

El directorio /run proporciona a las aplicaciones un lugar estándar donde almacenar archivos transitorios como sockets e identificadores de proceso (PID). Estos archivos no se pueden almacenar en /tmp ya que podrían ser eliminados.

Binarios de administración de sistema (/sbin)

El directorio /sbin es similar al directorio /bin. Contiene binarios esenciales que generalmente están destinados a ser ejecutados por el usuario root para la administración del sistema, como arrancar, restaurar, recuperar y/o reparar el sistema.

La división entre /bin y /sbin no se llevó a cabo por razones de seguridad o para evitar que los usuarios vean el sistema operativo, sino para separar los binarios que todos los usuarios usan y los que se usan principalmente para tareas de administración. No hay ninguna ventaja de seguridad inherente en hacer que /sbin esté fuera del alcance de los usuarios.

Datos de servicio (/srv)

El directorio /srv está destinado a almacenar archivos y directorios relativos a servicios que podemos tener instalados en el sistema, ya sea un servidor web, un servidor FTP, CVS, etc. Por ejemplo, si estuviéramos utilizando el servidor web Apache para servir un sitio web, probablemente almacenaríamos los archivos del sitio web en un directorio dentro del directorio /srv.

Ficheros temporales (/tmp)

Las aplicaciones almacenan archivos temporales en el directorio /tmp. Estos archivos normalmente se eliminan cada vez que se reinicia el sistema y pueden ser borrados en cualquier momento.

Los programas no deben asumir que los archivos o directorios en /tmp se conservan entre invocaciones del programa.

En este sentido, /var/tmp está destinado igualmente al almacenamiento de archivos temporales, cuyo contenido no se borra de forma automática tras el reinicio del sistema.

Binarios de usuario y datos de solo lectura (/usr)

El directorio /usr es la segunda sección más importante del sistema de archivos, cuyos datos se pueden compartir y son de solo lectura. Contiene aplicaciones y archivos utilizados por los usuarios, a diferencia de las aplicaciones y archivos utilizados por el sistema.

Por ejemplo, las aplicaciones no fundamentales se encuentran dentro del directorio /usr/bin en lugar del directorio /bin y los binarios de administración del sistema no fundamentales se encuentran en el directorio /usr/sbin en lugar del directorio /sbin.

Las librerías para cada uno se encuentran dentro del directorio /usr/lib. El directorio /usr a su vez contiene otros directorios, por ejemplo /usr/share. El directorio /usr/local es donde se instalan las aplicaciones compiladas localmente de forma predeterminada, esto evita que pueda afectar al resto del sistema.

Ficheros de datos variables (/var)

El directorio /var contiene archivos de datos variables. Los archivos de registro y todo lo demás que normalmente se escribiría en /usr durante el funcionamiento normal se escriben en el directorio /var. Por ejemplo, encontraremos archivos de registro en /var/log.

Varios directorios están reservados en el sentido de que no deben ser utilizados arbitrariamente por alguna nueva aplicación, ya que entrarían en conflicto con la práctica histórica. Estos directorios reservados son: /var/backups, /var/cron, /var/msgs y /var/preserve.

Los siguientes directorios o enlaces simbólicos a directorios son necesarios en /var:

linux4

Conclusión

En el presente artículo hemos detallado sólo los directorios más utilizados. Para obtener una lista más completa y ampliada, recomendamos consultar el ya mencionado Filesystem Hierarchy Standard.

Conocer, aunque solo sea por encima, el significado de cada uno de los directorios en Linux te puede ayudar a entender ciertos comandos o a realizar ciertos pasos que requieren acceder a un fichero dentro de un directorio.