Sistemas de archivos virtuales en Linux: ¿por qué son necesarios y cómo funcionan? Parte 2

Hola a todos, compartimos con ustedes la segunda parte de la publicación “Sistemas de archivos virtuales en Linux: ¿por qué son necesarios y cómo funcionan?” Puedes leer la primera parte. aquí. Te recordamos que esta serie de publicaciones está programada para coincidir con el lanzamiento de una nueva corriente en el curso. "Administrador de Linux", que comienza muy pronto.

Cómo monitorear VFS usando herramientas eBPF y bcc

La forma más sencilla de comprender cómo funciona el kernel en los archivos sysfs Es verlo en la práctica, y la forma más sencilla de ver ARM64 es usar eBPF. eBPF (abreviatura de Berkeley Packet Filter) consiste en una máquina virtual que se ejecuta en el núcleo, que los usuarios privilegiados pueden solicitar (query) desde la línea de comando. Las fuentes del núcleo le dicen al lector lo que puede hacer el núcleo; ejecutar las herramientas eBPF en un sistema cargado muestra lo que realmente está haciendo el kernel.

Sistemas de archivos virtuales en Linux: ¿por qué son necesarios y cómo funcionan? Parte 2

Afortunadamente, comenzar a usar eBPF es bastante fácil con la ayuda de herramientas. bcc, que están disponibles como paquetes de la distribución general Linux y documentado en detalle Bernardo Gregg. Herramientas bcc Son scripts de Python con pequeñas inserciones de código C, lo que significa que cualquier persona familiarizada con ambos lenguajes puede modificarlos fácilmente. EN bcc/tools Hay 80 scripts de Python, lo que significa que lo más probable es que un desarrollador o administrador del sistema pueda elegir algo adecuado para resolver el problema.
Para tener al menos una idea superficial de qué trabajo hacen los VFS en un sistema en ejecución, intente vfscount o vfsstat. Esto mostrará, digamos, que docenas de llamadas vfs_open() y "sus amigos" ocurren literalmente cada segundo.

Sistemas de archivos virtuales en Linux: ¿por qué son necesarios y cómo funcionan? Parte 2

vfsstat.py es un script de Python con inserciones de código C que simplemente cuenta las llamadas a funciones VFS.

Pongamos un ejemplo más trivial y veamos qué sucede cuando insertamos una unidad flash USB en una computadora y el sistema la detecta.

Sistemas de archivos virtuales en Linux: ¿por qué son necesarios y cómo funcionan? Parte 2

Usando eBPF puedes ver lo que está sucediendo en /syscuando se inserta una unidad flash USB. Aquí se muestra un ejemplo simple y complejo.

En el ejemplo mostrado arriba, bcc инструмент rastro.py imprime un mensaje cuando se ejecuta el comando sysfs_create_files(). Vemos eso sysfs_create_files() fue lanzado usando kworker transmitir en respuesta al hecho de que se insertó la unidad flash, pero ¿qué archivo se creó? El segundo ejemplo muestra el poder de eBPF. Aquí trace.py Imprime un seguimiento del kernel (opción -K) y el nombre del archivo que se creó. sysfs_create_files(). La inserción de una sola declaración es código C que incluye una cadena de formato fácilmente reconocible proporcionada por el script Python que ejecuta LLVM. compilador justo a tiempo. Compila esta línea y la ejecuta en una máquina virtual dentro del kernel. Firma de función completa sysfs_create_files () debe reproducirse en el segundo comando para que la cadena de formato pueda hacer referencia a uno de los parámetros. Los errores en esta parte del código C dan como resultado errores reconocibles por parte del compilador de C. Por ejemplo, si se omite el parámetro -l, verá "Error al compilar el texto BPF". Los desarrolladores que estén familiarizados con C y Python encontrarán las herramientas bcc fácil de ampliar y cambiar.

Cuando se inserta la unidad USB, el seguimiento del kernel mostrará que PID 7711 es un subproceso kworkerque creó el archivo «events» в sysfs. En consecuencia, la llamada de sysfs_remove_files() mostrará que al quitar la unidad se eliminó el archivo events, que corresponde al concepto general de recuento de referencias. Al mismo tiempo, viendo sysfs_create_link () con eBPF mientras inserta la unidad USB mostrará que se han creado al menos 48 enlaces simbólicos.

Entonces, ¿cuál es el objetivo del archivo de eventos? Uso alcance para buscar __device_add_disk(), muestra lo que causa disk_add_events (), y también "media_change"O "eject_request" se puede grabar en un archivo de eventos. Aquí, la capa de bloque del núcleo informa al espacio de usuario que ha aparecido y expulsado un "disco". Tenga en cuenta lo informativo que es este método de investigación mediante la inserción de una unidad USB, en comparación con tratar de descubrir cómo funcionan las cosas únicamente desde la fuente.

Los sistemas de archivos raíz de solo lectura habilitan dispositivos integrados

Por supuesto, nadie apaga el servidor o su ordenador desenchufando el enchufe. ¿Pero por qué? Esto se debe a que los sistemas de archivos montados en dispositivos de almacenamiento físico pueden tener escrituras retrasadas y es posible que las estructuras de datos que registran su estado no estén sincronizadas con las escrituras en el almacenamiento. Cuando esto sucede, los propietarios del sistema tienen que esperar hasta el próximo inicio para iniciar la utilidad. fsck filesystem-recovery y, en el peor de los casos, perder datos.

