Virtual Filesystem, una gran ventaja de Linux
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.
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.
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!!