2.2.1. El sistema de archivos

No entrando en mucho detalle, el sistema de archivos es el encargado de estructurar y gestionar la información almacenada en disco. Para ello, organiza dicha información en forma de archivos, cada uno de los cuales es una unidad contenedora de información; y directorios, que son unidades contenedoras de archivos y directorios.

Nota

Desde la aparición de sistemas gráficos es habitual llamar a los directorios, carpetas.

De ahí que, si queremos almacenar una foto, la información que compone ésta se guarde dentro de un archivo adecuado (un ,jpg, por ejemplo). Otra foto diferente se almacenará en un archivo .jpg distinto, etc. Todos estos archivos fotográficos, que componen un album se encontrarán dentro de un mismo directorio, al que quizás habremos llamado Inconfesables. Es posible que tengamos otro album con fotos de nuestra niñez, representado por otro directorio llamado Antiguas y que contendrá también otra buena cantidad de archivos de fotos. Estos dos directorios pueden a su vez encontrarse dentro de un directorio padre llamado Imagenes.

Al final resultará que la información incluida en el sistema de archivos se organizará siguiendo una estructura arborescente en la que habrá un directorio raíz que contiene algunas archivos y un primer nivel de directorios, los cuales a su vez contendrán archivos y directorios y así sucesivamente.

Ahora bien, el disco duro es un dispositivo en el que podemos almacenar unos y ceros, organizados en bytes, etc. Pues bien, el sistema de archivos es el software encargado de trasladar esta realidad de ceros y unos a una estructura arborescente de directorios y archivos, en la que, además, los componentes (esto es, los directorios y archivos) puedan disponer de ciertos atributos (permisos, propietarios, fechas de modificación, etc). Hay muchos sistemas de archivos, pero los más usados en linux son ext4, brtfs y xfs, en especial, el primero, que es el formato nativo de linux y el recomendado. brtfs, por su parte, parece ser el futuro…

2.2.1.1. Estructura

Las estructura de directorios no es la misma en todos las distribuciones de linux ni en, por supuesto, todos los linux. Existe, sin embargo, un estándar llamado FHS (Norma para la jerarquía del sistema de archivos, por sus siglas en inglés) y que los sistemas basados en debian siguen con más o menos fidelidad, ya que si echamos un vistazo al directorio raíz de debian veremos que contiene los siguientes directorios:

$ tree -dL 1 /
/
+-- bin
+-- boot
+-- dev
+-- etc
+-- home
+-- lib
+-- lib64
+-- lost+found
+-- media
+-- mnt
+-- opt
+-- proc
+-- root
+-- run
+-- sbin
+-- srv
+-- sys
+-- tmp
+-- usr
\-- var

Esta estructura de directorios tiene una correspondencia muy cercana con la propugnada en el FHS. De hecho, podemos comentar cada uno de los directorios presentes en debian indicando si tienen o no correspondencia en el estándar:

directorio

descripción

/

Nivel raíz de la jerarquía de directorios.

/bin

Incluye las órdenes más básicas usadas por todos los usuarios que pueden necesitarse en un arranque en modo single-user de reparación y mantenimiento del sistema.

/boot

Almacena los archivos que sirven para arrancar el sistema (archivos del gestor de arranque, núcleo, imagen initrd, etc)

/dev

Contiene archivos de bloques y de caracteres, algunos representan el hardware y otros tienen significado especial como /dev/null.

/etc

Contiene las configuraciones globales de los programas del sistema. Cada usuario en su perfil, podrá tener las suyas particulares.

/home

Contiene los datos personales de los usuarios, excepto los del administrador, root.

/lib

Contiene las bibliotecas de los programas alojados en en /bin y /sbin y las que usa el núcleo.

/media

Contiene puntos de montaje de otros sistemas de archivos alojados en dispositivos desmontables (cd-rom, pinchos usb, etc.)

/mnt

Sirve para montar manualmente sistemas de archivos.

/opt

Directorio bajo el que se instalan paquetes que no sean distribuidos por la propia distribución. Reproduce el esquema de directorios bin, lib, share, sbin, etc.

/proc

Contiene un sistema de archivos virtual que documenta el comportamiento del núcleo y los procesos.

/root

Directorio personal del administrador.

/run

Guarda información reciente sobre los demonios que se ejecutan. No forma parte del estándar, pues éste coloca esta información en /var/run. En Debian este último directorio es un enlace simbólico a /run.

