RustAya 编写 eBPF 程序


RustAya 编写 eBPF 程序

文章插图
本文地址:https://www.ebpf.top/post/ebpf_rust_aya
1. 前言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/ , 当前版本为v0.1.11,项目还处于偏早期 。基于 Aya 库开发 eBPF 程序可以给我们带来以下的便利:
  • 基于 Rust 的 Cargo 工具来管理、构建和测试项目;
  • 支持 CO-RE 直接生成与 Rust 与内核文件的绑定;
  • 用户工具代码(Rust)与运行在的内核中的 eBPF 代码轻松共享代码;
  • 对于 LLVM、libbpf、bcc 等完全没有任何依赖;
【RustAya 编写 eBPF 程序】本文仅是基于 Aya 编写 eBPF 程序及用户空间程序的生成和测试的过程记录,不涉及到对于生成 Rust 代码的详细解读 。
2. Rust 开发环境搭建2.1 创建 VM 虚拟机为了使用 Rust 进行 eBPF 程序编写 , 那么我们首先需要在本地搭建一个 Rust 开发环境 。这里我仍然采用 multipass 工具快速搭建一个 Ubuntu 22.04 LTS 的环境 。
$ multipass launch --name rust-aya -d 20G默认磁盘为 5G,比较容易造成磁盘空间满,因此这里将磁盘空间大小设置为 20G,你可以根据自己的情况调整 。
对于已经创建的 mulipass 实例可以在创建后进行调整,则需要 multipass 版本大于 1.10,而且需要调整的实例处于停止状态 , 详细可参见调整实例配置,例如 multipass set local.rust-aya.cpus=4 或 multipass set local.rust-aya.memory=8G 分别用于调整实例的 CPU 和 MEM 大小 。
2.2 安装 Rust 开发环境通常情况下,Rust 开发环境推荐通过 rustup 工具管理,我们可以通过以下命令快速安装该工具:
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh一般情况下我们选择默认选项安装 。整个安装过程会下载一个脚本完成 rustup 工具安装,同时也会安装最新的 Rust 稳定版本 。如果安装顺利 , 我们可以在最后看到如下的信息:
... stable-x86_64-unknown-linux-gnu installed - rustc 1.65.0 (897e37553 2022-11-02)Rust is installed now. Great!To get started you may need to restart your current shell.This would reload your PATH environment variable to includeCargo's bin directory ($HOME/.cargo/bin).To configure your current shell, run:source "$HOME/.cargo/env"在 rustup 工具安装完成后,我们可以使用其安装 Rust 稳定版(实际上默认已经安装)和 nightly ,其中 nightly 为开发者体验新功能的发布通道,Rust 2021 年开始支持编译 eBPF , 当前使用 Aya 需要基于 Rust Nightly 版本 。
Rust 有 3 个发布通道:
  • Nightly
  • Beta
  • Stable(稳定版)
大部分 Rust 开发者主要采用稳定版通道 , 不过希望实验新功能的开发者可能会使用 nightly 或 beta 版 。详情参见附录 G:Rust 是如何开发的与 “Nightly Rust”
$ 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 liststable-x86_64-unknown-linux-gnu (default)nightly-x86_64-unknown-linux-gnu安装 nightly 以后我们可以使用 rustup toolchain list 查看本地开发环境的开发工具链 。

推荐阅读