eBPF : un aperçu des rouages du noyau Linux sans avoir à le modifier
Photo : eBPF

eBPF : un aperçu des rouages du noyau Linux sans avoir à le modifier

Charger un petit programme qui s'exécute directement dans le noyau, en toute sécurité et sans redémarrage. C'est le changement le plus important qu'ait connu Linux au cours de la dernière décennie.

Auparavant, pour savoir quel processus ouvrait tel fichier, où un paquet était perdu ou quelle fonction du noyau fonctionnait lentement, il fallait modifier le noyau puis redémarrer le système. eBPF rend tout cela obsolète.

L'idée centrale

eBPF permet de charger des programmes très légers dans le noyau et de les associer à des points de hook : appels système, événements réseau, fonctions internes du noyau. Le programme s'exécute dans une machine virtuelle contrôlée, et un vérificateur effectue des contrôles avant le chargement : pas de boucles infinies, pas d'accès arbitraire à la mémoire, et un nombre d'instructions limité.

Grâce à ce contrôle, un programme eBPF défectueux sera rejeté sans provoquer de plantage du système — contrairement aux modules du noyau traditionnels.

Les trois domaines les plus utilisés

  • Surveillance : mesure du temps de latence de chaque appel système, création de graphiques en flamme, suivi des processus enfants — sans avoir à modifier l'application
  • Réseau : filtrage et routage des paquets directement au niveau du pilote, ce qui est bien plus rapide que de passer par toute la pile réseau
  • Sécurité : blocage des appels système selon des règles prédéfinies, journalisation des comportements suspects au niveau du noyau

Essayez-le tout de suite sur votre ordinateur

sudo apt install bpfcc-tools
sudo execsnoop-bpfcc      # mọi tiến trình mới sinh ra
sudo opensnoop-bpfcc      # mọi tệp được mở
sudo biolatency-bpfcc     # phân bố độ trễ ổ đĩa

Limites à connaître

Le vérificateur est assez exigeant : les programmes complexes sont souvent rejetés avec des messages difficiles à comprendre. Les points d'accrochage aux fonctions internes du noyau ne sont pas non plus stables d'une version à l'autre — si le noyau renomme une fonction, votre programme cesse de fonctionner. Pour le code destiné à s'exécuter sur le long terme, il est préférable de s'appuyer sur des points d'accrochage stables plutôt que sur des fonctions internes.

Chia sẻ

Thảo luận