Aller au contenu
Administration Linux medium

BCC et libbpf : construire ses propres outils eBPF

9 min de lecture

Deux bibliothèques dominent l'écriture d'outils eBPF : BCC, taillée pour prototyper vite, et libbpf, taillée pour distribuer un binaire portable. Choisir la bonne dès le départ évite de tout réécrire plus tard. Cette page montre BCC en action avec ses dizaines d'outils prêts à l'emploi, puis le workflow libbpf avec son squelette généré, et donne une règle de décision claire. Les sorties viennent d'une VM Ubuntu 24.04 (noyau 6.8, BCC 0.29.1). Pour le concept de portabilité sous-jacent, voir CO-RE et BTF.

  • Utiliser les outils eBPF packagés de BCC sans écrire une ligne
  • Situer BCC (prototypage) face à libbpf (production)
  • Comprendre le workflow libbpf : objet compilé, squelette, chargeur
  • Décider quelle bibliothèque adopter selon votre besoin
  • Éviter de recommencer à zéro en choisissant mal au départ
  • Une VM Linux avec la chaîne d'outils eBPF (voir premier programme).
  • Les paquets bpfcc-tools (outils BCC) et libbpf-dev (bibliothèque libbpf), plus bpftool.

BCC (BPF Compiler Collection) est une bibliothèque qui laisse écrire le programme eBPF en C, embarqué dans un script Python (ou C++) qui pilote sa compilation, son chargement et l'affichage. Son atout : l'immédiateté. On écrit, on lance, ça marche. C'est l'outil idéal pour apprendre et pour répondre vite à une question ponctuelle.

BCC brille aussi par sa collection d'outils prêts à l'emploi, installés avec bpfcc-tools : des dizaines de diagnostics couvrant processus, fichiers, disque, réseau. Pas besoin de coder, ils sont là. Exemple, execsnoop affiche chaque nouveau processus lancé, avec sa lignée et ses arguments :

Fenêtre de terminal
sudo execsnoop-bpfcc

Sortie réelle :

PCOMM PID PPID RET ARGS
uname 24635 24616 0 /usr/bin/uname -r
id 24636 24616 0 /usr/bin/id -u
sleep 24637 24616 0 /usr/bin/sleep 0.25
uname 24638 24616 0 /usr/bin/uname -r

Chaque colonne parle : le nom du programme (PCOMM), son PID, le PID de son parent (PPID), le code de retour (RET) et la commande complète (ARGS). Quelques outils du même paquet, à connaître :

OutilCe qu'il montre
execsnoop-bpfccChaque nouveau processus lancé
opensnoop-bpfccChaque fichier ouvert, par qui
biolatency-bpfccDistribution des latences disque (histogramme)
tcplife-bpfccDurée de vie et volume de chaque connexion TCP
runqlat-bpfccTemps d'attente des processus avant de tourner

libbpf est la bibliothèque C officielle du projet noyau. Avec elle, on écrit le programme eBPF en C, on le compile une seule fois en un objet, et un programme de chargement (en C, Rust, Go...) l'embarque. Combinée à CO-RE, elle produit un binaire portable qui tourne sur des noyaux différents sans recompilation, comme détaillé dans CO-RE et BTF.

Le confort de libbpf tient à un générateur : à partir de l'objet compilé, bpftool produit un squelette (skeleton), un en-tête C qui expose proprement les maps, les programmes et les accroches. On génère l'objet puis son squelette :

Fenêtre de terminal
clang -O2 -g -target bpf -c ok.bpf.c -o ok.bpf.o
sudo bpftool gen skeleton ok.bpf.o > ok.skel.h

Extrait réel du squelette généré :

/* THIS FILE IS AUTOGENERATED BY BPFTOOL! */
struct ok_bpf {
struct bpf_object_skeleton *skeleton;
struct bpf_object *obj;
struct {
struct bpf_map *compteur;
} maps;
struct {
struct bpf_program *deref_avec_test;
} progs;
struct {
struct bpf_link *deref_avec_test;
} links;

Le chargeur inclut ce fichier et manipule des champs nommés (obj->maps.compteur, obj->progs.deref_avec_test) au lieu de chaînes de caractères et de recherches manuelles. Le code de chargement devient court et sûr. C'est le modèle des outils eBPF modernes (Cilium, Tetragon, la suite bcc/libbpf-tools).

Trois outils permettent d'écrire de l'eBPF, du plus simple au plus complet. Le tableau suivant les départage d'un coup d'œil, en y ajoutant bpftrace, qui répond à une bonne partie des besoins sans écrire de programme.

CritèrebpftraceBCClibbpf + CO-RE
ObjectifQuestion ponctuelle, one-linerApprendre, prototyper un outilDistribuer un outil de production
Écrit-on du C ?Non (langage dédié)Oui (C dans Python)Oui (C + chargeur)
Compilationà chaque exécutionsur chaque cible, à chaque lancementune seule fois
Dépendances sur la ciblebpftraceclang + en-têtes noyauaucune (juste le BTF)
Portabilité entre noyauxrecompile localementrecompile localementbinaire portable (CO-RE)
Quand l'utiliserinvestigation rapideapprentissage, prototypedéploiement à grande échelle

La règle tient en une phrase : bpftrace pour une réponse immédiate, BCC pour explorer et apprendre, libbpf pour livrer. On passe naturellement de l'un à l'autre le long du cycle de vie d'un outil : une idée testée en bpftrace, prototypée en BCC, puis réécrite en libbpf le jour où il faut la déployer partout.

  • Charger reste privilégié. Quelle que soit la bibliothèque, il faut root ou CAP_BPF + CAP_PERFMON. Réservez ces outils aux administrateurs.
  • Ne pas embarquer clang en production pour BCC. Si un outil BCC doit tourner sur beaucoup de machines, c'est le signal qu'il faut passer à libbpf : on évite d'installer un compilateur sur chaque serveur.
  • Vérifier la présence du BTF pour CO-RE. libbpf + CO-RE exige /sys/kernel/btf/vmlinux sur la cible. Sur un noyau ancien qui en est dépourvu, prévoyez un BTF externe ou la recompilation.
  • Épingler ce qui doit survivre. Un outil libbpf peut épingler ses maps dans /sys/fs/bpf pour qu'elles persistent ; c'est un partage de données à protéger.
  • BCC écrit le programme en C dans un script Python, compile sur la cible, et livre des dizaines d'outils prêts à l'emploi (execsnoop, opensnoop...).
  • libbpf compile une seule fois et, avec CO-RE, produit un binaire portable sans dépendances sur les cibles.
  • Le squelette généré par bpftool rend le code de chargement libbpf court et sûr.
  • Règle : BCC pour explorer, libbpf pour livrer ; on passe souvent de l'un à l'autre.
  • Les libbpf-tools offrent des diagnostics tout faits, mais en version portable et légère.
  • Dans tous les cas, charger de l'eBPF reste une opération privilégiée.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn