Una discusión de alto nivel de los conceptos del sistema de archivos de Linux

Este artículo pretende ser una discusión de muy alto nivel de los conceptos del sistema de archivos de Linux. No pretende ser una descripción de bajo nivel de cómo funciona un tipo de sistema de archivos en particular, como EXT4, ni pretende ser un tutorial de los comandos del sistema de archivos.

Todo ordenador de propósito general necesita almacenar datos de varios tipos en una unidad de disco duro (HDD) o algún equivalente, como una memoria USB. Hay un par de razones para ello. En primer lugar, la memoria RAM pierde su contenido cuando se apaga el ordenador. Hay tipos de RAM no volátiles que pueden mantener los datos almacenados allí después de apagar el ordenador (como la RAM flash que se utiliza en las memorias USB y las unidades de estado sólido), pero la RAM flash es mucho más cara que la RAM estándar y volátil como la DDR3 y otros tipos similares.

La segunda razón por la que los datos deben almacenarse en discos duros es que incluso la RAM estándar sigue siendo más cara que el espacio en disco. Tanto el coste de la RAM como el del disco han descendido rápidamente, pero la RAM sigue siendo la primera en términos de coste por byte. Un cálculo rápido del coste por byte, basado en los costes de 16 GB de RAM frente a un disco duro de 2 TB, muestra que la RAM es unas 71 veces más cara por unidad que el disco duro. El coste típico de la RAM es de alrededor de 0,0000000043743750 dólares por byte hoy en día.

Para una nota histórica rápida para poner los costes actuales de la RAM en perspectiva, en los primeros días de la informática, un tipo de memoria se basaba en puntos en una pantalla CRT. Esto era muy caro, alrededor de 1,00 dólares por bit.

Definiciones

Es posible que escuche a la gente hablar de los sistemas de archivos de varias maneras diferentes y confusas. La palabra en sí misma puede tener múltiples significados, y es posible que tenga que discernir el significado correcto a partir del contexto de una discusión o documento.

Intentaré definir los diversos significados de la palabra «sistema de archivos» basándome en cómo he observado que se utiliza en diferentes circunstancias. Nótese que, aunque intento ajustarme a los significados «oficiales» estándar, mi intención es definir el término basándome en sus diversos usos. Estos significados serán explorados en mayor detalle en las siguientes secciones de este artículo.

  1. Toda la estructura de directorios de Linux empezando por el directorio raíz superior (/).
  2. Un tipo específico de formato de almacenamiento de datos, como EXT3, EXT4, BTRFS, XFS, etc. Linux soporta casi 100 tipos de sistemas de archivos, incluyendo algunos muy antiguos así como algunos de los más nuevos. Cada uno de estos tipos de sistemas de archivos utiliza sus propias estructuras de metadatos para definir cómo se almacenan los datos y cómo se accede a ellos.
  3. Una partición o volumen lógico formateado con un tipo específico de sistema de archivos que puede montarse en un punto de montaje especificado en un sistema de archivos Linux.

Funciones básicas del sistema de archivos

El almacenamiento en disco es una necesidad que conlleva algunos detalles interesantes e ineludibles. Obviamente, un sistema de archivos está diseñado para proporcionar espacio para el almacenamiento no volátil de datos; esa es su función última. Sin embargo, hay muchas otras funciones importantes que se derivan de ese requisito.

Todos los sistemas de archivos necesitan proporcionar un espacio de nombres, es decir, una metodología de denominación y organización. Esto define cómo se puede nombrar un archivo, específicamente la longitud de un nombre de archivo y el subconjunto de caracteres que se pueden utilizar para los nombres de archivo del conjunto total de caracteres disponibles. También define la estructura lógica de los datos en un disco, como el uso de directorios para organizar los archivos en lugar de agruparlos todos en un único y enorme conglomerado de archivos.

