Wprowadzono bibliotekę Aya do tworzenia procedur obsługi eBPF w Rust

Zaprezentowano pierwsze wydanie biblioteki Aya, która umożliwia tworzenie handlerów eBPF w języku Rust, które działają wewnątrz jądra Linuksa na specjalnej maszynie wirtualnej z JIT. W przeciwieństwie do innych narzędzi programistycznych eBPF, Aya nie używa kompilatora libbpf i bcc, zamiast tego oferuje własną implementację napisaną w Rust, która wykorzystuje pakiet libc crate do bezpośredniego dostępu do wywołań systemowych jądra. Budowanie Ayi nie wymaga narzędzi języka C ani plików nagłówkowych jądra. Kod biblioteki jest rozpowszechniany na licencji MIT i Apache 2.0.

Najważniejsze cechy:

  • Obsługa formatu BTF (BPF Type Format), który dostarcza informacji o typie w pseudokodzie BPF w celu sprawdzania typów i mapowania na typy dostarczane przez bieżące jądro. Użycie BTF umożliwia stworzenie uniwersalnych procedur obsługi eBPF, których można używać bez rekompilacji z różnymi wersjami jądra Linuksa.
  • Obsługa wywołań „bpf-to-bpf”, zmiennych globalnych i inicjatorów, co pozwala projektować programy dla eBPF w podobny sposób jak zwykłe programy wykorzystujące aya jako środowisko uruchomieniowe, które redefiniują funkcje z uwzględnieniem pracy w eBPF.
  • Obsługa różnych typów jądra, w tym zwykłych tablic, map skrótów, stosów, kolejek, śladów stosu, a także struktur gniazd i śledzenia wydajności.
  • Możliwość tworzenia różnego rodzaju programów eBTF, w tym programów do filtrowania i zarządzania ruchem, obsługi cgroup i różnych operacji na gniazdach, programów XDP.
  • Wsparcie dla platform do asynchronicznego przetwarzania żądań w trybie nieblokującym tokio i async-std.
  • Szybki montaż, bez żadnego połączenia z zespołem jądra i plikami nagłówkowymi jądra.

Projekt nadal uważany jest za eksperymentalny - API nie zostało jeszcze ustabilizowane i nadal się rozwija. Ponadto wszystkie zaplanowane możliwości nie zostały jeszcze zrealizowane. Do końca roku programiści spodziewają się zrównać funkcjonalność Ayi z libbpf, a w styczniu 2022 roku stworzyć pierwszą stabilną wersję. Planowane jest również połączenie części Ayi potrzebnych do napisania kodu Rust dla jądra Linuksa z komponentami przestrzeni użytkownika używanymi do ładowania, dołączania i interakcji z programami eBPF.

Przypomnijmy, że eBPF to interpreter kodu bajtowego wbudowany w jądro Linuksa, który umożliwia tworzenie procedur obsługi operacji sieciowych, monitorowanie działania systemu, przechwytywanie wywołań systemowych, kontrolę dostępu, przetwarzanie zdarzeń z zachowaniem synchronizacji, obliczanie częstotliwości i czasu operacji, wykonywanie śledzenie za pomocą kprobes/uprobes/tracepoints. Dzięki zastosowaniu kompilacji JIT kod bajtowy jest na bieżąco tłumaczony na instrukcje maszynowe i wykonywany z wydajnością kodu natywnego. XDP udostępnia narzędzia do uruchamiania programów BPF na poziomie sterowników sieciowych, z możliwością bezpośredniego dostępu do bufora pakietów DMA, co pozwala na tworzenie wysokowydajnych procesorów do pracy przy dużym obciążeniu sieci.

Źródło: opennet.ru

Dodaj komentarz