1、eunomia-bpf:让 eBPF 的编译和分发尽可能简单2022.11郑昱笙eBPF 轻量级开发框架https:/ 背景背景 2 项目目标项目目标3 使用案例使用案例4 架构架构5 未来的发展方向未来的发展方向目录项目背景项目背景01014eBPF:一个革命性的技术:一个革命性的技术eBPF 与内核的关系有点类似于 JavaScript 或者 WASM 与浏览器内核的关系。eBPF 提供了一种新的内核可编程的选项eBPF 程序架构强调安全性和稳定性,不需要重新编译内核,使用更加便捷多种应用方式和多种 eBPF 程序类型5一般来说,一个完整的 eBPF 应用程序分为用户空间程序和内核程序两部
2、分:用户空间程序:加载、控制 eBPF 程序、数据处理;内核中的 eBPF 程序:事件驱动、接受用户态的控制、上传信息eBPF 程序的基础设施:除了内核的加载器和运行时之外,通常还需要用户态的辅助加载框架和通信框架如 BCC、libbpf 等,以及对应的编译工具链 Clang/LLVM、辅助工具 bpftool 等01项目背景6常见的 eBPF 开发和部署使用方式:BCC、bpftrace 为代表的脚本方式编写和分发01项目背景编写内核态代码编写用户态的加载处理代码运行时动态编译运行以源代码方式分发部署依赖 Clang/LLVM 等库,每次运行都要执行 Clang/LLVM重新编译,编译环境配
3、置复杂需要编写复杂的用户态加载框架,对每个 eBPF 函数分别进行加载,源代码形态的 eBPF 程序难以标准化分发;更为灵活7常见的 eBPF 开发和部署使用方式:libbpf、libbpf-go/rs、cilium/ebpf 等 CO-RE(一次编译、到处运行)框架01项目背景编写、编译内核态代码生成 bpf.oBPF 二进制程序C/C+gorust以包含预编译 BPF 代码的二进制分发多种不同的用户态加载框架更好的移植性,部署时不需要 重新编译;需要编写或自动生成复杂的用户态加载框架;没有标准的分发方案;C、Go、Rust 等框架都各自有各自的生态和 API,工具难以兼容、复用、管理;内核
4、代码和用户态代码绑定,难以动态加载和调整;8还可能存在哪些不够方便的地方?搭建和开发 eBPF 程序是一个门槛比较高、比较复杂的工作,必须同时关注内核态和用户态两个方面的交互和信息处理,还要配置环境,有没有更方便的方式?目前不同用户态语言如 C、Go、Rust 等编写的工具难以兼容、难以统一管理,多种开发生态难以整合:如何跨架构、跨语言和内核版本,使用标准化的方式方便又快捷的打包、分发、发布 eBPF 程序,同时还需要能很方便地动态调整 eBPF 程序的挂载点、参数等等?如何更方便地使用 eBPF 的工具?有没有可能从云端一行命令拉下来就使用,类似 docker 那样?或者把 eBPF 程序作
5、为服务运行,通过 HTTP 请求和 URL 即可动态插拔运行任意一个可重定位的 eBPF 程序?如何更方便地编译和分发使用 eBPF 程序?01项目背景901项目背景WebAssemblyWebAssembly(缩写 Wasm)是基于堆栈虚拟机的二进制指令格式。到现在为止,WASM 已经发展成为一个轻量级、高性能、跨平台和多语种的软件沙盒环境,被运用于云原生软件组件,可以在非浏览器环境下运行。wasm 的设计思路和 ebpf 也有不少相似之处。Docker+Wasm 让开发者能够更容易地快速构建和分发使用面向 Wasm 运行时的应用程序。项目目标项目目标0102编写内核态即可运行降低 eBPF
6、 学习成本提高开发效率编译和运行完全分离降低部署和使用的资源消耗简化使用方式使用 JSON/WASM 分发和 WebAssembly 生态相结合类似 docker 的使用体验保留动态调整 eBPF 程序的可能自动获取内核态导出数据在部署时不需要重新编译提供标准化的分发方式eunomia-bpfeBPF 轻量级开发框架:目标0212eunomia-bpf 核心部分的开发使用流程 02项目目标编写、编译内核态代码生成包含更多信息的 bpf.oBPF 二进制程序从源代码中提取额外的信息生成 JSON/YAML 的配置信息打包 JSON 或其他格式直接分发使用C/C+/Rust/GoWASM通常的编译