跳到正文
返回

05 eBPF 示例教程 0:概念与工具

本文是学习归档,内容来自开源教程,未作精简。原文:https://eunomia.dev/zh/tutorials/0-introduce/

这是一个全面的 eBPF 开发教程的第一部分,旨在通过实用的 eBPF 开发指导您从初学者到高级用户。它涵盖了基本概念、实际代码示例以及在现代系统中的应用。我们将不再专注于传统工具如 BCC,而是使用现代框架如 libbpfCiliumlibbpf-rs 和 eunomia-bpf,并提供 CGoRust 的示例。

本教程的主要目标是提供清晰简洁的 eBPF 工具示例(起步只需 20 行代码!),帮助开发者快速掌握基本的 eBPF 开发技术。每个示例都是独立的,可以在目录结构中找到,每个目录代表一个独立的 eBPF 工具。您还可以访问我们的教程代码仓库 https://github.com/eunomia-bpf/bpf-developer-tutorial 或网站 https://eunomia.dev/tutorials/ 获取更多示例和完整的教程源代码。

eBPF 简介:安全高效的内核扩展

eBPF(扩展的 Berkeley Packet Filter)是一项突破性的技术,允许开发者在内核空间中安全高效地运行小型程序。与传统方法需要修改内核源代码或加载新模块不同,eBPF 使得动态定制和优化网络行为成为可能,且不会中断系统操作。这种灵活性和高效性使 eBPF 成为克服传统网络栈限制的关键技术。

eBPF 的强大之处是什么?

eBPF:过去、现在与未来

过去:可编程网络的变革

eBPF 于 2014 年推出,彻底改变了开发者处理网络的方式,允许小型可编程内核空间应用程序实时处理数据包。通过钩住关键内核点,eBPF 使得在网络包到达时应用自定义逻辑成为可能,从而提高了效率和灵活性。这使得组织能够在不需要自定义驱动程序或修改内核的情况下定制网络行为,为云原生和数据中心环境创造了理想的解决方案。

现在:满足现代计算需求的多功能框架

eBPF 已发展为一个多功能框架,超越了其最初的网络用途,现在涵盖了可观测性、追踪、安全性,甚至系统资源管理。eBPF 程序可以动态钩住内核事件,赋予开发者精确控制系统行为和性能优化的能力,而无需修改内核或重启系统。这使得 eBPF 成为系统管理员和开发者监控、优化和保护环境的必备工具。

以下是 eBPF 目前广泛应用的一些关键领域:

各行业组织已大规模采用 eBPF:

eBPF 能够动态调整系统行为并扩展到用户空间,使其成为现代计算不可或缺的技术。无论是优化网络流量、提升安全性,还是增强系统性能,eBPF 都能帮助开发者高效、安全地应对实时需求。

除了其内核模式运行时,eBPF 还可以扩展到内核之外。例如,bpftime 是一个用户空间 eBPF 运行时,允许在用户空间应用中进行高性能追踪(比内核 uprobe 快 10 倍)、性能分析和插件支持,且无需手动重新编译或重启进程。通过 bpftime 集成,eBPF 程序现在甚至可以卸载到 GPU,以低开销实现 GPU 内核的动态检测。这种 eBPF 超越内核空间的扩展有助于在 CPU、用户空间和 GPU 工作负载中提高灵活性和性能。

未来:eBPF 的扩展潜力

展望未来,预计 eBPF 将成为操作系统更为重要的一部分。重点将放在提升其灵活性、模块化和易用性上,使其能够应用于更广泛的场景。内存管理、并发机制的创新以及与用户空间应用的更好集成已在路上。已经有项目在编译 Linux 内核的关键部分到 BPF 指令集,这可能彻底改变内核开发和分析的方式。

动态栈、更好的用户空间可观测性工具(例如快速 Uprobes 和特定语言的栈行走器)以及更安全的程序终止机制等进展将继续增强 eBPF 的可靠性并扩展其使用场景。此外,新工具和库将简化 eBPF 开发,降低内核和应用开发者的入门门槛。

开始学习教程

本教程提供实用的 eBPF 开发实践,涵盖从初级到高级的主题。我们专注于在可观测性、网络和安全等领域的动手示例,使用 libbpflibbpf-rseunomia-bpf 等框架,并提供 C、Go 和 Rust 的示例。

