4个版本

0.1.3 2021年9月22日
0.1.2 2021年9月21日
0.1.1 2021年9月21日
0.1.0 2021年9月20日

#321 in #发布

MIT/Apache

480KB
1.5K SLoC

Rust API 用于编写eBPF程序。

概述

redbpf-probesredbpf 项目的一部分。它提供了一个惯用的Rust API来编写可以编译为eBPF字节码并在Linux内核eBPF虚拟机上执行的程序。

预计此crate将与配套的 redbpf-macros crate一起使用 - 这是一个过程宏集合,用于减少生成eBPF程序所需的样板代码量。

为了进一步简化处理eBPF程序的过程,redbpf 还提供了 cargo-bpf - 一个cargo子命令,用于简化创建和构建eBPF程序。

示例

这是 redbpf_probesredbpf_macros 在实际应用中的样子

#![no_std]
#![no_main]
use redbpf_probes::xdp::prelude::*;

program!(0xFFFFFFFE, "GPL");

#[xdp]
pub fn block_port_80(ctx: XdpContext) -> XdpResult {
if let Ok(transport) = ctx.transport() {
if transport.dest() == 80 {
return Ok(XdpAction::Drop);
}
}

Ok(XdpAction::Pass)
}

生成Rust绑定的方法

Linux内核的结构体和枚举的Rust绑定被BPF程序使用。redBPF提供了两种生成Rust绑定的方法。

  1. 从系统预先安装的Linux内核头文件生成Rust绑定。Linux内核头文件位于 bpf_sys::headers

  2. vmlinux.h 生成Rust绑定。它由 bpf_sys::type_gen 即时生成。vmlinux是Linux内核的映像,因此可以将所有数据类型(包括内部结构体和枚举)从vmlinux映像中导出到C源代码。

redBPF的用户可以通过设置以下解释的环境变量来选择生成Rust绑定的首选方法。

方法选择规则

为了在两种方法之间选择,涉及三个环境变量: KERNEL_SOURCEKERNEL_VERSIONREDBPF_VMLINUX

情况1. 没有设置

如果这三个环境变量都没有设置,将尝试两种生成Rust绑定的方法。首先尝试使用Linux内核头文件的方法。如果失败,则尝试使用vmlinux作为后备方法。

情况2. 当设置了 REDBPF_VMLINUX

REDBPF_VMLINUX 的优先级高于环境变量 KERNEL_SOURCEKERNEL_VERSION。因此,生成 BPF 程序的 Linux 内核数据结构 rust 绑定的方法是使用从 vmlinux 图像生成的 vmlinux.h 文件。在这种情况下,不需要预安装的内核头文件。

情况 3:未设置 REDBPF_VMLINUX,但设置了任一环境变量 KERNEL_SOURCEKERNEL_VERSION

生成 BPF 程序的 Linux 内核数据结构 rust 绑定的方法是使用指定路径中的内核头文件。在这种情况下,根本不需要 vmlinux。

REDBPF_VMLINUX 的可能值

  1. 自定义 vmlinux 的路径。例如:REDBPF_VMLINUX=/boot/my-vmlinux-5.11.0

  2. REDBPF_VMLINUX=system 的特殊处理。如果提供了 system,redBPF 将尝试从已知的系统路径探测 vmlinux 并使用它

  3. 未设置 REDBPF_VMLINUX。redBPF 的行为取决于是否提供了环境变量 KERNEL_SOURCEKERNEL_VERSION

依赖项

~1.6–5.5MB
~102K SLoC