zl程序教程

您现在的位置是:首页 >  其他

当前栏目

ebpf内核态开发环境搭建

2023-02-26 09:47:47 时间

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代码的头部引用:

#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库

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:

hello
bash: hello: command not found

在开启监听的窗口可以收到:

./uretprobe
2023/01/31 19:30:15 Listening for events..
2023/01/31 19:30:34 /bin/bash:readline return value: hello