共计 3633 个字符,预计需要花费 10 分钟才能阅读完成。
近日,在 2022 云栖大会龙蜥峰会 eBPF & Linux 稳定性专场上,来自 eBPF 技术摸索 SIG Maintainer、浙江大学的郑昱笙分享了《eunomia-bpf:eBPF 轻量级开发框架》技术演讲,以下为本次演讲内容:
大家好!我是来自浙江大学的郑昱笙,明天为大家介绍下 eunomia-bpf 我的项目作为一个为了简化 eBPF 程序的开发、散发、运行而设计的轻量级 eBPF 开发框架的背景和指标;再通过一些简略的实例,展现一下 eunomia-bpf 是如何从云端一行命令下载运行 eBPF 程序、只编写内核态代码即可运行和导出事件,以及和 WebAssembly 的联合等性能,最初简要论述一下 eunomia-bpf 的原理和设计实现的思路,探讨一下接下来的倒退方向。
eunomia-bpf 我的项目龙蜥社区开源仓库:https://gitee.com/anolis/eunomia
概要
eunomia-bpf 起源于 2022 年全国大学生操作系统大赛,心愿将 eBPF 程序作为服务运行,把 eBPF 程序打包为一个 JSON 对象,通过 HTTP 申请即可动静插拔运行任意一个可重定位的 eBPF 程序,并且能够适应不同内核版本和架构。较量完结之后,在高校的几位老师和社区中的一些搭档的帮忙和领导下(在这里重点感激西安邮电大学陈莉君传授及团队和龙蜥社区毛文安老师),逐渐把这些想法变成了一个初具雏形的开源我的项目。
以后,eunomia-bpf 想要解决的问题或 eBPF 程序以后的开发和散发过程中存的痛点次要有以下两个:
第一对于老手而言,搭建和开发 eBPF 程序的门槛较高,不仅须要必须同时关注内核态和用户态两方面的交互和信息处理,还须要编写用户态加载代码。
第二在不同架构的不同内核版本上无奈方便快捷地打包、散发、公布各种 eBPF 程序。eBPF 很多小工具由不同的语言开发,存在不同的接口,无奈轻易集成到大型的可观测零碎。以后没有很好的插件计划,很多时候必须从新编译整个可观测的框架,再重新部署上线,能力更新 eBPF 探针或数据处理模块。另外,如果引入第三方的用户态数据处理代码,代码解体会导致整个程序解体。
因而,针对下面两个问题,咱们提出了三种解决思路:
1. 针对初学者,只须要编写内核态代码即可主动获取内核态导出的数据,编译后即可进行加载和运行,升高了 eBPF 的学习老本,进步了开发效率。
2. 基于 libbpf 一次编译处处运行的个性,将用户态、内核态的编译和运行的齐全拆散,通过规范 JSON 或 WASM 模块的形式进行散发,无需进行从新编译,利用启动占用资源少,工夫短,甚至容器启动更短。
- WebAssembly (缩写 WASM) 是一种基于堆栈虚拟机的二进制格局,WASM 是为了可移植的指标而设计。可作为 C/C+/RUST 等高级语言的编译指标,使客户端和服务器应用程序可能在 Web 上部署。到当初为止,WASM 曾经倒退成为一个轻量级、高性能、跨平台和多语种的软件沙盒环境,被使用于云原生软件组件,能够在非浏览器环境下运行。WASM 的设计思路和 eBPF 也有不少相似之处。
3. 只编写内核态代码的时候,应用 JSON 即可实现散发、加载、打包的过程,对于残缺的、须要用户态和内核态进行交互的 eBPF 利用或工具,能够在 WASM 中编写简单的用户态处理程序进行管制和解决,并且将编译好的 eBPF 字节码嵌入在 WASM 模块中一起散发,在指标机器上动静加载运行。 - 和 WASM 生态项联合能够给 eBPF 程序带来许多个性,同时和 eBPF 程序本来的设计思路也不约而同,比方可移植、隔离性、安全性,它也是一个跨语言、轻量级的运行环境等等。同时也能够借助 WASM 的相干工具实现 eBPF 程序的 OCI 镜像的存储和散发,最近 Docker 官网也推出了一个基于 WASM 的散发工具。
以上三局部就是 eunomia-bpf 的外围个性,接着和大家一起来看一些示例。
示例
eunomia-bpf 并不是一个残缺的零碎,而是相似于开发库和开发框架,能够很轻松地嵌入 Coolbpf 工具链里,也能够作为开发库或开发框架嵌入其余程序。
能够通过一行命令从网页端间接下载预编译好的 eBPF 程序运行。应用 WebAssembly 或 JSON 模块的形式进行散发,部署时无需从新编译,启动速度很快。eunomia-bpf 实用于通用的、任意类型的 eBPF 程序,不仅局限于 trace 方面的 kprobe、uprobe、fentry 等,也反对如 lsm、tc、xdp 等类型的 eBPF 利用,都只须要编写内核态代码即可实现。
上图中为放入 URL 里的模式,也能够换成 OCI 镜像或 Docker 镜像,能够存储在 Docker 仓库或 github package,应用形式与 Docker 基本一致,只需简略地执行 pull、run 即可运行,也能够将编译好的程序包 push 上来间接应用。
而相比于传统的 Docker 镜像,它的启动速度更快,同时也保留了 eBPF 很重要的个性,能够轻松嵌入到其余程序作为子模块或插件应用。
通过 eunomia-bpf,只需编写内核态代码即可正确运行,可能最大水平缩小老手的上手阻碍,省略了用户态的加载框架编写,可能主动导出内核态 perf event 或 ring buffer 事件。另外,它与和原生 libbpf 齐全兼容,能够获取 libbpf tools 的内核态代码,无需批改任何代码,可间接运行。
能够额定增加 tracepoint,也能够通过正文的模式增加其余内容。应用容器打包编译工具链,无需放心环境配置问题,一行命令生成我的项目模板、一行命令编译。
一般来说,一个残缺的 eBPF 应用程序分为用户空间程序和内核程序两局部,用户空间程序负责加载 BPF 字节码至内核,或负责读取内核回传的统计信息或者事件详情,进行相干的数据处理和管制。
咱们能够在 WASM 中编写用户态辅助程序,来实现平安、高效的用户态数据处理和管制逻辑,它同样具备 eBPF 的个性,例如安全性(WASM 和 eBPF 一样也是个沙盒环境,在用户态运行的时候即便 WASM 模块解体了,也不会造成宿主程序的异样退出)、可移植性、轻量级、模块化等等,也能够作为插件应用,增加新的数据处理逻辑时,也不须要更改本来的代码。(留神 WASM 是可选而不是必须的,对于一些简略的利用而言,编写内核态代码就足够了)
实际上,咱们是用 C 语言编写代码,而后打包生成 WASM 模块,之后咱们能够:
- 借助 WebAssembly 的相干生态帮忙散发、治理 eBPF 程序,例如 docker-wasm。
- 可嵌入大型利用中作为 eBPF 可编程模块或插件应用。
这里演示的是一个简略的 WASM 模块,它能够获取以后零碎的过程间的 signal 信号传递的事件,也能够承受一些命令行参数,并且对上报的信息进行解决。
目前来看,咱们曾经能够基本上不必进行代码批改,就能够间接把 BCC/libbpf-tools 外面的程序编译为 WASM 模块。对开发体验来说,也能够做到和应用 C 语言开发 libbpf 的 eBPF 程序完全相同,之后也能够引入其余的语言开发 SDK。
把 WASM 和 eBPF 联合起来次要的艰难在于,WASM 的内存布局和 eBPF 程序并不一样,C 语言的构造体并不能间接映射,所以传递构造体必须要通过序列化操作。同时,WASM 对于拜访系统资源,例如文件、网络等等,也有不少限度,很多规范库是缺失的,所以咱们须要在 WASM 模块中进行一些非凡的解决和移植。
零碎架构
架构底层依赖的是内核态和用户态的基础设施,比方 libbpf 库和 Kernel 中的 eBPF 虚拟机。在内核的基础设施这之上,咱们会提供相干的编译工具链,和对应的运行时加载器,帮忙生成 JSON 或打包成 WASM 的模块,工具链自身应用了比方 Clang/LLVM、bpftool 等工具。动静加载库能够独立应用,与 WASM 无关,也能够借助动静加载 JSON 配置信息即可热插拔、热更新 eBPF 程序的模式,通过 API 接口轻松实现 kernel function as a service(内核函数即服务)。
咱们还实现了 WASM 形象层,蕴含 API 标准,比方用于扩大 WASM 的虚拟机 WSAI 零碎占用的拜访模式或与 eBPF 交互的拜访模式。还有基于 WASM 定制的 libbpf 库、移植的辅助态程序以及序列化库等,用于在 WASM 模块加载基于 libbpf 的 eBPF 程序。运行时库能够轻松进行替换,比方替换成 WSI 的 WASM 运行时。除此之外,下层还在 LMP 我的项目中,实现了 eBPF hub 等包治理和散发设施,以及其余的命令行工具、可观测性工具等。
目前,eunomia-bpf 我的项目已在龙蜥社区开源,欢送各位开发者体验,也欢送大家提出倡议和反馈,一起来做大做强。
相干链接:
eunomia-bpf 我的项目地址链接:https://github.com/eunomia-bpf/eunomia-bpfe
BPF 技术摸索 SIG 地址:https://openanolis.cn/sig/ebpfresearch
原文链接
本文为阿里云原创内容,未经容许不得转载。