/sbin

Contiene los comandos básicos propios del administrador necesarios para el caso referido al hablar de /bin.

/srv

Contiene los datos servidos por el sistema. Así, en /srv/www pueden encontrarse los archivos que sirve el servidor web o en /srv/ftp los servidos por el servidor ftp.

/sys

Como /proc, sistema de archivos virtual donde se el núcleo provee información sobre el sistema de una manera más organizada.

/tmp

Directorio para archivos temporales

/usr

Segundo nivel de la jerarquía para datos de sólo lectura. Es acrónimo de UNIX System Resources.

/bin

Comandos del sistema usados por todos los usuarios.

/games

Por razones históricas, se separan los juegos del resto de ejecutables. No existe en la norma.

/include

Almacena los archivos de cabecera.

/lib

Directorio para guardar las bibliotecas de los programas que se encuentran en /usr/bin y en /usr/sbin.

/local

Tercer nivel de la jerarquía para datos locales instalados por el administrador. Reproduce los subdirectorios del segundo nivel (bin, sbin, etc.)

/sbin

Comandos del sistema propios del administrador.

/share

Contiene datos independientes de la arquitectura como las páginas del manual o documenación en general.

/src

Contiene código fuente que puede ser compilado

/var

Almacena datos variables del sistema como bases de datos, logs, correos electrónicos.

/cache

Contiene los datos de caché de las aplicaciones del sistema.

/lib

Contiene datos persistentes que modifican los programas como bases de datos o la información del sistema de paquetes.

/lock

Contiene archivos que permite conocer si los programas están en uso.

/log

Contiene los archivos de log para monitorizar el sistema.

/mail

Almacena los buzones de los usuarios.

/opt

Almacena datos variables para las aplicaciones de opt.

/run

Véase /run.

/spool

Almacena bandejas de tareas que aún necesitan procesarse.

Nota

Es útil tener una idea de para qué sirve cada directorio, porque ese conocimiento nos permite saber por dónde tenermos que empezar a buscar algo.

Por otro lado, es común que se utilicen varios sistemas de archivos a la vez. Por ejemplo, uno para los datos del sistema y otro para los datos de usuario; o que en un momento determinado se acceda a los datos almacenados en una memoria USB. En los sistemas unix existe siempre un único árbol de directorios cuya raíz es el directorio /. Al resto de sistemas de archivos se accede montándolos sobre un directorio del árbol. Los datos de usuario, por ejemplo, se montan en /home y los dispositivos externos se montan automáticamente dentro de /media. Incluso si se accede a sistemas de archivos remotos, estos también se montarán sobre algún lugar del árbol.

La cuestión de la duplicidad /bin y /usr/bin

En los sistemas UNIX ha existido tradicionalmente la dualidad entre:

  • /bin y /usr/bin

  • /sbin y /usr/sbin

  • /lib y /usr/lib

que, normalmente, al explicarse se zanja con que en /bin, /sbin y /lib está lo más básico y bajo /usr lo demás. La distinción es, sin embargo, difusa, porque, en realidad, el origen de la duplicidad se debe a razones históricas: bajo /usr se replicó la estructura de /, porque en las antiguas máquinas los discos duros eran demasiado pequeños para que cupiesen todos los ejecutables y librerías dentro de /. Así pues, se optó por empezar a almacenarlos en el segundo disco dentro de /usr. En los sistemas modernos con discos más grandes, no existía razón para duplicar los directorios, pero por tradición se mantuvo la duplicidad. Sin embargo, las distribuciones de Linux han optado paulatinamente por simplificar el árbol y, Debian, que es una de las más conservadoras, decidió en marzo de 2019 eliminar tal distinción haciendo que /bin sea un enlace simbólico a /usr/bin. Análogamente, /sbin y /lib también son enlaces simbólicos[1]:

$ realpath /bin
/usr/bin

2.2.1.2. Rutas

Muy comúnmente, cuando se quiere dar una orden al sistema, hay un archivo o un directorio implicado. En ocasiones más de uno. Ya se ha discutido cómo la estructura de directorios es arborescente y cómo los directorios y archivos están incluidos dentro de otros directorios.

Por esta razón, se hace necesario un método para expresar inequívocamente sobre qué archivo o directorio se quiere actuar. Este método consiste en indicar dónde se encuentra el archivo en cuestión mediante la expresión de su ruta (o path, que es el término que se usa en inglés).