本教程适合谁?

你将学到什么?


目录

  1. eBPF 简介
    基本概念和入门所需的工具。

  2. 初学者示例
    简单的程序,如“Hello World”及使用 kprobe 和 uprobe 进行基础追踪。

  3. 可观测性
    侧重于使用 eBPF 监控网络流量、文件操作和进程行为的示例。

  4. 网络
    侧重于修改和优化网络流量的示例,如 XDP、TC 和 socket。

  5. 安全
    用于隐藏进程和文件、发送信号杀死进程以及跟踪进程事件以增强安全性的程序。

  6. 高级用例
    涉及性能分析、调度器优化和用户空间 eBPF(如 bpftime)的复杂示例。

  7. 深入主题
    探索 eBPF 在 Android 上的应用、使用 eBPF 进行网络加速以及通过系统调用修改来保护系统。

如何使用 eBPF 编程

从头编写 eBPF 程序可能较为复杂。为简化这一过程,LLVM 于 2015 年引入了将高级语言代码编译为 eBPF 字节码的能力。自那时起,eBPF 社区构建了像 libbpf 这样的库来管理这些程序。这些库帮助将 eBPF 字节码加载到内核中并执行基本任务。Linux 内核源代码中 samples/bpf/ 目录包含了众多 eBPF 示例。

典型的 eBPF 程序包含两个部分:内核空间代码(*_kern.c)和用户空间代码(*_user.c)。内核空间代码定义逻辑,而用户空间代码负责加载和与内核交互。然而,像 libbpf-bootstrap 和 Go eBPF 库这样的工具简化了这一过程,允许一次性编译和更容易的开发。

eBPF 开发工具

这些工具有助于减少开发 eBPF 程序的复杂性,使开发者更容易优化系统性能、安全性和可观测性。

学习 eBPF 开发的一些技巧

本文不会提供更详细的 eBPF 原理介绍,但以下是一个学习计划和参考资料,可能对您有帮助:

eBPF 简介(5-7 小时)

推荐:

回答三个问题:

  1. 了解 eBPF 是什么?我们为什么需要它?难道不能使用内核模块吗?
  2. 它有哪些功能?它在 Linux 内核中能做什么?eBPF 程序和助手函数有哪些类型(不需要全部了解,但需要知道在哪里查找)?
  3. 它能用于哪些场景?例如,可以在哪些情况下使用?网络、安全、可观测性?

理解如何开发 eBPF 程序(10-15 小时)

了解并尝试 eBPF 开发框架:

其他开发框架:Go 或 Rust 语言,请自行搜索和尝试(0-2 小时)

如果有问题或想了解的内容,无论是否与本项目相关,都可以在该项目的讨论区开始讨论。

回答一些问题并尝试一些实验(2-5 小时):

  1. 如何开发最简单的 eBPF 程序?
  2. 如何使用 eBPF 追踪内核功能或函数?有很多方法,提供相应的代码示例;
  3. 用户模式和内核模式之间的通信解决方案有哪些?如何将信息从用户模式发送到内核模式?如何将信息从内核模式传递到用户模式?提供代码示例;
  4. 编写您自己的 eBPF 程序以实现某个功能;
  5. 在 eBPF 程序的整个生命周期中,用户模式和内核模式分别做了什么?

参考资料

您还可以访问我们的教程代码仓库 https://github.com/eunomia-bpf/bpf-developer-tutorial 或网站 https://eunomia.dev/tutorials/ 获取更多示例和完整的教程源代码。所有内容均为开源。我们将继续分享更多关于 eBPF 开发实践的内容,帮助您更好地理解和掌握 eBPF 技术。

推荐书籍

想要更系统、深入地学习 eBPF 技术?推荐《深入理解 eBPF 与可观测性》——业内首本系统性穿透 Linux 内核观测技术指南。本书由龙蜥社区多位资深专家联袂打造,深入剖析 eBPF 底层原理和开发框架,结合网络、内存、I/O、调度等六大领域,提供丰富的生产级实践代码。

欢迎关注我们的微信公众号,获取更多 eBPF 技术文章和教程更新!


分享这篇文章:

上一篇
06 eBPF 示例教程 1:Hello World
下一篇
04 eBPF 开发实践教程(总览)