第694回ではポータブルなBPFバイナリを作成できる,
BPF CO-REの基本と事前準備
BPF CO-RE
また,
BPFオブジェクト自体はClangを使ってビルドし,
第694回で作成したプログラムは,
BPF CO-REは比較的最近の仕組みであることから,
$ sudo apt install build-essential libbpf-dev clang llvm linux-tools-generic
また第694回で作成した次のファイルを準備しておきます。
Makefile
:BPFバイナリとユーザーランドツールを作成するファイルexecsnoop.
:BPFオブジェクトを作るためのC言語のコードbpf. c execsnoop.
:BPFオブジェクトをロードするユーザーランドのコードc
次の方法でgit cloneできるようにしておきました。
$ git clone https://gitlab.com/mtyshibata/bpf-core-sample.git $ cd bpf-core-smaple $ git checkout r694 v1.0
ちなみにmainブランチの最新の状態は,v1.
タグを付けています。
このリポジトリは,make
コマンドだけでプログラムをビルドできるようになっています。
$ make bpftool btf dump file /sys/kernel/btf/vmlinux format c > vmlinux.h clang -g -O2 -Wall -target bpf -D__TARGET_ARCH_x86 -c execsnoop.bpf.c -o execsnoop.bpf.o llvm-strip -g execsnoop.bpf.o bpftool gen skeleton execsnoop.bpf.o > execsnoop.skel.h libbpf: elf: skipping unrecognized data section(3) .rodata.str1.1 cc -g -O2 -Wall -c execsnoop.c -o execsnoop.o cc -g -O2 -Wall execsnoop.o -lbpf -o execsnoop
実行には管理者権限が必要です。
$ sudo ./execsnoop
何がしかのプログラムがexecve
されると,
$ sudo cat /sys/kernel/debug/tracing/trace_pipe byobu-status-3782063 [002] d... 242751.308364: bpf_trace_printk: Hi, execve! byobu-status-3782064 [003] d... 242751.315108: bpf_trace_printk: Hi, execve! byobu-status-3782065 [003] d... 242751.334648: bpf_trace_printk: Hi, execve!
最低限の仕組みはできたので,
ちなみに残念ながらlibbpfにはまだまともなAPIドキュメントがありません。このため何かやりたい場合は,