eBPF (extended Berkeley Packet Filter) ist eine bahnbrechende Technologie, die es erlaubt, Programme direkt im Linux-Kernel auszuführen. Durch die Fähigkeit, Netzwerkpakete, Prozesse und Systemaufrufe effizient zu überwachen und zu analysieren, hat sich eBPF als unverzichtbares Werkzeug für Systemadministratoren, Entwickler und Sicherheitsexperten etabliert. Doch trotz seiner vielen Vorteile standen Entwickler bisher vor einer bedeutenden Hürde: Die mangelnde Portabilität von eBPF-Programmen über verschiedene Kernelversionen hinweg. Hier setzt CO-RE an – eine innovative Lösung, die das Schreiben portabler und stabiler eBPF-Programme revolutioniert.Die Herausforderung der eBPF-Portabilität liegt in den grundlegenden Unterschieden zwischen Kernelversionen.
Der Linux-Kernel verändert sich ständig: Strukturen werden angepasst, Felder geändert oder verschoben, und neue Funktionalitäten kommen hinzu. Dies führt dazu, dass ein eBPF-Programm, das auf einem Kernel kompiliert wurde, auf einem anderen mit einer leicht abweichenden Kernelversion schneller fehlerhaft werden oder gar nicht mehr funktionieren kann. Dieses Problem zeigte sich sehr deutlich bei der Arbeit mit Kernelstrukturen, deren Definitionen und Speicherlayout sich über die Versionen hinweg ändern.Früher mussten Entwickler entweder ihre eBPF-Programme für jede Kernelversion neu kompilieren oder komplexe bedingte Anpassungen coden, um die verschiedenen Kernel-APIs und Datenstrukturen abzubilden. Beides war aufwändig, fehleranfällig und nicht zielführend für nachhaltige Softwareentwicklung.
Auch der Einsatz von Tools wie BCC (BPF Compiler Collection) war mit erheblichen Systemvoraussetzungen verbunden, die nicht auf allen Zielsystemen realisierbar sind. Die Folge war eine eingeschränkte Flexibilität und Skalierbarkeit bei der Nutzung von eBPF.Die Lösung heißt CO-RE, kurz für Compile Once – Run Everywhere. Dieses Konzept ermöglicht es, eBPF-Programme nur einmal zu kompilieren und anschließend auf unterschiedlichsten Kernelversionen auszuführen, ohne erneute Anpassungen oder Neukompilierung. Die Grundlage hierfür bildet das Zusammenspiel von moderner Compilerunterstützung, dem innovativen BPF Type Format (BTF) und einem intelligenten Programmlader wie libbpf oder Cilium eBPF.
CO-RE bringt somit eine neue Dimension der Portabilität und Zukunftssicherheit in die Entwicklung von eBPF-Anwendungen.Das Herzstück von CO-RE ist das BPF Type Format, kurz BTF. BTF ist eine kompakte und effiziente Metadatenbeschreibung, die Informationen über die im Kernel verwendeten Datenstrukturen, wie zum Beispiel deren Layout, Typen und Offset-Informationen, bereitstellt. Im Gegensatz zu herkömmlichen Debug-Symbolen ist BTF speziell auf die Anforderungen von eBPF zugeschnitten und verwendet ein Speicherformat, das schnell im Kernel zur Laufzeit interpretiert werden kann. So wird gewährleistet, dass eBPF-Programme dynamisch auf Änderungen in Datenstrukturen reagieren und sich an verschiedene Kernelversionen anpassen können.
Allerdings setzt CO-RE voraus, dass das Zielsystem die BTF-Unterstützung im Kernel aktiviert hat. Dies geschieht über die Kernel-Option CONFIG_DEBUG_INFO_BTF. Die meisten modernen Linux-Distributionen liefern Kernel mit diesem Feature bereits aus. Sollte die BTF-Information nicht im Kernel verfügbar sein, ist es möglich, die passenden BTF-Dateien extern bereitzustellen, etwa über Projekte wie BTFhub, die eine Sammlung von BTF-Dump-Dateien für unterschiedliche Kernelversionen und Distributionen bereitstellen. Auf diese Weise bleibt die Portabilität erhalten und das eBPF-Programm läuft problemlos auch auf Systemen mit älteren oder unvollständigen BTF-Unterstützungen.
Ein weiterer Vorteil von CO-RE ist die Möglichkeit, durch minimale Einstellungen die oft umfangreichen und schwer wartbaren Kernelheader in der eBPF-Softwareentwicklung zu ersetzen. Statt dutzende Header-Dateien importieren zu müssen, genügt eine einzige generierte Header-Datei namens vmlinux.h, die durch das bpftool direkt aus der BTF-Information extrahiert wird. Dieses Vorgehen reduziert Abhängigkeiten und vereinfacht die Verwaltung der Entwicklungsumgebung erheblich.Praktische Beispiele zeigen eindrucksvoll, wie CO-RE in der Praxis funktioniert.
Ein einfaches eBPF-Programm wie „flat“, das den Paketspeicher über den stabilen __sk_buff-Datentyp anspricht, funktioniert schon ohne Anpassungen auf unterschiedlichsten Kernelversionen. Für komplexere Programme wie tcprtt_sockops, das auf komplexere Kernelstrukturen und neuere Map-Typen wie Ringbuffern zugreift, benötigt man hingegen den Einsatz von BTF und die Einbettung passender BTF-Dateien. Dabei kommen Techniken wie das Einbetten der BTF-Dateien direkt in den Nutzerraum-Code via Go’s Embed-Mechanismus zum Einsatz, um die Verwaltung von Kernelunterschieden intelligent zu automatisieren und die Programmgröße mithilfe von Tools wie BTFGen drastisch zu reduzieren.Auch neue eBPF-Programmtypen wie fentry (BPF-Trampoline) profitieren von CO-RE, indem sie direkt auf Kernelstrukturen zugreifen können, ohne teure und komplizierte Hilfsfunktionen nutzen zu müssen. Das Attribut __attribute__((preserve_access_index)) markiert dabei gezielt bestimmte Kernelstrukturen für eine CO-RE-kompatible Behandlung, was für Entwickler die Arbeit erheblich erleichtert und zugleich die Effizienz erhöht.
Die Umstellung von älteren eBPF-Methoden, insbesondere BCC, hin zu libbpf und CO-RE-gesteuerten Programmen ist ein klares Zeichen für die Weiterentwicklung der Linux-Ökosystems und der eBPF-Technologie. Hierbei profitieren vor allem Entwickler von deutlich besseren Werkzeugen, schlankeren Abhängigkeiten und einer besseren Zukunftssicherheit ihrer Anwendungen.Nichtsdestotrotz ist das Thema CO-RE umfassend und komplex. Die verfügbaren Hilfsmittel wie Makros BPF_CORE_READ und die CO-RE-Helper-Funktionen unterstützen bei der Schreibarbeit, erfordern aber ein gewisses Verständnis der zugrundeliegenden Konzepte und des Zusammenspiels von Compiler, Kernel und Programmlader. Weitere Vertiefungen sind lohnenswert, insbesondere die dokumentierten Best Practices und fortgeschrittene Beispiele in großen Open-Source-Projekten wie Cilium, Tracee oder Inspektor Gadget, die CO-RE bereits umfassend einsetzen.