Sin embargo, todos sabemos que muchos dispositivos de IoT, así como enrutadores, termostatos y automóviles, ahora ejecutan Linux. Muchos de estos dispositivos tienen poca o ninguna interfaz de usuario y no hay forma de apagarlos "limpiamente". Imagínese arrancar un automóvil con la batería agotada cuando la energía de la unidad de control es Linux saltando constantemente arriba y abajo. ¿Cómo es que el sistema arranca sin mucho tiempo? fsck¿Cuándo empieza finalmente a funcionar el motor? Y la respuesta es simple. Los dispositivos integrados dependen del sistema de archivos raíz solo para leer (abreviado ro-rootfs (sistema de archivos raíz de solo lectura)).

ro-rootfs ofrecen muchos beneficios que son menos obvios que la autenticidad. Una ventaja es que el malware no puede escribir en /usr o /lib, si ningún proceso de Linux puede escribir allí. Otra es que un sistema de archivos en gran medida inmutable es fundamental para el soporte de campo de dispositivos remotos, ya que el personal de soporte depende de sistemas locales que son nominalmente idénticos a los sistemas de campo. Quizás el beneficio más importante (pero también el más insidioso) es que ro-rootfs obliga a los desarrolladores a decidir qué objetos del sistema serán inmutables en la etapa de diseño del sistema. Trabajar con ro-rootfs puede ser incómodo y doloroso, como suelen serlo las variables constantes en los lenguajes de programación, pero sus beneficios justifican fácilmente la sobrecarga adicional.

creación rootfs El modo de solo lectura requiere un esfuerzo adicional para los desarrolladores integrados, y aquí es donde VFS entra en escena. Linux requiere que los archivos estén en /var se podían escribir y, además, muchas aplicaciones populares que ejecutan sistemas integrados intentarán crear configuraciones dot-files в $HOME. Una solución para los archivos de configuración en el directorio de inicio suele ser pregenerarlos e integrarlos en rootfs. Para /var Un enfoque posible es montarlo en una partición grabable separada, mientras / montado de solo lectura. Otra alternativa popular es utilizar soportes enlazados o superpuestos.

Soportes enlazables y apilables, su uso por contenedores

Ejecución de comandos man mount es la mejor manera de aprender sobre montajes vinculables y superponibles, que brindan a los desarrolladores y administradores de sistemas la capacidad de crear un sistema de archivos en una ruta y luego exponerlo a aplicaciones en otra. Para sistemas integrados, esto significa la capacidad de almacenar archivos en /var en una unidad flash de solo lectura, pero una superposición o ruta de montaje vinculable desde tmpfs в /var al cargar, permitirá que las aplicaciones escriban notas allí (garabatos). La próxima vez que active los cambios en /var se perderá. Un soporte superpuesto crea una unión entre tmpfs y el sistema de archivos subyacente y le permite realizar cambios aparentes en los archivos existentes en ro-tootf mientras que una montura vinculable puede dejar otras nuevas vacías tmpfs carpetas visibles como grabables en ro-rootfs maneras. Mientras overlayfs Este es el correcto (proper) tipo de sistema de archivos, el montaje enlazable se implementa en Espacio de nombres VFS.

Según la descripción de la superposición y el soporte vinculable, a nadie le sorprende que Contenedores de Linux se utilizan activamente. Veamos qué pasa cuando usamos sistemad-nspawn para ejecutar el contenedor usando la herramienta mountsnoop de bcc.

Llamar system-nspawn inicia el contenedor mientras se ejecuta mountsnoop.py.

Vamos a ver que pasó:

Lanzar mountsnoop mientras el contenedor se "arranca" muestra que el tiempo de ejecución del contenedor depende en gran medida del montaje que se está vinculando (solo se muestra el comienzo de la salida larga).

es systemd-nspawn proporciona archivos seleccionados en procfs и sysfs host al contenedor como rutas hacia él rootfs. Excepto MS_BIND indicador que configura el montaje vinculante, algunos otros indicadores en el montaje definen la relación entre los cambios en los espacios de nombres del host y del contenedor. Por ejemplo, un montaje vinculado puede omitir cambios en /proc и /sys en el contenedor u ocultarlos según la llamada.

Conclusión

Comprender el funcionamiento interno de Linux puede parecer una tarea imposible, ya que el propio kernel contiene una enorme cantidad de código, dejando de lado las aplicaciones del espacio de usuario de Linux y las interfaces de llamadas al sistema en bibliotecas C como glibc. Una forma de avanzar es leer el código fuente de un subsistema del kernel, con énfasis en comprender las llamadas al sistema y los encabezados del espacio de usuario, así como las principales interfaces internas del kernel, como la tabla file_operations. Las operaciones de archivos proporcionan el principio de "todo es un archivo", lo que las hace particularmente agradables de administrar. Archivos fuente del kernel C en el directorio de nivel superior fs/ presentan una implementación de sistemas de archivos virtuales, que son una capa contenedora que proporciona una compatibilidad amplia y relativamente simple entre los sistemas de archivos y dispositivos de almacenamiento populares. La vinculación y el montaje de superposiciones a través de espacios de nombres de Linux es la magia de VFS que hace posible la creación de contenedores de solo lectura y sistemas de archivos raíz. Combinado con un examen del código fuente, la herramienta principal eBPF y su interfaz bcc
haciendo que la exploración del núcleo sea más fácil que nunca.

Amigos, escriban, ¿les resultó útil este artículo? ¿Quizás tenga algún comentario o observación? Y aquellos que estén interesados ​​en el curso de Administrador de Linux están invitados a Dia abierto, que tendrá lugar el 18 de abril.

La primera parte

Fuente: habr.com

Añadir un comentario