¡Hola a todos! Continuamos lanzando nuevos cursos en los que ya estáis habituados y ahora estamos encantados de anunciar que comenzamos un nuevo grupo para el curso , que se iniciará a finales de abril. A este evento se le dedicará una nueva publicación. Se puede .
Los sistemas de archivos virtuales actúan como una especie de abstracción mágica que permite a la filosofía de Linux decir que "todo es un archivo".

¿Qué es un sistema de archivos? Basándonos en las palabras de uno de los primeros contribuidores y autores de Linux , "Un sistema de archivos es un almacenamiento jerárquico de datos, organizado de acuerdo con una estructura definida". De todos modos, esta definición se adapta igualmente bien a VFAT (Tabla de Asignación de Archivos Virtual), Git y (). Entonces, ¿qué define un concepto como "sistema de archivos"?
Fundamentos del sistema de archivos
El núcleo de Linux tiene requisitos específicos sobre la entidad que puede ser considerada un sistema de archivos. Debe implementar los métodos open(), read() y write() para objetos persistentes que tienen nombres. Desde la perspectiva de la programación orientada a objetos Si podemos abrir, leer y escribir en una entidad, esta entidad se considera un archivo, como se ve en el ejemplo en la consola anterior.

El fenómeno de VFS destaca la observación característica de los sistemas similares a Unix, que dice que "todo es un archivo". Considera lo extraño que es que ese pequeño ejemplo de arriba con /dev/console muestra cómo realmente funciona la consola. En la imagen hay una sesión interactiva de Bash. Enviar una línea a la consola (dispositivo de consola virtual) la muestra en la pantalla virtual. VFS tiene otras propiedades aún más extrañas. Por ejemplo, permite realizar búsquedas en
él .
Los sistemas que conocemos, como ext4, NFS y /proc, tienen tres funciones importantes en la estructura de datos C, conocida como . Además, ciertos sistemas de archivos expanden y redefinen las funciones de VFS de una manera orientada a objetos familiar. Como señala Robert Love, la abstracción VFS permite a los usuarios de Linux copiar archivos sin preocupaciones hacia o desde otros sistemas operativos o entidades abstractas, como pipes, sin preocuparse por su formato interno de datos. Desde el espacio de usuario, a través de llamadas al sistema, un proceso puede copiar desde un archivo a estructuras de datos del núcleo usando el método read() de un sistema de archivos, y luego usar el método write () de otro sistema de archivos para la salida de datos.
Las definiciones de funciones que pertenecen a los tipos básicos de VFS se encuentran en los archivos del código fuente del núcleo, mientras que los subdirectorios fs/ contienen ciertos sistemas de archivos. En el núcleo también existen entidades, como cgroups, /dev y tmpfs, que son necesarios en el proceso de arranque y, por ende, se definen en el subdirectorio del núcleo init/. Tenga en cuenta que cgroups, /dev y tmpfs no invocan a las «tres grandes» funciones file_operations, sino que leen y escriben directamente en la memoria.
En el diagrama siguiente se muestra cómo el espacio de usuario accede a los diferentes tipos de sistemas de archivos, normalmente montados en sistemas Linux. No se muestran construcciones como pipes, dmesg y reloj POSIX, que también implementan la estructura file_operations, a las que se accede a través de la capa VFS.

VFS es una «capa envolvente» entre las llamadas al sistema y las implementaciones de funciones específicas file_operations, como ext4 y MS_BIND. Las funciones file_operations pueden interactuar ya sea con controladores de dispositivos o con dispositivos de acceso a memoria. tmpfs, devtmpfs y cgroups no utilizan file_operations, sino que acceden directamente a la memoria.
La existencia de VFS permite reutilizar código, ya que los métodos básicos relacionados con los sistemas de archivos no necesitan ser implementados de nuevo por cada tipo de sistema de archivos. ¡La reutilización de código es una práctica ampliamente utilizada por los ingenieros de software! Sin embargo, si el código reutilizable contiene , todas las implementaciones que heredan métodos comunes sufren por ello.
/tmp: Простая подсказка
Una manera simple de detectar que VFS está presente en el sistema es ingresar mount | grep -v sd | grep -v :/, lo que mostrará todos los sistemas de archivos montados (mounted) que no son residentes en el disco y no son NFS, lo cual es cierto en la mayoría de las computadoras. Uno de los montajes enumerados (mounts) de VFS será, sin duda, /tmp, ¿verdad?

