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 |
|
/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 |
|
/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 |
|
/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 |
|
/sbin |
Contiene los comandos básicos propios del administrador
necesarios para el caso referido al hablar de
|
|
/srv |
Contiene los datos servidos por el sistema. Así, en
|
|
/sys |
Como |
|
/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 |
|
/local |
Tercer nivel de la jerarquía para datos locales
instalados por el administrador. Reproduce los
subdirectorios del segundo nivel ( |
|
/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. |
|
Almacena los buzones de los usuarios. |
||
/opt |
Almacena datos variables para las aplicaciones de
|
|
/run |
Véase |
|
/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:
Para referirnos a un archivo o directorio que se encuentra dentro del directorio de trabajo basta con escribir su nombre.
El directorio actual se puede referir con un . (un punto).
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 llamadotrabajo.txt
, éste no se convertirá mágicamente en un documento PDF porque lo renombremostrabajo.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 archivobackup.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