RustAya 编写 eBPF 程序( 三 )

至此,已经完成了 eBPF 程序的编译工作,接着我们需要继续编译用户空间代码 。
3.3 运行用户空间程序我们可以直接使用 cargo 命令来运行用户空间程序:
$ RUST_LOG=info cargo xtask run...Finished dev [unoptimized + debuginfo] target(s) in 8.38sError: failed to attach the XDP program with default flags - try changing XdpFlags::default() to XdpFlags::SKB_MODECaused by:unknown network interface eth0

RUST_LOG=info 为设置日志级别的环境变量,默认为 warn,但向导生成的代码打印的日志级别默认为 info,因此需要运行时制定,否则可能会出现程序运行查看不到日志的情况 。
cargo xtask run 命令会直接编译用户空间代码并运行,但是运行过程中我们发现出现错误 unknown network interface eth0,这是因为默认生成的程序指定将 XDP 程序加载到 eth0 网卡,而我们的 VM 默认网卡不为 eth0 导致,这里我们明确制定网卡使用 lo 测试,再次运行结果如下:
$ RUST_LOG=info cargo xtask run -- --iface lo...Finished dev [optimized] target(s) in 0.19sFinished dev [unoptimized + debuginfo] target(s) in 0.12s[2022-11-05T16:25:27Z INFOmyapp] Waiting for Ctrl-C...这次可以发现用户空间程序已经正常运行,并且将对应的 eBPF 程序加载至内核中 。
$ sudo bpftool prog list42: xdpname myapptag 2929f83b3be0f64bgpl loaded_at 2022-11-06T22:42:54+0800uid 0 xlated 2016Bjited 1151Bmemlock 4096Bmap_ids 14,13,15$ ip link show1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 xdpgeneric qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00prog/xdp id 42 # <=== 加载的 eBPF 程序 id 42我们启动网卡在 lo 网卡的 ping 包验证:
RustAya 编写 eBPF 程序

文章插图
我们可以看到当我们在另外一个窗口在本地端口运行 ping -c 1 127.0.0.1 命令的同时,在运行用户空间 myapp 的程序日志中打印了对应的日志 received a packet
至此,我们就完成了整个基于 Aya 最简单 XDP 程序的验证,如果你打算进阶一步打印报文日志或者对特定包进行对齐,则可以参考 Aya Book 中对应的章节 。
4. 总结通过对于 Aya 整个过程中的使用,我们可以发现使用 Aya 开发 eBPF 程序的确给我们带来了诸多的便利,通过向导搭建了整个项目的基本框架,并且实现了编译、加载等相关的管理工作,特别是对于新手入门更加友好 。默认生成的用户空间代码与 eBPF 代码实现了一定程度的代码复用,特别是日志相关的打印更加便捷 。同时,该项目当前的文档还不是特别完整,诸如 Probe/Tracepoint/XDP 等程序类型的文档还在完善中,如果你有兴趣也欢迎投入到相关的建设中 。更多介绍可参考 Aya: Rust 风格的 eBPF 伙伴 。
同时,也期待 libbpf-bootstrap 项目能够早日实现 Aya 向导式的 eBPF 程序代码创建,这对于编写 eBPF 相关的程序的确提供了快速上手的体验 。
参考
  1. 一篇 Rust 的 30 分钟介绍
  2. https://aya-rs.dev/
  3. LWN: Aya: writing BPF in Rust 2021-6-15
  4. Aya: your tRusty eBPF companion2022-6-22 【翻译】Aya: Rust 风格的 eBPF 伙伴
  5. Adding BPF target support to the Rust compiler
  6. Rust and Tell - Berlin - Aya: Extending the Linux Kernel with eBPF and Rust by Michal Rostecki 2022-10-24
  7. Writing an eBPF/XDP load-balancer in Rust
  8. Wanting to use BPF with Rust (Part 1)

推荐阅读