Aya, la primera biblioteca para crear controladores eBPF en Rust
Linus torvalds asi como muchos desarrolladores del Kernel y de diferentes distribuciones han expresado su agrado sobre Rust e incluso en más de una ocasión se ha presentado el tema sobre la implementación de controladores en este lenguaje de programación sobre el Kernel de Linux.
Y sobre ello ya se han dado a conocer diversos trabajos de los cuales ya hemos mencionado aquí en el blog y podemos mencionar por ejemplo al experimento exitoso del conjunto alternativo de utilidades, coreutils, reescrito en Rust (este incluye utilidades como sort, cat, chmod, chown, chroot, cp, date, dd, echo, hostname, id, ln y ls).
Ante esto, Linus torvalds no ha dado del todo su punto a favor sobre esta iniciativa y ha expresado los puntos negativos (puedes consultar los detalles en el siguiente enlace.)
Pese a la dura crítica de Linus, los trabajos sobre la implementación de Rust en el Kernel no han dejado de seguir adelante y hace poco se presentó la primera versión de la biblioteca Aya, que permite crear controladores eBPF en Rust que se ejecutan dentro del kernel de Linux en una máquina virtual JIT especial.
A diferencia de otras herramientas de desarrollo EBPF, Aya no utiliza libbpf y el BCC compilador, pero ofrece su propia implementación escrita en Rust que utiliza la libc paquete de cajón a las llamadas al sistema del kernel directamente de acceso. La construcción de Aya no requiere las herramientas del lenguaje C ni los encabezados del kernel.
Para quienes desconocen de eBPF, deben saber que este es un intérprete de código de bytes integrado en el kernel de Linux que le permite crear controladores de operaciones de red, monitorear el funcionamiento del sistema, interceptar llamadas al sistema, controlar el acceso, procesar eventos con cronometraje, calcular la frecuencia y el tiempo de las operaciones y realizar el seguimiento mediante kprobes/uprobes/tracepoints.
Gracias a la compilación JIT, el código de bytes se traduce en instrucciones de máquina sobre la marcha y se ejecuta con el rendimiento del código nativo. XDP proporciona un medio para ejecutar programas BPF en el nivel del controlador de red, con acceso directo al búfer DMA de paquetes, lo que le permite crear controladores de alto rendimiento para condiciones de alta carga de red.
Sobre Aya
De las características clave que se mencionan de Aya podremos encontrar que cuenta con el soporte para BTF (formato de tipo BPF), que proporciona información de tipo en pseudocódigo BPF para verificar y comparar tipos proporcionados por el kernel actual. El uso de BTF hace posible crear controladores eBPF universales que se pueden usar sin tener que volver a compilarlos con diferentes versiones del kernel de Linux.
Asi como tambien el soporte para llamadas bpf-to-bpf, variables globales e inicializadores, lo que permite diseñar programas para eBPF por analogía con programas convencionales utilizando aya como tiempo de ejecución, anulando funciones teniendo en cuenta el trabajo en eBPF.
Por otra parte, tambien cuenta con el soporte para tipos de kernel internos, incluidas matrices regulares, mapas hash, pilas, colas, seguimientos de pila y estructuras para sockets y seguimiento del rendimiento.
Tambien cuenta con la capacidad para crear varios tipos de programas eBTF, incluidos programas para filtrado y gestión de tráfico, cgroup y varios controladores de socket, programas XDP y tambien soporte de plataforma para el procesamiento de solicitudes asincrónicas en modo tokio sin bloqueo y async-std .
Compilación rápida, sin estar atado a la compilación del kernel ni a los encabezados del kernel.
Es importante mencionar que el proyecto aún se considera experimental, ya que la API aún no está estabilizada y continúa evolucionando. Además, aún no se han implementado todas las funciones concebidas.
Para finales de año, los desarrolladores esperan llevar la funcionalidad de Aya a la par con libbpf y en enero de 2022 formar la primera versión estable. También se planea combinar las partes de Aya necesarias para escribir código Rust para el kernel de Linux con los componentes del espacio de usuario utilizados para cargar, adjuntar e interactuar con programas eBPF.
Finalmente si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.