5章CO-RE、BTF、libbpf
本書では、前章で紹介したBTF(BPF Type Format)が存在する理由、および、異なるバージョンのカーネル間でeBPFプログラムを移植可能にするためにBTFがどのように使われるかについて説明します。一度コンパイルすれば、どこでも実行可能(compile once, run everywhere、CO-RE)というBPFのアプローチにとって、これはとても重要な部分です。
多くのeBPFプログラムはカーネルのデータ構造にアクセスします。ソースから関連するLinuxヘッダファイルをinclude
する必要があります。Linuxカーネルのバージョンが異なればデータ構造が変化する可能性があるので、あるマシンでコンパイルされたeBPFプログラムを別のマシンで実行した場合、プログラムがアクセスするデータ構造がその2つのマシンのカーネルにおいて同じだという保証はありません†1。
[†1] データ構造の定義は実行中のカーネルではなくカーネルソースのヘッダファイルに書かれている。このため、eBPFプログラムを実行するマシンで使われているカーネルのヘッダファイルとバージョンを合わせてコンパイルすると、CO-REの仕組みがなくてもプログラムを問題なく実行できる。
CO-REアプローチによって、この移植性の問題を効率的に解決できます。CO-REによって、コンパイルされたデータ構造のレイアウト情報をeBPFプログラムに含めることが可能になります。そして、そのデータ構造のレイアウトが、コンパイルしたマシンと実行しようとしている対象のマシンとで異なる場合に、フィールドのアクセス方法を調整するメカニズムを提供します。これによりプログラムは異なるカーネルバージョン間で移植可能になります。ただし、プログラムが実行しようとしているターゲットのカーネルに存在しないデータ構造やフィールドにアクセスしようとした場合は除きます。 ...
Get 入門 eBPF ―Linuxカーネルの可視化と機能拡張 now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.