Organización de ficheros en GNU/Linux : el FHS

Hace mucho tiempo, cuando empece ha utilizar sistemas GNU/Linux me quede sorprendido con su extraordinario sistema de directorios, denominado FHS (por sus siglas en ingles).
Un estándar que nos dice donde, y por qué deben estar los distintos tipos de datos en un sistema de ficheros en un sistema UNIX.

Echemos un vistazo a la organización en el caso de GNU/Linux.

Dentro de cada sistema UNIX hay una organización diferente del sistema de ficheros, aunque similar. Entonces también se decidió que los sistemas GNU/Linux también debían tener una organización de ficheros oficial, y documentada, de hay surgió el estándar FHS.

¿que es FHS?
Las siglas significa Filesystem Hierarchy Standard, «Jerarquía Estándar de Sistema de Ficheros». Esto nos dice donde, y por qué deben estar los distintos tipos de datos en el sistema de ficheros.

Los sistemas UNIX establecieron una estructura estándar de directorios, con pequeñas variaciones entre ellos. Los directorios /etc, /usr, /home y /var (entre otros) se pueden encontrar en cualquier sistema que desee acercarse a UNIX.
Llegada la madurez del sistema, y con ello las distintas distribuciones de GNU/Linux se vio la necesidad de crear una referencia oficial, un estándar por el que las distribuciones y los desarrolladores se pudieran guiar a la hora de implementar programas. La primera versión de este documento apareció en 1994, y se llamaba FSSTND.
En 1999 se hizo una revisión del documento, para que la referencia no solo valieses para GNU/Linux , sino para cualquier sistema UNIX, y se creo el FHS

Fundamentos del FHS.

FHS divide los directorios del sistema en dos ejes, apto o no apto para ser compartido, y variable o estático. Los directorios aptos para ser compartidos los que no contienen información especifica al equipo donde están o sus programas; los no aptos son los que contienen este tipo de información. Los directorios estáticos son aquellos que contienen información que no cambian sin la intervención directa del administrador: programas, documentación, etc….; los variables son aquellos que cambian, como bases de datos o sistemas de correo.

Ahora ya se puede decidir tomar decisiones a la hora de administrar las partes del sistema de ficheros. Los directorios estáticos, y aptos para ser compartidos serán montados en modo de solo lectura, y exportados a otros equipos Los directorios estáticos pero no aptos para la exportación serán montados localmente, y quizás también en modo solo lectura.
Los directorios variables, y aptos para la exportación serán exportados con permisos de lectura, y escritura.

Seleccionar todos El concepto compartir directorios en red es algo esencial en el FHS, que entiende que ello ocurrirá en muchas ocasiones.

Un ejemplo del primer caso so /usr y /opt que contienen ficheros que solo cambiaran cuando el administrador añada,o quite programas.El segundo caso tendríamos /etc o /boot, /etc seria mas proclive a los cambios por contener las configuraciones de los programas, pero /boot es posible que cambie muy de vez en cuando. Y como tercer caso tendríamos /home o /var/mail, que cambiaran regularmente según la actividad de los usuarios. Y para el cuarto caso estarían /var/run o /var/lock, que los cambiaran los programas ejecutándose, pero que no conciernen al resto de equipos de la red.

Estructura propuesta por el FHS

El FHS divide el árbol de directorios en varias partes.

Directorio Raíz(«/»)

El directorio raíz(«/») es del que «cuelgan» el resto de directorios. Este es el directorio mas importante del sistema. En el debe de existir lo mínimo para que el sistema pueda arrancar, aunque sea de forma que solo ofrezca unas pocas funcionalidades, las mínimas para poder rescatar al resto del sistema si hiciera falta. Osea en este directorio se va encontrar los programas y bibliotecas imprescindibles para el arranque, diagnostico y recuperación del sistema. Esto incluye kernel a usar, que habitualmente se coloca en este directorio o dentro del mas especifico /boot, pero también la biblioteca C, la libc/lib64(aquella que contiene las funciones básicas de la mayor parte de los programas del sistema), y las utilidades básicas como: cp, rm, mv, etc…

Uno de los requisitos de este sistema basico es que sea lo mas pequeño posible; idealmente, el sistema deberia poder ser/lib64 iniciado o recuperado a partir de unos pocos programas. Minimizar el numero de elementos indispensables del sistema, minimiza también la posibilidad de que uno se estropee, y por tanto nos veamos en una situación irrecuperable. En el FHS también se citan otras razones importantes:

  • Es montado a partir de sistemas de ficheros que pueden ser muy pequeños(un disquete, por ejemplo)
  • contiene información muy especifica del equipo donde esta instalado, y que por su naturaleza no va ha ser compartido con otros equipos que pueda haber en la red.
  • Los errores de corrupción de datos son menos frecuentes en sistemas de ficheros pequeños.

