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