Una vez que se ha definido el espacio de nombres, es necesaria una estructura de metadatos para proporcionar la base lógica de ese espacio de nombres. Esto incluye las estructuras de datos necesarias para soportar una estructura jerárquica de directorios; estructuras para determinar qué bloques de espacio en el disco se utilizan y cuáles están disponibles; estructuras que permiten mantener los nombres de los archivos y directorios; información sobre los archivos como su tamaño y las horas en que fueron creados, modificados o accedidos por última vez; y la ubicación o ubicaciones de los datos pertenecientes al archivo en el disco. Otros metadatos se utilizan para almacenar información de alto nivel sobre las subdivisiones del disco, como los volúmenes lógicos y las particiones. Estos metadatos de alto nivel y las estructuras que representan contienen la información que describe el sistema de archivos almacenado en la unidad o partición, pero están separados y son independientes de los metadatos del sistema de archivos.

Los sistemas de archivos también requieren una interfaz de programación de aplicaciones (API) que proporcione acceso a las llamadas de función del sistema que manipulan los objetos del sistema de archivos como los archivos y los directorios. La API proporciona tareas como la creación, el movimiento y la eliminación de archivos. También proporciona algoritmos que determinan cosas como la ubicación de un archivo en un sistema de archivos. Estos algoritmos pueden tener en cuenta objetivos como la velocidad o la minimización de la fragmentación del disco.

Los sistemas de archivos modernos también proporcionan un modelo de seguridad, que es un esquema para definir los derechos de acceso a los archivos y directorios. El modelo de seguridad del sistema de archivos de Linux ayuda a garantizar que los usuarios sólo tengan acceso a sus propios archivos y no a los de otros o al propio sistema operativo.

El último bloque de construcción es el software necesario para implementar todas estas funciones. Linux utiliza una implementación de software en dos partes como forma de mejorar la eficiencia tanto del sistema como del programador.


Figura 1: La implementación de software del sistema de archivos de Linux en dos partes.

La primera parte de esta implementación en dos partes es el sistema de archivos virtual de Linux. Este sistema de archivos virtual proporciona un único conjunto de comandos para el kernel, y los desarrolladores, para acceder a todos los tipos de sistemas de archivos. El software del sistema de archivos virtual llama al controlador de dispositivo específico necesario para interactuar con los distintos tipos de sistemas de archivos. Los controladores de dispositivos específicos del sistema de archivos son la segunda parte de la implementación. El controlador de dispositivo interpreta el conjunto estándar de comandos del sistema de archivos a los específicos del tipo de sistema de archivos en la partición o volumen lógico.

Estructura de directorios

Como Virgo normalmente muy organizado, me gusta que las cosas se almacenen en grupos más pequeños y organizados en lugar de en un gran cubo. El uso de directorios me ayuda a poder almacenar y luego localizar los archivos que quiero cuando los busco. Los directorios también se conocen como carpetas porque se pueden considerar como carpetas en las que se guardan los archivos en una especie de analogía con el escritorio físico.

En Linux y muchos otros sistemas operativos, los directorios se pueden estructurar en una jerarquía en forma de árbol. La estructura de directorios de Linux está bien definida y documentada en el Linux Filesystem Hierarchy Standard (FHS). La referencia a esos directorios cuando se accede a ellos se realiza utilizando los nombres de directorios secuencialmente más profundos conectados por barras inclinadas (/) como /var/log y /var/spool/mail. Estos se llaman rutas.

La siguiente tabla proporciona una lista muy breve de los directorios estándar, conocidos y definidos de nivel superior de Linux y sus propósitos.

