1 操作系统和内核
操作系统:可选用ubuntu或者centos
内核版本:4.18
- 内核开启BTF调试(非必需) 检查内核是否开启BTF调试:
cat /boot/config -`uname -r` | grep BTF
如果回显中显示CONFIG_INFO_BTF=y
表示开启。如果未开启需要重新编译内核开启。
- 生成vmlinux.h文件
bpftool btf dump file /sys/kernel/btf/vmlinux format c > vmlinux.h
生成这个头文件是linux内核头文件的大集合,结合以下头文件作为ebpf c代码的头部引用:
代码语言:c复制#include "vmlinux.h"
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_endian.h>
#include <bpf/bpf_core_read.h>
#include <bpf/bpf_tracing.h>
2 安装libbpf库
代码语言:shell复制yum -y install libbpf-devel
部分操作系统版本的软件源可能没有,需要自行找RPM包安装。
3 安装llvm
- 依赖 llvm版本:11.0.0 gcc版本:>=5.1 g 版本:>=5.1 GNU make:>=3.79 cmake版本:>=3.4.3
- 解压
xz -d llvm-project-11.0.0.tar.xz
tar -xvf llvm-project-11.0.0.tar
- 编译安装
cd llvm-project-11.0.0
mkdir build
cd build
cmake -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_RTTI=ON -DLLVM_ENABLE_PROJECTS="clang;libcxx;libcxxabi" -G "Unix Makefiles" ../llvm
make
# 需要等待约4小时
make install
# 需要等待约半小时
- 确认是否RTTI特性 在编译bpftrace工程的时候如果没有打开LLVM的RTTI,会导致编译失败。
llvm-config --has-rtti
YES
3.1 也可以使用docker容器作为开发环境
需要宿主机内核版本满足要求。
4 验证环境
选用cilium/ebpf项目(tag:v0.8.0)中的样例:uretprobe。(这里需要加上golang的构建能力)
- 编译 进入到ebpf/examples/uretprobe下,执行:
BPF_CLANG=clang BPF_CFLAGS="-O2 -Wall" go generate main.go
go build .
- 挂载到内核
./uretprobe
2023/01/31 19:30:15 Listening for events..
开启一个新窗口输入hello:
代码语言:shell复制hello
bash: hello: command not found
在开启监听的窗口可以收到:
代码语言:txt复制./uretprobe
2023/01/31 19:30:15 Listening for events..
2023/01/31 19:30:34 /bin/bash:readline return value: hello