Virtual Filesystem, una gran ventaja de Linux

Publicado por Diego Córdoba en

Hoy vamos a hablar sobre uno de los conceptos más importantes en el mundo de los sistemas operativos *nix, mundo que incluye a nuestro querido GNU/Linux, y es el tema de virtual filesystem, o sistema de archivos virtual.


Todos quienes usamos (o alguna vez usamos) sistemas operativos Windows, sabemos que cada disco, cada partición, y cada dispositivo de almacenamiento masivo… en fin, cada «sistema de archivos«, entendiendo esto como una estructura de datos que organiza el contenido de un dispositivo de almacenamiento masivo, tiene en Windows y similares, una «unidad» diferente, con su directorio raíz, directorios y archivos incluidos.

Esta es una de las más grandes diferencias que existen entre Windows y sistemas *nix en general, Linux en particular, como veremos a continuación.

El sistema de archivos virtual

Linux, a diferencia de Windows, usa solo un árbol de directorios para todos los discos/particiones, y se llama Virtual FileSystem (VFS), o sistema de archivos virtual.

Esto es así porque el virtual filesystem de Linux se usa para muchas cosas más que para almacenar archivos. Es decir, el virtual filesystem permite acceder a los archivos de los discos que estén montados, pero también permite acceder a dispositivos, y archivos virtuales que literalmente no existen en ningún disco, pero son modelados como archivos.

 filesystem linux mount vfs virtual filesystem sistema de archivos

Así, un solo sistema de archivos virtual, con un solo directorio raíz, sirve para acceder a los archivos almacenados en cualquier partición, puesto que el mecanismo de acceso está basado en el montaje de los sistemas de archivos «reales» en directorios o «puntos de montaje» dentro del sistema de archivos raíz.

Fundamentos técnicos del virtual filesystem

Una de las razones por la que GNU/Linux permite acceder a cada sistema de archivos real como un subdirectorio del sistema de archivos virtual, es para homogeneizar la forma en la que se accede a ciertas estructuras de datos dentro del sistema operativo.

De esta manera la interfaz que se utiliza para acceder a archivos reales de disco también puede ser utilizada con cualquier otro tipo de archivo virtual, y éste mecanismo le da una flexibilidad enorme al sistema operativo, y simplifica la forma en que las aplicaciones pueden acceder a los datos de discos y del sistema operativo, y simplifica también las técnicas de desarrollo de aplicaciones.

En sistemas Windows existe una unidad de disco por cada disco/partición, con sus archivos, y un panel de control para administrar muchos dispositivos y algunas características del sistema.

 filesystem linux mount vfs virtual filesystem sistema de archivos

En Linux mediante el sistema de archivos virtual también se pueden administrar dispositivos, e incluso administrar el estado de ejecución de cada uno de los procesos que están corriendo, porque mucha de la información de los procesos en ejecución también se ve como una serie de archivos en disco, pero se encuentran en memoria o, alternativamente, en el espacio de almacenamiento de intercambio (swap). En Windows ver el estado de los procesos de esta forma es imposible.

Algunos ejemplos de archivos reales… y virtuales 🙂

El sistema de archivos raíz de un sistema Linux, o sea, la raíz de su sistema de archivos virtual, es el directorio «/» (slash). Podemos listarlos de la siguiente manera:

diego@cryptos:~$ ls /
bin   etc         initrd.img.old  media  proc  sbin  tmp  vmlinuz
boot  home        lib             mnt    root  srv   usr  vmlinuz.old
dev   initrd.img  lost+found      opt    run   sys   var

Estos directorios y archivos corresponden a la raíz del virtual filesystem de Linux (particularmente, Debian GNU/Linux).

De estos directorios, por ejemplo (y no entraremos en detalle puesto que en posts anteriores hemos descrito las entradas individuales), el directorio /etc contiene archivos reales de configuración, /home archivos reales de usuarios, /mnt y /media los puntos de montajes temporales y estáticos por defecto, etc.

Pero algunos de los directorios del sistema de archivos virtual no son reales, si no virtuales.

