Qué es el Virtual File System


Hemos hablado de sistemas de archivos concretos (NTFS, ext4, APFS, HDFS, etc.) pero sabemos que existe lo que se llama el VFS (Virtual File System), vamos a ubicarlo dentro de toda esta arquitectura para que quede claro qué es y quién lo gestiona.


El Sistema de Ficheros Virtual (VFS): Abstracción y Flexibilidad en la Gestión de Archivos

El Sistema de Ficheros Virtual (VFS) es un componente fundamental en los sistemas operativos modernos, especialmente en entornos como Linux, que busca proporcionar una interfaz uniforme y versátil para interactuar con una amplia gama de sistemas de ficheros subyacentes. Su propósito principal es abstraer las complejidades y diferencias inherentes a cada tipo de sistema de ficheros físico, presentando una vista coherente a los procesos de usuario y aplicaciones.

¿Qué es el VFS?

En esencia, el VFS es una utilidad de gestión de ficheros potente y versátil que permite a los procesos de usuario ver y manipular ficheros y directorios de la misma manera, sin importar si están almacenados en un sistema FAT, NTFS, ext4 o cualquier otro. Actúa como una capa intermedia entre las llamadas al sistema de ficheros de las aplicaciones y las implementaciones específicas de los sistemas de ficheros en el hardware.

El VFS opera bajo un modelo de ficheros común que es capaz de representar las características y el comportamiento generales de cualquier sistema de ficheros concebible. Asume que los ficheros son objetos en un sistema de almacenamiento masivo que comparten propiedades básicas, como tener un nombre simbólico único dentro de un directorio, un propietario, protección contra accesos no autorizados, y la capacidad de ser creados, leídos, escritos o borrados.

Funcionamiento y Arquitectura

Cuando un proceso de usuario inicia una llamada al sistema orientada a ficheros (por ejemplo, read() o write()), esta petición es interceptada por el VFS. El VFS, a su vez, convierte esta llamada genérica en una llamada interna al sistema de ficheros del núcleo, que luego se pasa a una función de proyección específica para el sistema de ficheros destino (por ejemplo, JFS de IBM).

Esta función de proyección tiene la tarea crucial de transformar la llamada estándar del VFS a una llamada nativa que el sistema de ficheros físico subyacente pueda entender y ejecutar. En muchos casos, esta proyección es sencilla, pero puede volverse más compleja si hay diferencias fundamentales (por ejemplo, en sistemas FAT donde los directorios no se tratan como ficheros). Una vez que el sistema de ficheros destino ha realizado la operación solicitada en el almacenamiento secundario, los resultados son comunicados de vuelta al usuario a través del VFS.

El VFS es independiente de cualquier sistema de ficheros concreto, lo que significa que la lógica de traducción y manejo de las peculiaridades de cada sistema de ficheros se encarga de implementar en el módulo de proyección del sistema de ficheros específico.

Capas en el acceso a ficheros en un sistema operativo

Cuando un proceso hace algo tan simple como open("datos.txt"), no se va directamente a ext4 o NTFS: hay varias capas que median.

  1. Proceso de usuario
    • Llama a una función de biblioteca (fopen, open, etc.).
    • Esto acaba invocando una system call al kernel.
  2. VFS (Virtual File System) ← aquí está tu pregunta
    • Es una capa dentro del kernel que abstrae los sistemas de archivos reales.
    • Proporciona una API unificada: operaciones estándar (open, read, write, close, mkdir, unlink…), independientemente de si el archivo está en ext4, NTFS, APFS, NFS, HDFS (si está montado) o cualquier otro.
    • Gestiona estructuras en memoria:
      • dentry (directory entries): asocian nombres de archivo con i-nodes.
      • inodes virtuales: representación genérica de metadatos de un fichero.
      • superblock virtual: representación abstracta de un sistema de archivos.
  3. Driver del sistema de archivos específico
    • Cada sistema real (ext4, NTFS, APFS, XFS, Btrfs, CephFS, etc.) implementa las funciones que el VFS le exige:
      • read_inode(), write_inode(), lookup(), readpage(), etc.
    • El driver traduce las operaciones abstractas del VFS en accesos concretos a estructuras físicas de ese FS.
  4. Driver de dispositivo de bloque
    • Gestiona la lectura/escritura en el hardware subyacente (disco, SSD, red, etc.).
  5. Hardware
    • Dispositivo físico de almacenamiento o red.

Ejemplo de flujo con VFS

Un programa en Linux ejecuta:

fd = open("/home/miguel/informe.txt", O_RDONLY);

El flujo es:

  1. El proceso invoca la syscall open.
  2. El VFS interpreta la ruta, busca la entrada en su caché de dentries y localiza el i-node virtual.
  3. El VFS detecta que el fichero está en un volumen ext4 montado.
  4. Llama al driver ext4, que implementa las funciones concretas.
  5. El driver ext4 calcula en qué bloques físicos del disco está el i-node real y lo carga.
  6. Si hay lectura, el driver pide al subsistema de bloque que lea esos sectores del disco.
  7. El dato sube de vuelta, pasando por ext4 → VFS → syscall → proceso.