Directorio Descripción
/ (sistema de archivos raíz) El sistema de archivos raíz es el directorio de nivel superior del sistema de archivos. Debe contener todos los archivos necesarios para arrancar el sistema Linux antes de montar otros sistemas de archivos. Debe incluir todos los ejecutables y bibliotecas necesarios para arrancar los demás sistemas de archivos. Después de arrancar el sistema, todos los demás sistemas de archivos se montan en puntos de montaje estándar y bien definidos como subdirectorios del sistema de archivos raíz.
/bin El directorio /bin contiene archivos ejecutables del usuario.
/boot Contiene el gestor de arranque estático y los archivos ejecutables y de configuración del kernel necesarios para arrancar un ordenador Linux.
/dev Este directorio contiene los archivos de dispositivo para cada dispositivo de hardware conectado al sistema. No se trata de controladores de dispositivos, sino de archivos que representan cada dispositivo del ordenador y facilitan el acceso a dichos dispositivos.
/etc Contiene los archivos de configuración del sistema local para el ordenador anfitrión.
/home Directorio de almacenamiento de archivos de usuario. Cada usuario tiene un subdirectorio en /home.
/lib Contiene archivos de bibliotecas compartidas que se requieren para arrancar el sistema.
/media Un lugar para montar dispositivos multimedia externos extraíbles, como unidades de memoria USB, que pueden estar conectados al host.
/mnt Un punto de montaje temporal para sistemas de archivos regulares (como en los medios no extraíbles) que se puede utilizar mientras el administrador está reparando o trabajando en un sistema de archivos.
/opt Aquí deben ubicarse los archivos opcionales, como los programas de aplicación suministrados por el proveedor.
/root No es el sistema de archivos root (/). Es el directorio principal del usuario root.
/sbin Archivos binarios del sistema. Son ejecutables utilizados para la administración del sistema.
/tmp Directorio temporal. Utilizado por el sistema operativo y muchos programas para almacenar archivos temporales. Los usuarios también pueden almacenar archivos aquí temporalmente. Tenga en cuenta que los archivos almacenados aquí pueden ser eliminados en cualquier momento sin previo aviso.
/usr Son archivos compartibles de sólo lectura, incluyendo binarios y bibliotecas ejecutables, archivos man y otros tipos de documentación.
/var Aquí se almacenan los archivos de datos variables. Esto puede incluir cosas como archivos de registro, MySQL y otros archivos de bases de datos, archivos de datos del servidor web, bandejas de entrada de correo electrónico y mucho más.

Tabla 1: El nivel superior de la jerarquía del sistema de archivos de Linux.

Los directorios y sus subdirectorios que se muestran en la Tabla 1, junto con sus subdirectorios, que tienen un fondo cerceta se consideran una parte integral del sistema de archivos raíz. Es decir, no pueden ser creados como un sistema de archivos separado y montados en el momento del arranque. Esto es porque ellos (específicamente, sus contenidos) deben estar presentes en el momento del arranque para que el sistema arranque correctamente.

Los directorios /media y /mnt son parte del sistema de archivos raíz, pero nunca deben contener ningún dato. Más bien, son simplemente puntos de montaje temporales.

Los directorios restantes, los que no tienen color de fondo en la Tabla 1 no necesitan estar presentes durante la secuencia de arranque, pero se montarán más tarde, durante la secuencia de inicio que prepara al host para realizar un trabajo útil.

Asegúrese de consultar la página web oficial de Linux Filesystem Hierarchy Standard (FHS) para obtener detalles sobre cada uno de estos directorios y sus muchos subdirectorios. Wikipedia también tiene una buena descripción del FHS. Este estándar debe ser seguido tan estrechamente como sea posible para asegurar la consistencia operacional y funcional. Independientemente de los tipos de sistemas de archivos utilizados en un host, esta estructura jerárquica de directorios es la misma.

Estructura de directorios unificada de Linux

En algunos sistemas operativos de PC que no son Linux, si hay varios discos duros físicos o varias particiones, a cada disco o partición se le asigna una letra de unidad. Es necesario saber en qué disco duro se encuentra un archivo o programa, como C: o D:. Entonces se emite la letra de la unidad como un comando, D:, por ejemplo, para cambiar a la unidad D:, y luego se utiliza el comando cd para cambiar al directorio correcto para localizar el archivo deseado. Cada disco duro tiene su propio árbol de directorios separado y completo.

El sistema de archivos de Linux unifica todos los discos duros físicos y las particiones en una única estructura de directorios. Todo comienza en la parte superior: el directorio raíz (/). Todos los demás directorios y sus subdirectorios se encuentran bajo el único directorio raíz de Linux. Esto significa que sólo hay un único árbol de directorios en el que buscar archivos y programas.

Esto puede funcionar sólo porque un sistema de archivos, como /home, /tmp, /var, /opt, o /usr puede ser creado en discos duros físicos separados, una partición diferente, o un volumen lógico diferente del sistema de archivos / (raíz) y luego ser montado en un punto de montaje (directorio) como parte del árbol del sistema de archivos raíz. Incluso las unidades extraíbles como una unidad USB o un disco duro externo USB o ESATA se montarán en el sistema de archivos raíz y se convertirán en una parte integral de ese árbol de directorios.

