28个版本 (11个稳定版)
| 2.3.0 | 2022年1月9日 |
|---|---|
| 2.2.0 | 2021年11月17日 |
| 2.1.0 | 2021年10月29日 |
| 1.3.0 | 2020年12月7日 |
| 0.9.6 | 2019年11月9日 |
在 #bpf 中排名第68
每月下载量59次
用于 redbpf-macros
175KB
4K SLoC
Rust API用于编写eBPF程序。
概述
redbpf-probes是redbpf项目的一部分。它提供了一个惯用的Rust API,用于编写可以编译为eBPF字节码并由linux内核eBPF虚拟机执行的程序。
该crate预计将与配套的redbpf-macros crate一起使用 - 这是一个用于减少生成eBPF程序所需的样板代码数量的过程宏集合。
为了进一步简化与eBPF程序一起工作的过程,redbpf还提供了cargo-bpf - 一个用于简化创建和构建eBPF程序的cargo子命令。
示例
这就是redbpf_probes和redbpf_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绑定的方法。
-
从系统预先安装的Linux内核头文件生成Rust绑定。Linux内核头文件位于
bpf_sys::headers。 -
从
vmlinux.h生成Rust绑定。它由bpf_sys::type_gen现场生成。vmlinux是Linux内核的映像,因此可以从中将所有数据类型(包括内部结构体和枚举)转换为C源代码。
redBPF的用户可以通过设置以下解释的环境变量来选择首选的生成Rust绑定的方法。
方法选择规则
为了在两种方法之间选择一种方法,涉及三个环境变量:KERNEL_SOURCE,KERNEL_VERSION和REDBPF_VMLINUX。
情况1. 未设置
如果没有设置这三个环境变量中的任何一个,将尝试两种生成rust绑定的方法。首先尝试使用Linux内核头文件的方法。如果失败,则尝试使用vmlinux作为后备方法。
情况2. 当设置了 REDBPF_VMLINUX
REDBPF_VMLINUX 优先于环境变量 KERNEL_SOURCE 和 KERNEL_VERSION。因此,生成BPF程序Linux内核数据结构rust绑定的方法是使用从vmlinux镜像生成的vmlinux.h。在这种情况下,不需要预安装的内核头文件。
情况3. REDBPF_VMLINUX 未设置,但设置了环境变量 KERNEL_SOURCE 或 KERNEL_VERSION 中的任何一个
生成BPF程序Linux内核数据结构的rust绑定方法是使用指定路径中的内核头文件。在这种情况下,vmlinux根本不需要。
REDBPF_VMLINUX 可能的值
- 自定义vmlinux文件或原始BTF数据文件的路径
- 例如,
REDBPF_VMLINUX=/boot/my-vmlinux-5.11.0指定了vmlinux镜像的路径。 - 例如,
REDBPF_VMLINUX=/sys/kernel/btf/vmlinux设置了原始BTF数据文件的路径。
-
对
REDBPF_VMLINUX=system的特殊处理。如果提供了system,redBPF将尝试从知名的系统路径探测vmlinux并使用它 -
未设置
REDBPF_VMLINUX。redBPF的行为取决于是否提供了环境变量KERNEL_SOURCE和KERNEL_VERSION。
依赖项
~1.6–5.5MB
~99K SLoC