¿Dónde encaja el VFS entonces?

  • Está en el núcleo del sistema operativo,
  • Por encima de los sistemas de ficheros concretos (ext4, NTFS, APFS, NFS, etc.),
  • Por debajo de la interfaz de llamadas al sistema que ven los programas.

En una frase:

👉 El VFS es la capa de abstracción que ofrece una interfaz uniforme a los programas, independientemente del sistema de archivos real que se esté usando.


Relación con los FS

  • ext4, NTFS, APFS, FAT32, XFS, Btrfs… → sistemas de archivos locales que implementan las operaciones que el VFS define.
  • NFS, CephFS, GlusterFS, HDFS… → sistemas de archivos distribuidos que también se integran a través del VFS, de modo que para el usuario open("/mnt/nfs/proyecto") es igual que open("/home/user/proyecto").
  • VFS → no es un FS “real”, sino el intermediario que hace que todos parezcan iguales desde el punto de vista de los procesos.

Aquí tienes un artículo detallado sobre el Sistema de Ficheros Virtual (VFS), basándome en la información proporcionada.


Su naturaleza es Orientada a Objetos

A pesar de que el VFS de Linux está escrito en C, un lenguaje que no es intrínsecamente orientado a objetos, se concibe y se implementa como un esquema orientado a objetos. Esto se logra definiendo los objetos del VFS como estructuras de datos C que contienen tanto los datos relevantes como punteros a las funciones (métodos) que operan sobre esos datos.

Los cuatro tipos de objetos primarios en el VFS son:

  1. Objeto Superbloque: Representa un sistema de ficheros montado específico. Incluye información como el estado de dirty flag (indicando cambios no escritos a disco), tipo de fichero, flags (como solo lectura), un puntero al directorio raíz del sistema de ficheros, una lista de ficheros abiertos, un semáforo para controlar el acceso y una lista de operaciones (métodos) para manipular el superbloque (como read_inode, write_inode, put_super, statfs, etc.).
  2. Objeto Nodo-i (Inode): Representa un fichero específico. Contiene toda la información sobre un fichero, excepto su nombre y su contenido real. Esto incluye el propietario, grupo, permisos, tiempos de acceso, tamaño de los datos y el número de enlaces (referencias). También tiene un objeto de operaciones (operaciones de nodo-i) que define funciones como create, lookup y mkdir. El concepto de nodo-i se basa en los sistemas de ficheros UNIX.
  3. Objeto Entrada de Directorio (entradaD): Representa un componente específico de una ruta, que puede ser un nombre de directorio o un nombre de fichero. Facilita el acceso a ficheros y directorios, y se utiliza en una caché de entradaD para mejorar el rendimiento.
  4. Objeto Fichero: Representa un fichero que ha sido abierto por un proceso. Se crea en respuesta a la llamada open() y se destruye con close(). Contiene elementos como el objeto entradaD asociado, el sistema de ficheros al que pertenece, un contador de uso, los identificadores de usuario y grupo, y un puntero de posición actual en el fichero. También tiene un objeto de operaciones que define métodos como lectura, escritura, apertura, creación y bloqueo.

Relación con los conceptos de UNIX

El diseño del VFS se basa en los conceptos clave del sistema de ficheros de UNIX. En UNIX, los directorios se organizan jerárquicamente como un árbol, donde cada directorio es como una carpeta que puede contener ficheros y otros directorios. Un directorio se implementa como un fichero que lista sus contenidos, y las operaciones de fichero pueden aplicarse tanto a ficheros como a directorios. El VFS toma estas ideas fundamentales y las generaliza para soportar diversos sistemas de ficheros.

Beneficios del VFS

El Sistema de Ficheros Virtual ofrece varias ventajas cruciales:

  • Interfaz Uniforme: Proporciona una API (Interfaz de Programación de Aplicaciones) consistente para las aplicaciones, independientemente del sistema de ficheros subyacente.
  • Modularidad y Extensibilidad: Permite que se añadan nuevos sistemas de ficheros al sistema operativo simplemente escribiendo un módulo de proyección adecuado para el VFS.
  • Portabilidad: Facilita la portabilidad de aplicaciones entre diferentes sistemas de ficheros, ya que no necesitan conocer los detalles específicos de cada uno.
  • Simplificación del Desarrollo: Los desarrolladores de aplicaciones no necesitan preocuparse por los detalles de bajo nivel de la gestión de ficheros, ya que el VFS se encarga de esa abstracción.

Conclusión

El Sistema de Ficheros Virtual es como un adaptador universal para los sistemas de archivos. Imagina que tienes diferentes tipos de dispositivos USB (pendrives, discos duros externos, cámaras, etc.) fabricados por distintas marcas, cada uno con su propio formato interno. El VFS actúa como el puerto USB de tu computadora y el controlador del sistema operativo, permitiéndote enchufar cualquiera de esos dispositivos y acceder a tus archivos de la misma manera, arrastrar y soltar, copiar, pegar, sin tener que preocuparte por cómo cada fabricante organiza los datos internamente. Esta capa de abstracción simplifica enormemente el uso y desarrollo de software, al tiempo que dota al sistema operativo de una flexibilidad y modularidad excepcionales.