Programmiersprache Rust: eBPF-Bibliothek Aya kommt ohne C-Toolchain aus
Mit Aya ist eine reine Rust-Implementierung erschienen, die die Rust-Library libc direkt zum AusfĂĽhren von Syscalls verwendet.
(Bild: Carlos Amarillo/Shutterstock.com)
Für die Programmiersprache Rust liegt eine neue eBPF Library (extended Berkeley Packet Filter) vor. Nach einem halben Jahr Entwicklungszeit hat Softwareentwickler Alessandro Decina sie mit einigen neuen Features veröffentlicht. Aya verspricht Entwicklerinnen und Entwicklern vor allem einfache Handhabung und Bedienung: eine C-Toolchain oder auch Kernel-Header sind nicht erforderlich. Das Kompilieren der Crate im Release-Modus soll nur wenige Sekunden dauern.
Mit der Technologie eBPF erhalten Entwickler die Möglichkeit, Programme im Kernel in einer abgesicherten Sandbox auszuführen, sodass der Quellcode des Kernel und die Kernel-Module von den Erweiterungen unangetastet bleiben. Dabei funktioniert eBPF bei Linux ähnlich wie eine virtuelle Maschine unter Java. Die noch relativ neue Technik zur Datenverarbeitung kommt beispielsweise beim Monitoring von Speicherauslastung, CPU und Traffic zum Einsatz. Die Systemüberwachung lässt sich dabei ohne zwischengeschaltete Agenten steuern.
Eine reine Rust-Implementierung
Aya ist nicht die erste eBPF-Bibliothek auf dem Markt, jedoch unterscheidet sie sich von den anderen vor allem darin, dass sie weder eine libbpf-Bibliothek, noch die bcc-Toolchain verwendet. Erst im Mai hatte Microsoft ein Open-Source-Projekt begonnen, um eBPF auch auf Windows 10 und ab Windows Server 16 zum Laufen zu bringen.
Bei Aya handelt es sich um eine reine Rust-Implementierung, die das Crate libc direkt zum Ausführen von Syscalls verwendet. Die aktuelle Version bringt bereits einige Features mit, darunter Unterstützung für das BPF Type Format (BTF). BTF ist aktiv, sobald es vom Zielkernel unterstützt wird. Dadurch können eBPF-Programme, die gegen eine Kernel-Version kompiliert wurden, auf anderen Kernel-Versionen laufen, ohne sie neu kompilieren zu müssen. Layout-Unterschiede in den Kernel-Typen werden zur Laufzeit auf der Basis von BTF-Debug-Informationen abgeglichen.
Videos by heise
Darüber hinaus bringt Aya bereits Unterstützung für bpf-to-bpf-Funktionsaufrufe und globale Variablen sowie Initialisierer mit. eBPF-Programme lassen sich wie jede andere Anwendung strukturieren. Zur Laufzeit verschiebt die Rust-Library Funktionen entsprechend des vom Kernel erwarteten Formats und lädt globale Abschnitte transparent in eBPF-Maps. Neben Arrays, Hash-Maps, Perf-Arrays, Sock-Maps und Sock-Hash-Maps weiß Aya mit diversen Map-Types wie Stacks, Queues und Stack-Traces umzugehen.
Entwicklerinnen und Entwickler finden Support für diverse Programmtypen, darunter Programme zur Implementierung von Netzwerkfilterung auf TC-, cgroup- und individueller Socket-Ebene, kprobes und uprobes, tracepoints, sockops, sendmsg() und XDP-Programme. Nähere Informationen zu Aya finden sich auf GitHub sowie in der API-Dokumentation.
(mdo)