深入研究:了解Aya项目结构

  • jkrishna
  • 发布于 2025-12-07 18:39
  • 阅读 31

本文介绍了使用 Rust 编写 eBPF 程序时,Aya 模板生成的项目结构,重点解释了项目结构的组织方式及其原因。文章内容是官方 Aya 文档的补充,针对已具备 eBPF 基础知识和 Rust 编程经验的读者,主要关注 Aya 项目的结构。

概览

本博客的主要目标是解释 由 Aya 模板生成的项目结构,该模板用于用 Rust 编写 eBPF 程序。

你可能会想,在 Aya 已经有很好的文档的情况下,为什么还需要这篇博客。这篇文章是对官方 Aya 文档 的一个 扩展

本博客 涵盖基本的 eBPF 概念或 Rust 入门示例。它假设你已经了解:

  • 什么是 eBPF
  • 如何用 Rust 编写基本的 eBPF 程序
  • 如何在高层次上使用 Aya

这篇文章只关注 Aya 项目是如何构建的,以及为什么这样构建

开始

如果你想了解 Aya 及其工作原理的总体介绍,请参考 官方文档

关于安装步骤,请按照此处的 指南 进行操作。

在本博客中,我们将跳过这些基础知识,直接关注项目结构。

Aya 项目模板

我们将使用官方的 Aya 模板来理解项目布局。

该模板可在此处找到:

aya-template

你可以使用以下命令生成一个新项目:

cargo generate --name ebpf https://github.com/aya-rs/aya-template

在本地运行此命令会生成一个名为 xdp 的项目,并提示你选择程序类型。它提供了如下所示的选项:

程序类型选项

这些是我们在使用 aya-template 创建新项目时可以使用的所有选项。

现在我将解释一些我们可以使用的程序类型,

注意: 这一部分起初可能会让人觉得有点难以理解。只需浏览这些程序类型,以获得一个高层次的概念即可。

xdp -> eXpress data path(高速数据通路)

此程序附加到一个网络接口(例如,eth0),并钩入传入的网络数据包。

XDP 程序在数据包到达网卡后立即运行,在内核网络堆栈之前。它们用于高性能网络任务,如防火墙、DDoS 保护和负载均衡。

可以这样理解 -> "数据包到达 - 我应该 DROP(丢弃)它、PASS(通过)它,还是 REDIRECT(重定向)它?"

kprobe

此程序附加到 内核函数,例如 execvedo_sys_openat2,并钩入函数入口点。

kprobes 允许你在执行特定内核函数时运行 eBPF 代码。它们通常用于跟踪、可观察性和安全监控。

可以这样理解 -> "内核刚刚进入这个函数,所以观察它。"

perf_event

perf_event eBPF 程序附加到 Linux perf 子系统提供的性能监控事件。这些事件可以是 CPU 周期、执行的指令、缓存未命中、页面错误等等。

这些事件不是在发生某些事情时触发,而是在达到 时间/ 计数/ 阈值 等时触发。

可以这样理解 -> "每 N 个 CPU 周期,运行这个 eBPF 程序。"

kretprobe

此程序附加到与 kprobe 相同的内核函数,但钩入函数返回点。

kretprobes 在内核函数完成执行时运行。它们通常用于测量延迟或检查返回值。

可以这样理解 -> "内核刚刚退出这个函数。"

tracepoint

此程序附加到稳定的 tracepoint 名称,如 syscalls:sys_enter_execvesyscalls:sys_exit_execve,并钩入预定义的内核事件。

Tracepoints 比 kprobes 更安全和稳定,因为内核显式地公开了它们。许多生产环境的可观察性工具更喜欢 tracepoints。

可以这样理解 -> "内核刚刚公开了这个事件,所以监听它。"

fentry/fexit

此程序附加到具有 BTF 信息的内核函数,并根据 BTF 钩入函数入口或出口。

这些是 kprobekretprobe 的现代替代品。它们在内核版本之间更快、更安全、更稳定。

可以这样理解 -> "内核刚刚进入/退出这个函数。"

uprobe

此程序附加到 用户空间二进制文件函数符号,并钩入用户空间函数入口。

uprobes 允许 eBPF 程序观察用户空间应用程序,而不仅仅是内核。它们对于在不更改应用程序代码的情况下跟踪应用程序行为非常有用。

可以这样理解 -> "一个用户程序刚刚调用了这个函数。"

uretprobe

此程序附加到与 uprobe 相同的位置,但钩入用户空间函数返回点。

它主要用于测量延迟或捕获用户空间函数的返回值。

这些程序类型涵盖了大多数实际用例。它们也比旧的替代方案更稳定和安全。

所以现在让我们看看我们从 cargo generate 命令中获得的项目结构。

aya 项目结构

在这里,在这个 xdp-log 项目中,我们有三个文件夹,并且所有重要的文件都在同一层级。

  • xdp-log — 加载和管理 eBPF 程序的用户空间程序
  • xdp-log-ebpf — 内核空间 eBPF 程序
  • xdp-log-common — 用户空间和内核空间共享的类型

如果你在 macOS 上并想运行 XDP 程序,你可以参考这篇文章:使用 Lima 在 macOS 上运行 XDP

  • 原文链接: jkrishna.xyz/blog/deep-d...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
jkrishna
jkrishna
江湖只有他的大名,没有他的介绍。