Una buena razón para hacer esto es evidente durante una actualización de una versión de una distribución de Linux a otra, o el cambio de una distribución a otra. En general, y aparte de cualquier utilidad de actualización como dnf-upgrade en Fedora, es prudente reformatear ocasionalmente el disco(s) duro(s) que contiene(n) el sistema operativo durante una actualización para eliminar positivamente cualquier basura que se haya acumulado con el tiempo. Si /home es parte del sistema de archivos raíz, también será reformateado y tendrá que ser restaurado desde una copia de seguridad. Al tener /home como un sistema de archivos separado, será conocido por el programa de instalación como un sistema de archivos separado y se puede omitir su formateo. Esto también puede aplicarse a /var, donde se almacenan las bases de datos, los buzones de correo electrónico, el sitio web y otros datos variables del usuario y del sistema.

Hay otras razones para mantener ciertas partes del árbol de directorios de Linux como sistemas de archivos separados. Por ejemplo, hace mucho tiempo, cuando aún no era consciente de los posibles problemas que conlleva tener todos los directorios necesarios de Linux como parte del sistema de archivos / (raíz), me las arreglé para llenar mi directorio home con un gran número de archivos muy grandes. Como ni el directorio /home ni el directorio /tmp eran sistemas de archivos separados, sino simplemente subdirectorios del sistema de archivos raíz, todo el sistema de archivos raíz se llenó. No quedaba espacio para que el sistema operativo creara archivos temporales o ampliara los archivos de datos existentes. Al principio, los programas de aplicación empezaron a quejarse de que no había espacio para guardar archivos, y luego el propio sistema operativo empezó a actuar de forma muy extraña. Arrancando en modo monopuesto y borrando los archivos ofensivos en mi directorio personal pude volver a funcionar. Entonces reinstalé Linux usando una configuración bastante estándar de multi-sistema de archivos y fui capaz de evitar que ocurrieran de nuevo caídas completas del sistema.

Una vez tuve una situación en la que un host Linux continuaba funcionando, pero impedía al usuario iniciar sesión usando el escritorio GUI. Pude iniciar la sesión usando la interfaz de línea de comandos (CLI) localmente usando una de las consolas virtuales, y remotamente usando SSH. El problema era que el sistema de archivos /tmp se había llenado y algunos archivos temporales requeridos por el escritorio GUI no podían ser creados en el momento de iniciar la sesión. Dado que el inicio de sesión de la CLI no requería la creación de archivos en /tmp, la falta de espacio allí no me impedía iniciar sesión utilizando la CLI. En este caso, el directorio /tmp era un sistema de archivos independiente y había mucho espacio disponible en el grupo de volúmenes del que formaba parte el volumen lógico /tmp. Simplemente expandí el volumen lógico /tmp a un tamaño que se acomodaba a mi nueva comprensión de la cantidad de espacio de archivo temporal necesario en ese host y el problema estaba resuelto. Tenga en cuenta que esta solución no requirió un reinicio, y tan pronto como el sistema de archivos /tmp fue ampliado el usuario fue capaz de iniciar sesión en el escritorio.

Otra situación ocurrió mientras yo estaba trabajando como administrador de laboratorio en una gran empresa de tecnología. Uno de nuestros desarrolladores había instalado una aplicación en la ubicación equivocada (/var). La aplicación se bloqueaba porque el sistema de archivos /var estaba lleno y los archivos de registro, que se almacenan en /var/log en ese sistema de archivos, no podían añadirse con nuevos mensajes debido a la falta de espacio. Sin embargo, el sistema seguía funcionando porque los sistemas de archivos críticos / (root) y /tmp no se llenaban. La eliminación de la aplicación ofensiva y su reinstalación en el sistema de archivos /opt resolvió el problema.

Tipos de sistemas de archivos

