参考
aya框架使用: https://blog.csdn.net/dwh0403/article/details/12781791
aya官网:https://aya-rs.dev/book
centos7.9升级内核:https://blog.csdn.net/XiaoWang0777/article/details/140466154
前言
Linux 内核 6.1 版本中有一个非常引人注意的变化:引入了对 Rust 编程语言的支持。Rust 是一种系统编程语言,Rust 通过提供非常强大的编译时保证和对内存生命周期的明确控制。在内核开发中引入 Rust 语言,将会为内核开发的早期带来更多的安全保障。eBPF 是在内核中基于事件运行用户自定义程序的技术,其验证器机制可以保障运行在内核中 eBPF 程序的安全性。
Rust 与 eBPF 有着一个共同的目标:保证内核安全,只是两者侧重的维度有所不同。
尽管使用 Rust 编写 eBPF 程序多数情况下都需要通过不安全的方式在内核进行内存读写,但是基于 Rust 和 Aya ,的确能够给我们带来一个快速和高效的开发体验,这包括自动生成整个程序框架(eBPF 程序及对应的用户空间代码)、参数检查确认、错误处理、统一的相关构建和管理方式等等 。
Aya 是一个以可操作性和开发者体验为重点的 eBPF 库,完全是在 Rust 基础上建立的,只使用 libc 包来执行系统调用。Aya 官方仓库地址为 https://github.com/aya-rs/aya
- 基于 Rust 的 Cargo 工具来管理、构建和测试项目;
- 支持 CO-RE 直接生成与 Rust 与内核文件的绑定;
- 用户工具代码(Rust)与运行在的内核中的 eBPF 代码轻松共享代码;
- 对于 LLVM、libbpf、bcc 等完全没有任何依赖;
- 本文仅是基于 Aya 编写 eBPF 程序及用户空间程序的生成和测试的过程记录,不涉及到对于生成 Rust 代码的详细解读。
Rust 开发环境搭建
安装 Rust 开发环境
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
在 rustup 工具安装完成后,我们可以使用其安装 Rust 稳定版(实际上默认已经安装)和 nightly ,其中 nightly 为开发者体验新功能的发布通道,Rust 2021 年开始支持编译 eBPF,当前使用 Aya 需要基于 Rust Nightly 版本。
$ source "$HOME/.cargo/env"
$ rustup install stable # rustup 命令已经默认安装
info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu'
stable-x86_64-unknown-linux-gnu unchanged - rustc 1.65.0 (897e37553 2022-11-02)
info: checking for self-updates
$ rustup toolchain install nightly --component rust-src
...
info: installing component 'rustfmt'
nightly-x86_64-unknown-linux-gnu installed - rustc 1.67.0-nightly (09508489e 2022-11-04)
info: checking for self-updates
$ rustup toolchain list
stable-x86_64-unknown-linux-gnu (default)
nightly-x86_64-unknown-linux-gnu
安装 nightly 以后我们可以使用 rustup toolchain list 查看本地开发环境的开发工具链。
安装 bpf-linker 依赖 和 bpftool 工具
为了使用 Aya,我们还需要安装依赖包 bpf-linker,但其依赖与 LLVM/Clang 等工具,因此我们也需要提前安装:
sudo apt-get update
sudo apt-get install llvm clang -y
cargo install bpf-linker
最后,为了生成内核数据结构的绑定,我们还必须安装 bpftool,可以从发行版中安装或从源代码中构建,这里我选用发行版安装方式(基于 Ubuntu 22.04),源码安装可参考 bpftool 仓库说明文档:https://github.com/libbpf/bpftool
sudo apt install linux-tools-common linux-tools-5.15.0-52-generic linux-cloud-tools-5.15.0-52-generic -y
Aya 向导创建 eBPF 程序
Aya 提供了一套模版向导用于创建 eBPF 对应的程序类型,向导创建依赖于 cargo-generate,因此我们需要在运行程序向导前提前安装:
cargo install cargo-generate
我在安装 cargo-generate 过程中遇到了如下的错误,主要是由于依赖 openssl 库问题导致,如果你也遇到类似问题可参考 cargo-generate 安装指南 和 Rust OpenSSL 文档,如果一切顺利,则可忽略此处的提示。
warning: build failed, waiting for other jobs to finish...
error: failed to compile `cargo-generate v0.16.0`, intermediate artifacts can be found at `/tmp/cargo-install8NrREg
安装依赖
sudo apt install openssl pkg-config libssl-dev gcc m4 ca-certificates make perl -y
重新安装
在完成依赖后,我们就可以使用向导来创建 eBPF 项目,这里以 XDP 类型程序为例:
cargo generate https://github.com/aya-rs/aya-template
源码开发教程请参考官网: https://aya-rs.dev/book/start/
本文章源码: https://github.com/noovertime7/ebpf-xdp-demo
编译 eBPF 程序
cargo xtask build-ebpf
编译用户空间程序
cargo xtask run -- --iface lo
运行
踩坑
- 在centos7.9系统内核版本3.10运行ebpf程序失败,内核版本太低,
升级内核版本至5.4解决
- 运行二进制文件没有任何输出,默认的日志等级是warn,环境变量注入失败
修改用户空间代码,默认日志等级为debug,代码如下
// 使用 env_logger 的构建器手动设置日志级别
env_logger::Builder::new()
.filter(None, LevelFilter::Debug) // 设置全局日志级别为 debug
.init();