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 ficheros, 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 ficheros 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 ficheros 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 ficheros y un primer nivel de directorios, los cuales a su vez contendrán ficheros 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 ficheros es el software encargado de trasladar esta realidad de ceros y unos a una estructura arborescente de directorios y ficheros, en la que, además, los componentes (esto es, los directorios y ficheros) 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 ficheros, 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 los comandos más básicos del sistema accesibles para todos los usuarios.

/boot

Almacena los ficheros 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 ficheros 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, porque que 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.

/srv

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

/sys

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

/tmp

Directorio para ficheros 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 para todos los usuarios.

/games

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

/include

Almacena los ficheros 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 ficheros 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.

/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 fichero 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 instó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 (y el resto exactamente igual):

$ realpath /bin
/usr/bin

2.2.1.2. Rutas

Muy comúnmente, cuando se quiere dar una orden al sistema, hay un fichero 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 ficheros están incluidos dentro de otros directorios.

Por esta razón, se hace necesario un método para expresar inequívocamente sobre qué fichero o directorio se quiere actuar. Este método consiste en indicar dónde se encuentra el fichero 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 fichero. 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 únicas1.

2.2.1.2.2. Rutas relativas

Son aquellas en las que el recorrido al fichero se expresa desde el directorio de trabajo. Como podemos estar trabajando en cualquier directorio, la ruta relativa a un fichero 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 fichero 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. Ejercicios sobre rutas

Nota

Observe las siguientes reglas:

  1. No cambie de usuario, si no se se especifica expresamente o es necesario para realizar la operación requerida.

  2. Escriba siempre la orden anteponiendo como prompt un dólar ($), si el usuario es root, o una almohadilla (#), si es cualquier otro.

  3. No cambie de directorio, si no se le ordena.

Usando el usuario del sistema sin privilegios:

  1. Ir al directorio etc que se encuentra dentro del directorio /.

  2. Sin salir de ese directorio, consultar el contenido del directorio / usando una ruta relativa.

  3. Usando una ruta relativa, pasar al directorio home que almacena los datos de los usuarios del sistema.

  4. Consultar el contenido del subdirectorio personal .config. ¿Qué ruta es más corta? ¿La relativa o la absoluta?

  5. Comprobar cuál es el directorio actual de trabajo.

  6. Pasarse al directorio local dentro de usr.

  7. Suponiendo que el administrador del sistema respete los estándares, ¿hay algún ejecutable instalado en el sistema que haya instalado él y no forme parte de la distribución?

  8. Con ruta relativa, volver al directorio personal.

  9. Listar el contenido del directorio raíz usando ruta relativa.

  10. Listar las interfaces de red mirando en el directorio apropiado, no usando comandos como ip o ifconfig.

    Nota

    Deberá averiguar cuál es este directorio donde el sistema muestra las interfaces de red detectadas.

Notas al pie

1

Salvo que usemos enlaces duros o simbólicos, claro.