Otra razón que se incluye en el FHS esta destinada sobre todo a los desarrolladores de programas y distribuciones: nunca sabemos si la persona que va usar nuestro programa o nuestra distribución va a tener poco o mucho espacio en el dispositivo destinado al directorio raíz. Por lo tanto, lo mas sabio es suponer lo peor, que va a haber poco espacio disponible, e intentar ajustar el directorio raíz para que ocupe lo mínimo posible.
Una de las recomendaciones que se hacen en el FHS es no añadir, ni quitar ninguno de los directorios básicos que se encuentran en el directorio raíz. La estructura del directorio raíz es muy rígida por que muchos programas dependen de ella, y alterarla podría hacer que fallaran de forma inesperada. Los siguientes directorios son los que deben aparecer en el directorio raíz:

  • /bin: binarios de los comandos esenciales (cp, rm, ls, etc…).
  • /boot: ficheros estáticos para el arranque del sistema(kernels, ficheros del gestor de arranque
    e).
  • /dev: ficheros de dispositivos.
  • /etc: configuración especifica del sistema.
  • /lib: bibliotecas compartidas esenciales, y módulos del kernel.
  • /mnt: directorio para montajes temporales.
  • /opt: paquetes de software adicionales(los no incluidos en la distribución).
  • /sbin: binarios esenciales para el sistema, usados por el administrador (fsck,mkfs,init,etc.).
  • /tmp: ficheros temporales.
  • /usr: aquí se montara una de las partes fundamentales del FHS, que contendrá la mayoría de programas del sistema y sus ficheros relacionados.
  • /var: datos variables, otra de las partes del FHS.

/usr y /var son tan complejas como el directorio raíz, y merecen apartados separados. Hay otros directorios que no son imprescindibles según el FHS (aunque los tengamos en todas las distribuciones GNU/Linux) y que pueden ser enlaces a directorios en otros sistemas de ficheros: /home y /root. El primero es el directorio en el que se encuentran los ficheros de los usuarios, y el segundo aquel donde se encuentran los ficheros del administrador del sistema (root). Hay también otro directorio opcional que es lib<arquitectura>, destinado a las bibliotecas compartidas esenciales compiladas para sistemas que soportan varias arquitecturas. Por ejemplo: en un Opteron, microprocesador de AMD que soporta instrvarucciones de 32 y 64 bits, la parte de 32 bits del sistema iría en /lib, pero la de 64 bits iría en /lib64.

Salvo bajo /bin y /sbin, puede haber(y habrá) otros directorios bajo los aquí mencionados. Los casos más claros son /etc, /opt, /usr y /var, con jerarquías bajo ellos que pueden ser muy complejas.

En /etc, como se dijo, estan las s configuraciones especificas del equipo. En la practica, esto quiere decir que aqui encontraremos todas las configuraciones globales de los programas instalados. Bajo este directorio no puede haber binarios, aunque si scripts. Hay varios directorios con scripts (o enlarces a ellos) que son ejecutados al arrancar, notablemente los de la «familia» rc.d. Estos son una herencia de los sistemas UNIX System V, una de las grandes familias UNIX(la otra es BSD). En cada uno de estos directorios, de la forma rc<numero>.d (salvo por rcS.d), hay scripts que se ejecutaran en el runlevel <numero>. En muchas distribuciones hay un directorio init.d (/etc/init.d, en Debian; /etc/rc.d/init.d, en Red Hat y similares) que contiene los scripts que arrancan los diferentes servicios del sistema, y que son enlazados desde los directorios rc*.d.
Tambien en /etc estan ficheros imprescindibles como /etc/passwd y /etc/shadow (los ficheros que contienen los usuarios y sus claves para acceder al sistema), /etc/group (la lista de grupos y sus miembros), /etc/fstab (la lista de montaje de dispositivos), etc.

Normalmente, solo el administrador puede escribir en los directorios raiz. /home y /tmp son las únicas excepciones, ya que están pensados para almacenar ficheros (temporales, en el caso de /tmp) de los usuarios.

EL DIRECTORIO /USR

/usr es otra de las partes fundamentales del sistema. El FHS indica que debe ser un directorio disponible para ser compartido con otros equipos, y de solo lectura.
Evidentemente, esto no sera siempre posible porque habra que instalar cosas en el; se refiere mas bien a los permisos de cara a cuando es compartido con otros equipos.

