setrlimit()
の必要性
eBPFのカーネル上のリソースは,setrlimit()
でLocked Memoryのサイズを増やすことが定番でした。
しかしながらKernel 5.setrlimit()
の呼び出しは不要setrlimit()
の呼び出しは行っていません。実行環境ごとの必要に応じて追加してください。もちろん,setrlimit()
を呼び出しておくことは可能です。
VM版のLXDでBPF CO-REバイナリを動かすには
VM版のLXDで使われているlinux-kvmは,
root@impishvm:~# ./execsnoop libbpf: elf: skipping unrecognized data section(3) .rodata.str1.1 libbpf: failed to determine tracepoint 'syscalls/sys_enter_execve' perf event ID: No such file or directory libbpf: prog 'syscalls__execve': failed to create tracepoint 'syscalls/sys_enter_execve' perf event: No such file or directory libbpf: failed to auto-attach program 'syscalls__execve': -2 failed to attach BPF object
linux-kvmフレーバー向けに,
$ sudo apt install -y linux-generic $ sudo apt remove -y --purge '~nlinux-.*kvm ~i' $ sudo reboot
2行目でKVMフレーバーを削除しているのは,Ubuntu, with Linux 5.
」
なお,
ちなみに今のところ問題になりそうなのは,
BCCのlibbpf-toolsをビルドするには
BCCにはlibbpf版のツールが用意されています。実際にBPFプログラムを作る際にとても参考になるため,
まずは必要なパッケージをインストールし,
$ sudo apt install build-essential libbpf-dev clang llvm linux-tools-common git make $ git clone https://github.com/iovisor/bcc.git $ cd bcc/libbpf-tools
ここでmakeしたいところではあるのですが,git clone
時に--recursive
」git clone
したあとにgit submodule init
」git submodule update
」
$ git diff diff --git a/libbpf-tools/Makefile b/libbpf-tools/Makefile index 5f7a9295..621a514b 100644 --- a/libbpf-tools/Makefile +++ b/libbpf-tools/Makefile @@ -4,7 +4,8 @@ CLANG ?= clang LLVM_STRIP ?= llvm-strip BPFTOOL ?= bin/bpftool LIBBPF_SRC := $(abspath ../src/cc/libbpf/src) -LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) +#LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) +LIBBPF_OBJ := /usr/lib/$(shell clang -print-multiarch)/libbpf.a INCLUDES := -I$(OUTPUT) -I../src/cc/libbpf/include/uapi CFLAGS := -g -O2 -Wall INSTALL ?= install
あとは作りたいツールを単にmake
するだけです。
$ make execsnoop MKDIR .output BPF execsnoop.bpf.o GEN-SKEL execsnoop.skel.h CC execsnoop.o CC trace_helpers.o CC syscall_helpers.o CC errno_helpers.o CC map_helpers.o CC uprobe_helpers.o BINARY execsnoop $ file execsnoop execsnoop: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), (略) $ ls -sh execsnoop 452K execsnoop $ ldd execsnoop linux-vdso.so.1 (0x00007fffab3dd000) libelf.so.1 => /lib/x86_64-linux-gnu/libelf.so.1 (0x00007f4d5e379000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f4d5e35d000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4d5e135000) /lib64/ld-linux-x86-64.so.2 (0x00007f4d5e3fc000)
サイズがとても小さいにも関わらず,
$ sudo ./execsnoop PCOMM PID PPID RET ARGS sh 1683163 3517 0 /bin/sh -c byobu-status tmux_left byobu-status 1683165 1683163 0 /usr/bin/byobu-status tmux_left sh 1683164 3517 0 /bin/sh -c byobu-status tmux_right byobu-status 1683166 1683164 0 /usr/bin/byobu-status tmux_right
ちなみにUbuntuのカーネルや各種パッケージのバージョンと,