第688回と第690回では,
今回は一般的なコンパイラのようにバイナリを生成でき,
BPF CO-REの登場
BPF CO-RE
- BPFを利用したバイナリを実行環境とは異なる環境でビルドできる
- カーネルバージョン間の違いもある程度は吸収してくれる
- 実行バイナリのサイズはそれなりに小さくなる
- コンテナ内部などターゲットと異なるカーネルが動いている環境でもビルドできる
つまりステージング環境や開発環境でビルド&テストしたバイナリを,
実はBCCでは,
ただしBPF CO-REを使用するためには,
Ubuntuの場合,
- ※1
- 古いカーネルでもBTFを追加ロードすることでBPF CO-REなオブジェクトをロードできるようにする
「BPF Hub」 というプロジェクトもあるようです。
たとえばUbuntu 21.
$ grep -E "(BPF|BTF)[_= ]" /boot/config-$(uname -r) CONFIG_BPF=y CONFIG_HAVE_EBPF_JIT=y CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y # BPF subsystem CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y CONFIG_BPF_JIT_ALWAYS_ON=y CONFIG_BPF_JIT_DEFAULT_ON=y CONFIG_BPF_UNPRIV_DEFAULT_OFF=y # CONFIG_BPF_PRELOAD is not set CONFIG_BPF_LSM=y # end of BPF subsystem CONFIG_CGROUP_BPF=y CONFIG_IPV6_SEG6_BPF=y CONFIG_NETFILTER_XT_MATCH_BPF=m CONFIG_NET_CLS_BPF=m CONFIG_NET_ACT_BPF=m CONFIG_BPF_STREAM_PARSER=y CONFIG_LWTUNNEL_BPF=y CONFIG_VIDEO_SONY_BTF_MPX=m CONFIG_DEBUG_INFO_BTF=y CONFIG_PAHOLE_HAS_SPLIT_BTF=y CONFIG_DEBUG_INFO_BTF_MODULES=y CONFIG_BPF_EVENTS=y CONFIG_BPF_KPROBE_OVERRIDE=y CONFIG_TEST_BPF=m
ちなみにUbuntu 21.
今回はUbuntu 21.
BPF CO-REのコンパイル環境の準備
今回も第690回と同じように,execve()
をトレースするコードを題材として使いましょう。ちなみに第692回ではsysfs以下を使ってツールレスに同等の機能を実現したり,
BPF CO-REのバイナリをコンパイルするには,
bpftool
コマンドでターゲットとなるカーネルバージョンのvmlinux.
を入手するh - ターゲットのカーネルにロードされるBPFプログラムをClangでコンパイルしてBPFオブジェクトファイルを生成する
- そのBPFオブジェクトファイルから,
bpftool
コマンドを用いてユーザーランドのプログラムで使うためのスケルトンヘッダーファイルを生成する - スケルトンヘッダーファイルを使って,
ユーザーランドのプログラムをコンパイルする
簡単に言うと,
まずはビルドに必要なツール一式をインストールしておきましょう。
$ sudo apt install build-essential libbpf-dev clang llvm linux-tools-generic
前半はコンパイルに必要なツール群です。最後のlinux-tools-genericパッケージはビルドに使うbpftool
コマンドと,bpftool
コマンドは,bpftool
のカーネルバージョンに依存しないサブコマンドだけを使うなら,
今回は最低限のコードのみを紹介します。必要なのは