En /usr irán la inmensa mayoría de los programas del sistema, tanto para los usuarios como para el administrador, y los ficheros de datos que estos necesitan. Las configuraciones estarán en /etc, de esta forma se puede hacer una copia de seguridad de todas ellas con la copia de un único directorio. Bajo /usr encontraremos algunos directorios como los que había en el directorio raíz: /usr/bin, /usr/sbin o /usr/lib, por ejemplo.
Nada de lo que se encuentre bajo /usr debe ser necesario para iniciar o recuperar el sistema.

Los siguientes directorios son los que especifica el FHS obligatorios bajo /usr:
   – bin: la mayor parte de programas de usuario.
   – include: ficheros de cabecera para programas compilados en C.
   – lib: bibliotecas, tanto dinámicas como estáticas.
   – local: jerarquía local.
   – sbin: programas (no vitales) para el administrador.
   – share: ficheros independientes de la arquitectura.

También hay otros directorios opcionales:
   – X11R6: directorio para el sistema X Window.
   – games: para juegos.
   – lib<arquitectura>: como su homónimo del raíz.
   – src: para fuentes de programa.

El directorio /usr/local es una copia de /usr, pero destinada a programas creados o compilados de forma local. Por dar el uso mas común: es el directorio usado un programa a partir de las fuentes. Los programas así instalados están al margen del sistema de gestión de paquetes de la distribución, y por eso se ponen en un directorio aparte. También es usado para instalar los scripts o programas «caseros» que hayamos hecho nosotros: /usr/local/bin o /usr/local/sbin es el lugar adecuado.

Por otro lado,/usr/share almacena los ficheros «independientes de la arquitectura». Los ficheros que se encuentran aquí no van a ser programas, sino los ficheros de datos que estos usan habitualmente: imagenes, documentacion, etc. El directorio por excelencia de documentacion es /usr/share/doc, donde encontraoremos un directorio por programa instalado, con la documentacion (si la hay); el directorio habitual para los iconos de los programas es /usr/share/pixmaps, o /usr/share/icons, en Debian hasta hay un directorio para las licencias mas habituales, /usr/share/common-licenses. En tiempos pasados, el directorio oficial era /usr/doc, pero desde ya hace bastantes años se ha abandonado su uso, y se ha migrado progresivamente a /usr/share/doc. En algunas distribuciones /usr/doc todavía existe, y es un enlace a /usr/share/doc, a pesar de no estar contemplado por el FHS.

Los directorios bajo /usr/share están regulados, aunque solo hay dos directorios (o enlaces) obligatorios: man (para las paginas man) y misc. El resto dependerá del software que tengamos instalado, pero las opciones incluyen dict, doc, games, info, locale, nls, sgml, terminfo, tmac y zoneinfo. El nombre de «independiente de arquitectura» significa que, al no ser ejecutables, los ficheros en este directorio podran ser compartidos por equipos con arquitectura diferentes: Alpha, SPARC, X86, RS6000, etc. Mientras que un ejecutable esta ligado a la arquitectura para la que se compila, una imagen o un documento estan libres de esta restricción.

El directorio /var

La tercera piedra focal del FHS es el directorio /var. Su nombre viene de variable: directorio con datos variables, que cambian con el paso del tiempo con el uso de los programas del sistema. Esto va desde correo, ficheros de log, pasando por bases de datos o caches creadas por los programas del sistema.
Al tener naturaleza cambiante hace que no sea facil compartirlo, que no imposible: hay directorios que si pueden serlo, y que lo seran en muchas ocasiones. Uno de ellos es /var/mail el que almacena el correo de los usuarios del sistema. Este directorio puede ser compartido de los equipos cliente a partir de un servidor central, para que todos los programas que quieran leer o escribir mensajes puedan hacerlo. Lo mismo podríamos decir de /varr/spool/news, el directorio donde se guardan de las news de Usenet.

Los directorios obligatorios bajo /var son:

  • cache: datos cacheados de las aplicaciones.
  • lib: informacion variable de los programas.
  • local: datos variables de los programas de /usr/local.
  • lock: ficheros de bloqueo.
  • log: ficheros de log (registros del sistema).
  • opt: datos variables para los programas de /opt.
  • run: datos para los programas en ejecución.
  • spool: datos de «spool»
  • tmp: ficheros temporales preservados aunque el sistema sea reiniciado.

Deja una respuesta