Todo el mundo sabe que almacenar / tmp en un medio físico es una locura. .
¿Por qué no es recomendable almacenar /tmp en un medio físico? Porque los archivos en /tmp son temporales y los dispositivos de almacenamiento son más lentos que la memoria donde se crea tmpfs. Además, los medios físicos son más propensos al desgaste por reescritura que la memoria. Finalmente, los archivos en /tmp pueden contener información confidencial, por lo que su desaparición con cada reinicio es una función inherente.
Desafortunadamente, algunos scripts de instalación de distribuciones de Linux crean /tmp en el dispositivo de almacenamiento por defecto. No te desesperes si esto ha sucedido con tu sistema. Sigue unas sencillas instrucciones en , para solucionarlo, y recuerda que la memoria asignada para tmpfs se vuelve inaccesible para otros propósitos. En otras palabras, un sistema con un tmpfs gigante y grandes archivos en él puede agotar toda la memoria y caer. Otro consejo: al editar el archivo /etc/fstab, ten en cuenta que debe terminar con una nueva línea, de lo contrario, tu sistema no arrancará.
/proc и /sys
Además de /tmp, VFS (sistemas de archivos virtuales), que son los más familiares para los usuarios de Linux, son /proc y /sys. (/dev se encuentra en la memoria compartida y no tiene file_operations). ¿Por qué precisamente estos dos componentes? Vamos a profundizar en esta cuestión.
MS_BIND crea una instantánea del estado del núcleo y los procesos que controla para userspace. Hay /proc el núcleo proporciona información sobre qué recursos tiene disponibles, como interrupciones, memoria virtual y programador. Además, /proc/sys es el lugar donde los parámetros configurables a través del comando sysctl, están disponibles para userspace. El estado y la estadística de los procesos individuales se muestran en los directorios /proc/.

Aquí /proc/meminfo es un archivo vacío que, no obstante, contiene información valiosa.
El comportamiento /proc de los archivos muestra cuán diferentes pueden ser los sistemas de archivos VFS. Por un lado, /proc/meminfo contienen información que se puede ver con el comando free. Por otro lado, ¡están vacíos! ¿Cómo es eso posible? La situación recuerda al famoso artículo titulado , escrito por el profesor de física de la Universidad de Cornell, David Mermin, en 1985. La cuestión es que el núcleo recopila estadísticas de memoria cuando se realiza una consulta a /proc, y en realidad en los archivos. /proc No hay nada cuando nadie está mirando. Como dijo , “La doctrina cuántica fundamental establece que la medición, en general, no revela un valor previamente existente de la propiedad medida.” (¡Y piensen sobre la pregunta de la luna como tarea para casa!)
La aparente vacuidad MS_BIND tiene sentido, ya que la información allí es dinámica. La situación es un poco diferente con sysfs. Comparamos cuántos archivos de al menos un byte hay en /proc y en /sys.

Procfs tiene un archivo, a saber, la configuración exportada del núcleo, que es una excepción, ya que solo necesita generarse una vez por arranque. Por otro lado, en /sys hay muchos archivos más voluminosos, muchos de los cuales ocupan una página completa de memoria. Por lo general, los archivos sysfs contienen exactamente un número o una cadena, a diferencia de las tablas de información obtenidas al leer archivos como /proc/meminfo.
El objetivo sysfs – proporcionar las propiedades disponibles para lectura y escritura de lo que el núcleo llama «kobjects» en el espacio de usuarios. El único propósito de kobjects es contar las referencias: cuando se elimina la última referencia a un kobject, el sistema recuperará los recursos asociados. Sin embargo, /sys constituye la mayor parte del famoso del núcleo, que nunca, bajo ninguna circunstancia, puede . Esto no significa que los archivos en sysfs sean estáticos, lo que contradice el conteo de referencias a objetos inestables.
La interfaz binaria estable del núcleo (stable ABI del núcleo) limita lo que puede aparecer en /sys, no lo que realmente está presente en un momento dado. El listado de permisos de archivos en sysfs proporciona una comprensión de cómo se pueden configurar o leer los parámetros configurables de dispositivos, módulos, sistemas de archivos, etc. Hacemos la deducción lógica de que procfs también es parte del stable ABI del núcleo, aunque no se especifique explícitamente en .

Los archivos en sysfs describen una propiedad específica para cada entidad y pueden ser legibles, sobrescribibles o ambos a la vez. Un “0” en el archivo indica que el SSD no puede eliminarse.
Comenzaremos la segunda parte de la traducción con cómo observar el VFS usando herramientas eBPF y bcc, y ahora esperamos sus comentarios y, como siempre, los invitamos a , que el 9 de abril será impartido por nuestro instructor — .
Fuente: habr.com
