项目介绍
对比 Web 的发展,eBPF 与内核的关系有点类似于 JavaScript 与浏览器内核的关系。
eunomia-bpf 是一套编译工具链和运行时,以及一些附加项目,我们希望做到让 eBPF 程序真正像 JavaScript 或者 WASM 那样易于分发和运行,或者说内核态或可观测性层面的 FaaS:eBPF 即服务
- 仅需一个数十kb的请求,包含预编译 eBPF 程序字节码和辅助信息,即可实现多种完全不同功能的 eBPF 程序的热插拔、热更新;加载时间通常为数十毫秒且内存占用少;(例如使用 libbpf-bootstrap/bootstrap.bpf.c ,热加载时间约为 50ms,运行时内存占用约为 5 MB,同时新增更多的 eBPF 程序通常只会增加数百 kB 的内存占用)
- 相比于传统的基于 BCC 或远程编译的分发方式,分发时间和内存占用均减少了一到二个数量级;
- 运行时只需数 MB 且无 llvm、clang 依赖,即可实现一次编译、到处运行;将 eBPF 程序的编译和运行完全解耦,本地预编译好的 eBPF 程序可以直接发送到不同内核版本的远端执行;
- 大多数情况下只需要编写内核态应用程序,不需要编写任何用户态辅助框架代码;
- 支持动态分发和加载 tracepoints, fentry, kprobe, lsm 等类型的大多数 eBPF 程序,也支持 ring buffer、perf event 等方式向用户态空间传递信息;
我们采用了编译和启动运行 eBPF 程序完全分离的思路:eBPF 程序只需在开发环境编译一遍生成字节码,同时我们的编译工具链会通过源代码分析等手段从内核态的 eBPF 程序中提取少量用于在运行时进行动态加载、动态修改程序的元信息,在真正部署运行时用户态无需任何的本地或远程编译过程即可实现正确加载,和动态调整 eBPF 程序参数。
eunomia-bpf 也是一个结合 Wasm 的通用、轻量级、多语言的下一代 eBPF 开发框架/组件库,2022 年下半年在龙蜥社区 eBPF 技术探索 SIG
发起并孵化。eunomia-bpf 主要关注于改进 eBPF 程序用户态的开发和使用体验,主要有三个特性:
- 只需编写内核态代码即可运行 eBPF 程序,内核态前端完全兼容 bcc、原生 libbpf 等多种语法,可以降低 eBPF 开发的学习成本,提高开发效率;
- 编译工具链和运行时完全分离,保证不同版本编译工具链和运行时之间的兼容性,以 CO-RE(一次编译、到处运行)的方式加载,降低部署和使用的资源消耗;还可以让 BCC/bpftrace 类型的代码也支持 AOT 编译,在加载的的时候不依赖 llvm 等库,同时保留 bpftrace 类似脚本一样的简单使用方式;
- 用户态也支持多种语言,例如 C++/C/Rust 等,可以使用多种语言在 Wasm 中开发 eBPF 的用户态程序,并且以 Wasm 模块,或者 JSON/YAML 配置文件的方式分发和动态加载 eBPF 程序,同时以 Wasm OCI 镜像的形式存储和管理任意包含用户态和内核态的 eBPF 应用。
eunomia-bpf 希望成为一个以类库或者松散组合的框架的方式提供,让其他公司和个人,想要基于自己的内核态 ebpf 基础设施,搭建一个类似的用户态开发运行环境,或者完整的开发平台、插件运行时,变得更容易很多。希望在编译方面做更多的探索。
项目地址
- https://gitee.com/anolis/eunomia
- https://github.com/eunomia-bpf/eunomia-bpf