El directorio /dev contiene archivos virtuales de dispositivos, se «ven» como archivos, pero son en realidad archivos especiales, o nodos, y representan los dispositivos del sistema.

/proc contiene archivos virtuales de administración de procesos, por ejemplo, si listamos los procesos del sistema y filtramos (para reducir la salida) por alguna palabra particular, por ejemplo, «firefox«, tendríamos la siguiente salida:

diego@cryptos:~$ ps fax|grep pumpa
 6806 tty1     Sl     2:01 pumpa
29892 pts/0    S+     0:00  |   _ grep pumpa

Donde la primer columna corresponde al PID, o process ID de los procesos que contienen la palabra «pumpa» en su línea de ejecución.

En esta salida de ejemplo, el proceso 6806 es el que representa al cliente de microblogging pumpio «pumpa» que se encuentra corriendo en el sistema, mientras que el proceso 29892 es el propio proceso grep que se ejecutó mientras filtrábamos, y terminó luego de a ejecución del listado.

Podríamos analizar algunos datos de ejecución del proceso «pumpa» viendo su directorio en /proc:

diego@cryptos:~$ ls -l /proc/6806
total 0
dr-xr-xr-x  2 diego diego 0 Apr 12 22:42 attr
-rw-r--r--  1 diego diego 0 Apr 12 22:42 autogroup
-r--------  1 diego diego 0 Apr 12 22:42 auxv
-r--r--r--  1 diego diego 0 Apr 12 22:42 cgroup
--w-------  1 diego diego 0 Apr 12 22:42 clear_refs
-r--r--r--  1 diego diego 0 Apr 12 20:37 cmdline
-rw-r--r--  1 diego diego 0 Apr 12 22:42 comm
-rw-r--r--  1 diego diego 0 Apr 12 22:42 coredump_filter
-r--r--r--  1 diego diego 0 Apr 12 22:42 cpuset
lrwxrwxrwx  1 diego diego 0 Apr 12 20:39 cwd -> /home/die
-r--------  1 diego diego 0 Apr 12 22:42 environ
lrwxrwxrwx  1 diego diego 0 Apr 12 19:48 exe -> /opt/pumpa/pumpa
dr-x------  2 diego diego 0 Apr 12 19:48 fd
dr-x------  2 diego diego 0 Apr 12 20:39 fdinfo
-rw-r--r--  1 diego diego 0 Apr 12 22:42 gid_map
-r--------  1 diego diego 0 Apr 12 22:42 io
[...]

Esta salida contiene bastante información del proceso, entre ella, un directorio llamado «fd» que contiene los «file descriptors», o descriptores de archivos de los archivos que el proceso mantiene abiertos.

/var/run también tiene archivos virtuales de administración de procesos.

Archivos que no existen en el disco

Todos los archivos virtuales no existen, literalmente, en ningún sistema de archivos real, puesto que se generan cuando inicia el sistema operativo, o cuando se conectan dispositivos en caliente, como el sistema /dev, poblado de dispositivos al inicio, y modificado durante la ejecución del sistema operativo por el gestor de dispositivos udev.

Por su parte, los sistemas de archivos /proc y /var/run se modifican dinámicamente con cada ejecución de procesos en el sistema operativo, por lo que, por ejemplo, /proc tendrá un directorio nuevo por cada programa abierto, incluso por cada ejecución de comandos en una terminal de texto, y el directorio se mantendrá durante el tiempo que dure dicha ejecución.

Conclusiones

Hemos aprendido cómo funciona básicamente el kernel Linux para gestionar sistemas de archivos, qué es el sistema de archivos virtual, y cómo permite, mediante un solo directorio raíz/root, administrar todos los archivos del sistema, ya sean reales, almacenados en el disco, como virtuales, tales como procesos, dispositivos de entrada/salida, archivos temporales de distribución, etc.

Espero les haya resultado ameno y entretenido!

Cualquier duda o aporte queda abierta la sección de comentarios del blog para que puedan participar! Será muy bienvenido lo que cada uno pueda sumar.

Hasta la próxima!!


¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!


Diego Córdoba

- Ingeniero en Informática - Mg. Teleinformática - Tesis pendiente - Docente universitario - Investigador