在 eBPF 技术迅猛发展的今天,借助 -bpf 开发框架,结合 OCI 标准和 ORAS,我们成功拓展了 LMP 的 eBPF 功能,这一举措显现出强大的应用前景。这一创新举措不仅攻克了多个跨平台运行中的难题,还为开发者带来了前所未有的便利。接下来,我们将对这一创新尝试的各个方面进行深入探讨。
$ lmp run sigsnoop
download with curl: https://linuxkerneltravel.github.io/lmp/sigsnoop/package.json
running and waiting for the eBPF events from perf event...
time pid tpid sig ret comm
00:21:41 109955 112863 28 0 gnome-terminal-
00:21:41 109955 112862 28 0 gnome-terminal-
...
-bpf 开发框架成功实现了 eBPF 的跨平台愿景,实现了“一编译,多运行”的理想。该框架巧妙地在 WASM 运行时与用户态之间增设了一个抽象层,使得 eBPF 代码能够根据 JSON 对象进行动态加载。在进行测试时,无论是在x86、ARM等多样化的架构还是不同的内核版本系统上,都可以运用相同的预编译二进制程序,一旦从云端下载下来,便可直接运行,这显著增强了程序的广泛适用性和操作简便性。
在编译阶段,JSON对象被整合进WASM模块中;运行时,通过解析该对象,我们可以获取到eBPF程序的相关信息,并实现其动态加载。这样的机制让eBPF程序能够更加灵活地执行,突破了传统运行方式的种种束缚,从而在不同的环境中都能稳定且高效地运作。
uname -r
cat /boot/config-$(uname -r) | grep CONFIG_DEBUG_INFO_BTF
$ uname -r
5.15.0-48-generic
$ cat /boot/config-$(uname -r) | grep CONFIG_DEBUG_INFO_BTF
CONFIG_DEBUG_INFO_BTF=y
CONFIG_DEBUG_INFO_BTF_MODULES=y
开发者可以通过执行 lmp init 命令来创建项目模板,进而初始化内核程序,这样就能迅速开始编写代码。随后,使用 lmp run .json 命令即可运行内核程序。在没有用户端程序处理数据的情况下,该框架下的内核程序会自动输出所有处理过的数据,为开发者提供了直观的测试和验证结果。
curl https://github.com/GorilaMond/lmp_cli/releases/download/lmp/install.sh | sh
以C语言编写的WASM开发框架为例,在构建完成的内核项目文件夹中,通过执行sudo lmp gen - wasm - skel命令,可以成功生成WASM的用户态项目模板。生成的-skel.h文件是打包成头文件的内核程序,而app.c文件则是用户态程序的模板,开发者可以对其进行修改以实现自定义的数据处理,这样的通用格式使得开发过程更加便捷和易于拓展。
lmp init hello
LMP 内置了多样的 eBPF 脚本,同时,它还支持对现有的 eBPF 工具进行重构和迁移。这样,它就能向开发者提供一套完整、无需额外配置即可使用的分析工具组件。在性能工程等众多领域,这些组件能够充分发挥 eBPF 程序的潜力,更好地满足不同场景下的开发需求。
$ lmp init hello
Cloning into 'ebpm-template'...
已在多种系统上顺利实现移植并运行,未来计划对低版本内核、RISC-V等平台,以及嵌入式和边缘计算领域的相关设备进行深入测试。即便不依赖-bpf的底层运行时,也能借助标准化接口,广泛运用LMP的eBPF程序生态,为各类应用场景提供更丰富的可能性。
$ cd hello/
$ ll
...
-rw-rw-r-- 1 a a 2910 10月 17 23:18 bootstrap.bpf.c
-rw-rw-r-- 1 a a 392 10月 17 23:18 bootstrap.bpf.h
-rw-rw-r-- 1 a a 221 10月 17 23:18 config.json
drwxrwxr-x 8 a a 4096 10月 17 23:18 .git/
drwxrwxr-x 3 a a 4096 10月 17 23:18 .github/
-rw-rw-r-- 1 a a 21 10月 17 23:18 .gitignore
-rw-rw-r-- 1 a a 2400 10月 17 23:18 README.md
$ sudo lmp build
make
...
BINARY client
DUMP_LLVM_MEMORY_LAYOUT
DUMP_EBPF_PROGRAM
FIX_TYPE_INFO_IN_EBPF
GENERATE_PACKAGE_JSON
在开发实践中,大家是否曾遭遇过需要使用类似框架来处理跨平台挑战的情况?欢迎各位在评论区留下您的经验之谈,同时,也请您为这篇文章点个赞并转发一下!
$ sudo lmp run ./package.json
running and waiting for the ebpf events from ring buffer...
time pid ppid exit_code duration_ns comm filename exit_event