2.2.1.2.1. Rutas absolutas

Son aquellas en las que se indica cuál es el recorrido más corto que se debe seguir desde el directorio raiz para llegar al archivo. Por ejemplo:

/usr/bin/bc

Es la ruta absoluta del programa bc (una calculadora) y expresa que dicho programa se encuentra dentro del directorio bin que se encuentra dentro del directorio usr que se encuentra a su vez dentro del directorio /. Para separar unos directorio de otro se usa el carácter barra.

Las rutas absolutas son fácilmente identificables porque empiezan siempre por una barra. Además, son únicas[2].

2.2.1.2.2. Rutas relativas

Son aquellas en las que el recorrido al archivo se expresa desde el directorio de trabajo. Como podemos estar trabajando en cualquier directorio, la ruta relativa a un archivo no es única: dependiendo de dónde estemos, será una u otra.

Para confeccionar la ruta relativa nos basta con saber tres cosas:

  1. Para referirnos a un archivo o directorio que se encuentra dentro del directorio de trabajo basta con escribir su nombre.

  2. El directorio actual se puede referir con un . (un punto).

  3. El directorio padre se puede referir con un .. (dos puntos consecutivos).

Dado que cd es un comando interno de bash que permite cambiar de directorio de trabajo, la siguiente orden nos permitiría ir desde nuestro directorio personal (/home/usuario) a un directorio .config que estuviera dentro de él:

$ cd .config

También habría sido posible lo siguiente:

$ cd ./.config

Si hubiéramos querido acceder al directorio openbox dentro de .config deberíamos haber hecho:

$ cd .config/openbox

Para ir al directorio raíz, en cambio, habría bastado con esto:

$ cd ../..

O sea, haber retrocedido dos niveles. Y para haber llegado al directorio temporal:

$ cd ../../tmp

2.2.1.3. Nombres de archivo

El nombre de un archivo puede, por lo general, ser cualquiera[3], pero hay una convención al escogerlo que se respeta siempre: el nombre suele dividirse en dos partes: el nombre en sí y la extensión. Ambas partes se separan por el carácter punto («.»). El nombre alude de forma muy escueta al contenido y la extensión, que suele tener entre uno y cuatro caracteres, a su formato. De este modo un archivo vacaciones01.jpeg adivinaremos que contiene una foto en formato JPEG de las vacaciones de alguien, o trabajo.pdf un documento que recoge el trabajo de alguien en formato PDF.

Entiéndase que esta división en dos partes es una mera convención de la que se vale el usuario y, ulteriormente, el propio sistema operativo para controlar de qué tipo es el archivo. Por tanto:

  • Para el sistema de archivos el nombre realmente es todo, nombre en sí y extensión y el punto es un carácter que no tiene nada de especial.

  • La extensión no determinada el tipo de archivo, sino que es el tipo de archivo el que debería determinar la extensión. Por tanto, si tenemos un archivo PDF deberíamos nombrarlo con una extensión .pdf. En cambio, si tenemos un documento de texto plano llamado trabajo.txt, éste no se convertirá mágicamente en un documento PDF porque lo renombremos trabajo.pdf[4].

Nota

Los usuarios familiarizados con sistemas Windows, pero no con sistemas UNIX, deberían tener en cuenta tres cosas:

  • Los sistemas Windows suelen ocultar al usuario las extensiones conocidas, porque entiende que el icono ya expresa cuál es el formato, por lo que el archivo trabajo.pdf, se mostrará únicamente como «trabajo». La extensión, sin embargo, forma parte del archivo, pero habrá que cambiar las preferencias de visualización para que se muestren.

  • En los sistemas UNIX, los archivos ejecutables, esto es, los programas, no tienen ninguna extensión, porque existe un permiso que los caracteriza como ejecutables. Por tanto, no hay extensiones .exe ni nada por el estilo.

  • Como la extensión expresa el formato del archivo, es común que un archivo acumule varias. Por ejemplo, el archivo backup.tar.gz es una copia de seguridad generada con tar que, además, se ha comprimido con gzip. Por tanto, si se descomprime podrá obtenerse el archivo backup.tar, que será un contenedor de archivos sin comprimir y sobre el que se podrá usar tar para obtener los archivos que contiene.

Notas al pie