Aya, a primeira biblioteca a criar controladores eBPF em Rust

Conheça Aya, a primeira biblioteca a criar controladores eBPF em Rust e que não requer as ferramentas da linguagem C ou os cabeçalhos do kernel.

Linus torvalds, bem como muitos desenvolvedores do kernel e de diferentes distribuições, expressaram seu gosto pelo Rust e até mesmo em mais de uma ocasião foi apresentado o problema da implementação de drivers nesta linguagem de programação no Kernel do Linux.

E sobre isso, vários trabalhos já foram lançados, dos quais já mencionamos aqui no blog e podemos citar, por exemplo, a experiência bem-sucedida do conjunto alternativo de utilitários, coreutils, reescrito em Rust (inclui utilitários como sort, cat, chmod, chown, chroot, cp, date, dd, echo, hostname, id, ln e ls).

Diante disso, Linus torvalds não se pronunciou totalmente a favor desta iniciativa e expressou os pontos negativos (você pode verificar os detalhes no link a seguir).

Apesar das duras críticas de Linus, o trabalho de implementação do Rust no kernel não parou de avançar e recentemente foi apresentada a primeira versão da biblioteca Aya, que permite criar drivers eBPF em Rust que rodam dentro do kernel Linux em uma máquina virtual JIT especial.

Aya, a primeira biblioteca a criar controladores eBPF em Rust

Aya, a primeira biblioteca a criar controladores eBPF em Rust
Aya, a primeira biblioteca a criar controladores eBPF em Rust

Ao contrário de outras ferramentas de desenvolvimento EBPF, Aya não usa libbpf e o compilador BCC, mas oferece sua própria implementação escrita em Rust que usa o pacote libc drawer para acessar diretamente as chamadas de sistema do kernel.

A compilação do Aya não requer as ferramentas da linguagem C ou os cabeçalhos do kernel.

Para quem não está familiarizado com eBPF, você deve saber que este é um interpretador de bytecode embutido no kernel Linux que permite criar controladores de operações de rede, monitorar a operação do sistema, interceptar chamadas do sistema, controlar o acesso, processar eventos com tempo, calcular a frequência e o tempo de operações e rastreio usando kprobes/uprobes/tracepoints.

Graças à compilação JIT, o código de byte é traduzido em instruções de máquina instantaneamente e é executado com o desempenho do código nativo.

O XDP fornece um meio de executar programas BPF no nível do driver de rede, com acesso direto ao buffer de pacote DMA, permitindo que você crie drivers de alto desempenho para condições de alta carga de rede.

Dos principais recursos mencionados no Aya, podemos descobrir que ele tem suporte para BTF (formato de tipo BPF), que fornece informações de tipo em pseudocódigo BPF para verificar e comparar os tipos fornecidos pelo kernel atual.

O uso do BTF possibilita a criação de drivers eBPF universais que podem ser usados ​​sem a necessidade de recompilá-los com diferentes versões do kernel Linux.

Assim como o suporte para chamadas bpf-to-bpf, variáveis ​​globais e inicializadores, que permite desenhar programas para eBPF por analogia com programas convencionais utilizando aya como tempo de execução, cancelando funções tendo em conta o trabalho em eBPF.

Por outro lado, ele também tem suporte para tipos de kernel internos, incluindo matrizes regulares, mapas de hash, pilhas, filas, rastreamentos de pilha e estruturas para soquetes e rastreamento de desempenho.

Ele também tem a capacidade de criar vários tipos de programas eBTF, incluindo programas para filtragem e gerenciamento de tráfego, cgroup e vários drivers de soquete, programas XDP e também suporte de plataforma para processamento de solicitação assíncrona no modo tokyo assíncrono e sem bloqueio.

É importante mencionar que o projeto ainda é considerado experimental, pois a API ainda não está estabilizada e continua evoluindo. Além disso, nem todas as funções concebidas ainda foram implementadas.

Até o final do ano, os desenvolvedores esperam trazer a funcionalidade do Aya no mesmo nível da libbpf e em janeiro de 2022 formar a primeira versão estável.

Também está planejado combinar as partes do Aya necessárias para escrever o código Rust para o kernel do Linux com os componentes do espaço do usuário usados ​​para carregar, anexar e interagir com programas eBPF.

Por fim, se você tiver interesse em saber mais sobre o assunto, poderá verificar os detalhes no seguinte endereço.

Sobre o Edivaldo Brito

Edivaldo Brito é analista de sistemas, gestor de TI, blogueiro e também um grande fã de sistemas operacionais, banco de dados, software livre, redes, programação, dispositivos móveis e tudo mais que envolve tecnologia.

Deixe um comentário

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.