.. _filesystem: 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**. .. note:: 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 :file:`Inconfesables`. Es posible que tengamos otro album con fotos de nuestra niñez, representado por otro directorio llamado :file:`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 :file:`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 :dfn:`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... 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 :abbr:`FHS (Filesystem Hierarchy Standard)`. 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 :file:`/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 :file:`/bin` y :file:`/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 :file:`bin`, :file:`lib`, | | | :file:`share`, :file:`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 :file:`/var/run`. En *Debian* este | | | último directorio es un enlace simbólico a :file:`/run`. | +----------------+----------------------------------------------------------+ | /sbin | Contiene los comandos básicos propios del administrador | | | necesarios para el caso referido al hablar de | | | :file:`/bin`. | +----------------+----------------------------------------------------------+ | /srv | Contiene los datos servidos por el sistema. Así, en | | | :file:`/srv/www` pueden encontrarse los archivos que | | | sirve el servidor web o en :file:`/srv/ftp` los servidos | | | por el servidor ftp. | +----------------+----------------------------------------------------------+ | /sys | Como :file:`/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 **U**\ NIX **S**\ ystem | | | | **R**\ esources. | | +---------+----------------------------------------------------------+ | | /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 :file:`/usr/bin` y en | | | | :file:`/usr/sbin`. | | +---------+----------------------------------------------------------+ | | /local | Tercer nivel de la jerarquía para datos **loc**\ ales | | | | instalados por el administrador. Reproduce los | | | | subdirectorios del segundo nivel (:file:`bin`, | | | | :file:`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 | | | | :file:`opt`. | | +---------+----------------------------------------------------------+ | | /run | Véase :file:`/run`. | | +---------+----------------------------------------------------------+ | | /spool | Almacena bandejas de tareas que aún necesitan procesarse.| +------+---------+----------------------------------------------------------+ .. note:: 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 :file:`/`. Al resto de sistemas de archivos se accede montándolos sobre un directorio del árbol. Los datos de usuario, por ejemplo, se montan en :file:`/home` y los dispositivos externos se montan automáticamente dentro de :file:`/media`. Incluso si se accede a sistemas de archivos remotos, estos también se montarán sobre algún lugar del árbol. .. rubric:: La cuestión de la duplicidad :file:`/bin` y :file:`/usr/bin` En los sistemas *UNIX* ha existido tradicionalmente la dualidad entre: * :file:`/bin` y :file:`/usr/bin` * :file:`/sbin` y :file:`/usr/sbin` * :file:`/lib` y :file:`/usr/lib` que, normalmente, al explicarse se zanja con que en :file:`/bin`, :file:`/sbin` y :file:`/lib` está lo más básico y bajo :file:`/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 :file:`/usr` se replicó la estructura de :file:`/`, porque en las antiguas máquinas los discos duros eran demasiado pequeños para que cupiesen todos los ejecutables y librerías dentro de :file:`/`. Así pues, se optó por empezar a almacenarlos en el segundo disco dentro de :file:`/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 :file:`/bin` sea un enlace simbólico a :file:`/usr/bin`. Análogamente, :file:`/sbin` y :file:`/lib` también son enlaces simbólicos\ [#]_:: $ realpath /bin /usr/bin .. _rutas: 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). 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 :command:`bc` (una calculadora) y expresa que dicho programa se encuentra dentro del directorio :file:`bin` que se encuentra dentro del directorio :file:`usr` que se encuentra a su vez dentro del directorio :file:`/`. 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\ [#]_. 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 :kbd:`.` (un *punto*). #. El directorio padre se puede referir con un :kbd:`..` (dos *puntos* consecutivos). Dado que :command:`cd` es un :index:`comando ` interno de :program:`bash` que permite cambiar de directorio de trabajo, la siguiente orden nos permitiría ir desde nuestro directorio personal (:file:`/home/usuario`) a un directorio :file:`.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 :file:`openbox` dentro de :file:`.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 .. _nombres-archivo: Nombres de archivo ------------------ El nombre de un archivo puede, por lo general, ser cualquiera\ [#]_, 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 :file:`vacaciones01.jpeg` adivinaremos que contiene una foto en formato |JPEG| de las vacaciones de alguien, o :file:`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 :file:`.pdf`. En cambio, si tenemos un documento de texto plano llamado :file:`trabajo.txt`, éste no se convertirá mágicamente en un documento |PDF| porque lo renombremos :file:`trabajo.pdf`\ [#]_. .. note:: 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 :file:`trabajo.pdf`, se mostrará únicamente como ":kbd:`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 :ref:`existe un permiso que los caracteriza como ejecutables `. Por tanto, no hay extensiones :file:`.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 :file:`backup.tar.gz` es una copia de seguridad generada con :ref:`tar ` que, además, se ha comprimido con :ref:`gzip `. Por tanto, si se descomprime podrá obtenerse el archivo :file:`backup.tar`, que será un contenedor de archivos sin comprimir y sobre el que se podrá usar :program:`tar` para obtener los archivos que contiene. .. rubric:: Notas al pie .. [#] Las paquetes, sin embargo, si conservan la distintión. Véase por el contenido de :deb:`coreutils`. .. [#] Salvo que usemos enlaces duros o simbólicos, claro. .. [#] Aunque sujeto a las limitaciones que pueda establecernos el sistema de archivos que suelen ser tan laxas que podemos olvidarnos de que existen. .. [#] Un entorno gráfico a un usuario poco avanzado podría conducirlo a engaño, porque al hacer ese cambio de extensión, también hará un cambio en el icono asociado y pasará a representar el archivo con un icono propio de los documentos |PDF|. Esto no implica un cambio en el formato, sino que el entorno gráfico utiliza para adivinar el formato de archivo la extensión. Al cambiar la extensión sin realmente cambiar el formato, lo que hacemos es utilizar una extensión inapropiado y, como consecuencia, engañar al entorno gráfico. .. |JPEG| replace:: :abbr:`JPEG (Joint Photographic Experts Group)` .. |PDF| replace:: :abbr:`PDF (Portable Document Format)`