Linux admite la lectura de unos 100 tipos de partición; sólo puede crear y escribir en unos pocos de ellos. Pero es posible -y muy común- montar sistemas de archivos de diferentes tipos en el mismo sistema de archivos raíz. En este contexto hablamos de sistemas de archivos en términos de las estructuras y metadatos necesarios para almacenar y gestionar los datos del usuario en una partición de un disco duro o un volumen lógico. La lista completa de tipos de particiones de sistemas de archivos reconocidos por el comando fdisk de Linux se proporciona aquí, para que pueda tener una idea del alto grado de compatibilidad que Linux tiene con muchos tipos de sistemas.

 0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris 1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT- 2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT- 3 XENIX usr 3c PartitionMagic 84 OS/2 hidden or c6 DRDOS/sec (FAT- 4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx 5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data 6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / . 7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility 8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt 9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi ea Rufus alignment e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD eb BeOS fs f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ee GPT10 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC b12 Compaq diagnost 5c Priam Edisk a9 NetBSD f1 SpeedStor14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f4 SpeedStor16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ f2 DOS secondary17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS18 AST SmartSleep 65 Novell Netware b8 BSDI swap fc VMware VMKCORE1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fd Linux raid auto1c Hidden W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep1e Hidden W95 FAT1 80 Old Minix be Solaris boot ff BBT

El propósito principal de soportar la capacidad de leer tantos tipos de particiones es permitir la compatibilidad y al menos cierta interoperabilidad con los sistemas de archivos de otros ordenadores. Las opciones disponibles al crear un nuevo sistema de archivos con Fedora se muestran en la siguiente lista.

  • btrfs
  • cramfs
  • ext2
  • ext3
  • ext4
  • fat
  • gfs2
  • hfsplus
  • minix
  • msdos
  • ntfs
  • reiserfs
  • vfat
  • xfs

Otras distribuciones soportan la creación de diferentes tipos de sistemas de archivos. Por ejemplo, CentOS 6 sólo admite la creación de los sistemas de archivos resaltados en negrita en la lista anterior.

Montar

El término «montar» un sistema de archivos en Linux se remonta a los primeros días de la informática, cuando era necesario montar físicamente un paquete de cintas o discos extraíbles en un dispositivo de unidad apropiado. Después de ser colocado físicamente en la unidad, el sistema de archivos en el paquete de disco sería montado lógicamente por el sistema operativo para hacer que el contenido esté disponible para el acceso del sistema operativo, los programas de aplicación y los usuarios.

Un punto de montaje es simplemente un directorio, como cualquier otro, que se crea como parte del sistema de archivos raíz. Así, por ejemplo, el sistema de archivos home se monta en el directorio /home. Los sistemas de archivos pueden ser montados en puntos de montaje en otros sistemas de archivos no raíz, pero esto es menos común.

El sistema de archivos raíz de Linux se monta en el directorio raíz (/) muy temprano en la secuencia de arranque. Otros sistemas de archivos se montan más tarde, por los programas de inicio de Linux, ya sea rc bajo SystemV o por systemd en las nuevas versiones de Linux. El montaje de los sistemas de archivos durante el proceso de arranque es gestionado por el archivo de configuración /etc/fstab. Una forma fácil de recordarlo es que fstab significa «tabla de sistemas de archivos», y es una lista de sistemas de archivos que deben ser montados, sus puntos de montaje designados, y cualquier opción que pueda ser necesaria para sistemas de archivos específicos.

Los sistemas de archivos se montan en un directorio/punto de montaje existente utilizando el comando mount. En general, cualquier directorio que se utilice como punto de montaje debe estar vacío y no tener ningún otro archivo contenido en él. Linux no impedirá que los usuarios monten un sistema de archivos sobre otro que ya esté allí o sobre un directorio que contenga archivos. Si se monta un sistema de archivos sobre un directorio o sistema de archivos existente, el contenido original se ocultará y sólo será visible el contenido del sistema de archivos recién montado.

Conclusión

Espero que parte de la posible confusión que rodea al término sistema de archivos se haya aclarado con este artículo. Me tomó mucho tiempo y un mentor muy útil para entender y apreciar realmente la complejidad, la elegancia y la funcionalidad del sistema de archivos de Linux en todos sus significados.

Si tienes preguntas, por favor, añádelas en los comentarios de abajo y trataré de responderlas.

El próximo mes

Otro concepto importante es que para Linux, todo es un archivo. Este concepto tiene algunas aplicaciones prácticas interesantes e importantes para usuarios y administradores de sistemas. La razón por la que menciono esto es que quizás quieras leer mi artículo «Todo es un archivo» antes del artículo que estoy planeando para el próximo mes sobre el directorio /dev.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.