文章插图
本文地址:https://www.ebpf.top/post/ebpf_rust_aya
1. 前言【RustAya 编写 eBPF 程序】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 等完全没有任何依赖;
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 个发布通道:
大部分 Rust 开发者主要采用稳定版通道,不过希望实验新功能的开发者可能会使用 nightly 或 beta 版 。详情参见附录 G:Rust 是如何开发的与 “Nightly Rust”
- Nightly
- Beta
- Stable(稳定版)
经验总结扩展阅读
- TCP套接字编写,多进程多线程版本 Linux网络通信
- 2d游戏怎么编程(怎么编写一个2d游戏)
- 怎么编写游戏程序(游戏外挂编写教程)
- 手写编程语言-如何为 GScript 编写标准库
- 编写HelloWorld并运行
- 如何编写 Pipeline 脚本
- Java 最长公共前缀
- qq邮箱模式怎么写(qq邮箱怎么正确编写)
- WPS表格图标美化设置
- 如何编写表白代码 如何使用代码表白?