Został wydany pierwszy numer biblioteki Aya, która umożliwia tworzenie eBPF-śledzących w języku Rust, uruchamianych wewnątrz jądra Linux w specjalnej wirtualnej maszynie z JIT. W przeciwieństwie do innych narzędzi do opracowywania programów eBPF, Aya nie korzysta z libbpf ani kompilatora bcc, lecz oferuje własną implementację, napisaną w języku Rust, która wykorzystuje pakiet crate libc do bezpośredniego dostępu do wywołań systemowych jądra. Do zbudowania Ayi nie jest wymagane posiadanie narzędzi do języka C ani plików nagłówkowych jądra. Kod biblioteki jest rozpowszechniany na licencjach MIT i Apache 2.0.
Podstawowe funkcje:
- Wsparcie dla formatu BTF (BPF Type Format), który dostarcza informacji o typach w pseudokodzie BPF do sprawdzania typów i dopasowywania z typami dostarczanymi przez aktualne jądro. Zastosowanie BTF umożliwia tworzenie uniwersalnych eBPF-śledzących, które można używać bez ponownej kompilacji z różnymi wersjami jądra Linux.
- Wsparcie dla wywołań „bpf-to-bpf”, zmiennych globalnych i inicjalizatorów, co pozwala na formułowanie programów dla eBPF na wzór zwykłych programów, z aya jako runtime, nadpisującym funkcje z uwzględnieniem pracy w eBPF.
- Wsparcie dla różnych typów jądra, w tym standardowych tablic, map haszowych, stosów, kolejek, śledzenia stosu oraz struktur dla gniazd i śledzenia wydajności.
- Możliwość tworzenia różnych typów programów eBTF, w tym programów do filtrowania i zarządzania ruchem, śledzących cgroup oraz różnych operacji z gniazdami, programów XDP.
- Wsparcie dla platform do asynchronicznego przetwarzania zapytań w nieblokującym trybie tokio i async-std.
- Szybka kompilacja, bez związania z kompilacją jądra i plikami nagródkowymi jądra.
Projekt jest wciąż traktowany jako eksperymentalny — API nie zostało jeszcze ustabilizowane i nadal się rozwija. Nie wszystkie zamierzone możliwości zostały również zaimplementowane. Do końca roku deweloperzy planują doprowadzić funkcjonalność Ayi do parytetu z libbpf, a w styczniu 2022 roku stworzyć pierwszą stabilną wersję. Planuje się również połączenie części Ayi potrzebnych do pisania kodu w Rust dla jądra Linux z komponentami działającymi w przestrzeni użytkownika i używanymi do ładowania, podłączania i interakcji z programami eBPF.
Przypominamy, że eBPF to wbudowany w jądro Linux interpreter bajtkodu, który umożliwia tworzenie handlerów operacji sieciowych, monitorowanie pracy systemów, przechwytywanie wywołań systemowych, kontrolowanie dostępu, przetwarzanie zdarzeń z zachowaniem pomiaru czasu, liczenie częstotliwości i czasu wykonywania operacji oraz wykonywanie trasowania z użyciem kprobes/uprobes/tracepoints. Dzięki zastosowaniu kompilacji JIT, bajtkod jest na bieżąco tłumaczony na instrukcje maszynowe i wykonywany z wydajnością kodu natywnego. XDP dostarcza narzędzia do uruchamiania programów BPF na poziomie sterownika sieciowego, z możliwością bezpośredniego dostępu do DMA-buforów pakietów, co umożliwia tworzenie wysoko wydajnych handlerów do pracy w warunkach dużego obciążenia sieciowego.
Źródło: opennet.ru
