基于 libbpf 的 ebpf 实操入门
内容提要
eBPF是用于实现内核不支持的功能的工具,有多种开发工具如BCC、libbpf-bootstrap和Cilium。CO-RE是解决内核兼容性问题的方法,BTF是描述数据结构和函数签名的格式,libbpf是支持CO-RE的库。
延伸解读
eBPF 与内核模块的安全差异
文章指出,内核模块虽然能扩展内核功能,但一旦模块代码崩溃,整个系统会随之崩溃,且模块可能拥有访问所有系统功能的权限,存在信任与恶意操作风险。eBPF 则通常只允许读取系统信息,少数情况下修改网络包,这种限制提升了安全性。因此,在需要扩展内核时,eBPF 是比内核模块更可控的选择。
CO-RE 如何实现一次编译到处运行
CO-RE 通过 BTF 记录编译时的数据结构布局,并在加载时由 libbpf 根据目标内核的 BTF 信息调整字段访问。如果字段发生移动,宏如 BPF_CORE_READ 会自动找到新位置;若字段不存在,则需用 bpf_core_field_exists 等辅助函数处理。这要求目标内核支持 BTF,且程序不访问不存在的字段。
vmlinux.h 的作用与跨内核风险
vmlinux.h 由 bpftool 从当前运行内核的 BTF 生成,包含内核所有类型定义,使 BPF 程序能按字段读取内存。但若将基于此头文件编译的程序直接运行在不同内核版本上,可能因数据结构变化而崩溃。因此,vmlinux.h 需配合 CO-RE 机制使用,才能实现跨内核兼容。
环境搭建与常见错误提示
文章给出了 Ubuntu 和 CentOS 的依赖安装步骤,并列举了编译运行中的典型错误,如缺少 BTF 支持、头文件路径错误、LLVM 重复注册等。这些错误多与内核配置、编译选项或库路径有关。读者在实操时应确保内核开启 CONFIG_DEBUG_INFO_BTF,并正确设置 include 路径和链接库。
Q&A
eBPF是什么,它的主要用途是什么?
eBPF是扩展伯克利包过滤,用于实现内核不支持的功能,主要用于读取和修改系统信息。
如何设置Ubuntu和CentOS的eBPF环境?
在Ubuntu中使用apt安装相关工具,在CentOS中使用dnf安装开发工具和依赖。
什么是CO-RE,它解决了什么问题?
CO-RE是解决内核兼容性问题的方法,通过编码类型信息使eBPF程序在不同内核上可移植。
BTF在eBPF中有什么作用?
BTF用于描述数据结构和函数签名,帮助提高eBPF程序的兼容性和可移植性。
libbpf的主要功能是什么?
libbpf提供加载eBPF程序的功能,并支持CO-RE以提高程序的可移植性。
使用bpftool生成C语言头文件的命令是什么?
使用命令bpftool gen skeleton可以根据BPF二进制文件生成C语言头文件。