至此,已经完成了 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 包验证:文章插图
我们可以看到当我们在另外一个窗口在本地端口运行
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 相关的程序的确提供了快速上手的体验 。
参考
- 一篇 Rust 的 30 分钟介绍
- https://aya-rs.dev/
- LWN: Aya: writing BPF in Rust 2021-6-15
- Aya: your tRusty eBPF companion2022-6-22 【翻译】Aya: Rust 风格的 eBPF 伙伴
- Adding BPF target support to the Rust compiler
- Rust and Tell - Berlin - Aya: Extending the Linux Kernel with eBPF and Rust by Michal Rostecki 2022-10-24
- Writing an eBPF/XDP load-balancer in Rust
- Wanting to use BPF with Rust (Part 1)
推荐阅读
- TCP套接字编写,多进程多线程版本 Linux网络通信
- 2d游戏怎么编程(怎么编写一个2d游戏)
- 怎么编写游戏程序(游戏外挂编写教程)
- 手写编程语言-如何为 GScript 编写标准库
- 编写HelloWorld并运行
- 如何编写 Pipeline 脚本
- Java 最长公共前缀
- qq邮箱模式怎么写(qq邮箱怎么正确编写)
- 如何编写会议签到册
- 如何编写一个网站 超详细的网站制作教程