1、基于libbpf库的eBPF编程方案第二届 eBPF开发者大会w w w.e b p f t r a v e l.c o m中 国 西 安主讲人:闻茂泉2024-04-13目录Content01eBPF编程方案简介02基于libbpf的编程方案03改进的libbpf编程方案04低版本内核编程方案05低版本编译环境编程方案第二届 eBPF开发者大会w w w.e b p f t r a v e l.c o m01eBPF编程方案简介第二届 eBPF开发者大会w w w.e b p f t r a v e l.c o m中 国 西 安主流的C语言实现的eBPF编程方案代际方案指称识别方法备注第1代
2、bpf_load.c文件方案代码中有bpf_load.c文件,还有load_bpf_file函数。Linux 4.x 系列早期内核版本的源码实例大多基于此文件,这个旧 API 方案已经在内核中被逐步废弃。第2代原生libbpf库方案代码中有libbpf.c文件Linux 5.x版本内核的源码实例很多使用以libbpf.c为核心的原生libbpf库方案,是本文重点阐述的方案。第3代libbpf-bootstrap骨架方案代码中除了libbpf.c文件,还有libbpf-bootstrap、skeleton和*.skel.h关键词最新版本内核的源码实例已经开始采用此方案。业界最新的eBPF介绍文章
3、较多基于此方案。1.更深的控制和灵活性:直接使用原生libbpf 库的方案意味着可以与更底层交互,实现更多的控制,定制加载和管理 eBPF 程序和 maps 过程,满足更复杂的需求。2.更好的学习和理解:libbpf-bootstrap封装抽象屏蔽了很多细节,直接使用原生libbpf可以对 eBPF 子系统有更深入的理解,有利于开发者对 eBPF 内部工作原理的理解。3.更细粒度的依赖管理:直接使用原生libbpf库能够指定依赖的 libbpf 库版本和功能,进而更精细化地管理项目依赖关系。4.更好的低版本内核适应性:基于原生libbpf库的方案,在低版本操作系统发行版和低版本内核上可以有更好
4、的兼容性。原生libbpf库eBPF编程方案的一些独特优势:最大硬伤:写死C语言eBPF编程的基础环境准备rpm包基础环境初始化deb包基础环境初始化推荐发行版Anolis 8.8、CentOS 8.5、Kylin V10、Fedora 33及以上Debian 12、Ubuntu 21.04及以上编译工具和依赖库包yum install clang llvm elfutils-libelf-develapt-get updateapt install clang llvm libelf-dev基础包yum install git makeapt install git make用户态头文件yu
5、m install kernel-headers-$(uname-r)apt install linux-libc-devbpftool工具yum install bpftool-$(uname-r)apt install linux-tools-common linux-tools-$(uname-r)主流的linux发行版大多是基于rpm包或deb包的包管理系统。不同的包管理系统,初始化eBPF开发环境时所依赖的包,也略有差别。C语言eBPF编程方案的程序架构execve.cexecve.bpf.c (execve_kern.c)execve.cexecve.bpf.cexecve.bpf
6、.oexecve.skel.hexecveexecve.bpf.o (execve_kern.o)execveexecve.bpf.o (execve_kern.o)./execve./execve第1代,第2代编程方案第3代编程方案编译过程执行过程实时读取02基于libbpf的编程方案第二届 eBPF开发者大会w w w.e b p f t r a v e l.c o m中 国 西 安Talk is cheap.Show me the code.trace_execve_libbpf130是一个基于libbpf库的第2代eBPF构建实例。eBPF初学者,可以考虑选择跟踪 execve 系统调