掘金 后端 ( ) • 2024-03-29 15:40

扩展伯克利数据包过滤器(eBPF)是 Linux 内核中的一项技术,近年来受到了广泛关注。

它提供了一个强大而灵活的框架来创建可以在内核中运行的高效、安全和动态的程序,从而提高性能和功能。

image.png

什么是 eBPF?

eBPF 是一项 Linux 内核技术,使用户能够在内核中运行自定义程序,而无需修改内核源代码或加载内核模块。

最初,伯克利数据包过滤器(BPF)是为捕获和过滤网络数据包而设计的。然而,它的范围已经大大扩展,现在涵盖了网络以外的广泛用例。

eBPF 在 Linux 内核中提供了一个类似虚拟机的环境,允许用户编写、编译和运行可以与各种内核子系统交互的程序。这些程序采用受限制的类 C 语言编写,并由内核内的 eBPF 虚拟机 (VM) 执行,确保安全性和性能。

eBPF 的工作原理

  1. 编写 eBPF 程序:用户使用受限制的类 C 语言编写 eBPF 程序。这些程序是事件驱动的,由系统调用、网络数据包或跟踪点等特定事件触发。 eBPF 程序可以使用 LLVM(低级虚拟机)编译器集合和 BPF 后端来编写,该后端支持 eBPF 指令集。
  2. 编译和加载:编写完成后,eBPF 程序将被编译为字节码,可以使用 bpf() 系统调用将其加载到内核中。该字节码与平台无关,可以在任何支持 eBPF 的 Linux 系统上执行。
  3. 验证:为了确保安全,内核使用验证器组件验证加载的字节码。验证程序会检查多种条件,例如非法内存访问、无限循环和正确的资源使用情况,以防止潜在有害或编写不当的程序运行。
  4. 即时 (JIT) 编译:验证后,使用即时 (JIT) 编译器将字节码转换为目标平台的本机机器代码。此步骤通过避免执行期间的解释开销显着提高了性能。
  5. 执行:eBPF程序由内核内的eBPF虚拟机执行以响应特定事件。 eBPF VM 确保隔离性和安全性,同时提供内核数据结构和函数访问。
  6. 与用户空间交互:eBPF 程序可以使用 eBPF 映射(内核与用户空间之间共享的键值数据结构)与用户空间应用程序进行通信。这允许两个域之间进行高效且灵活的数据交换。

用例和应用

eBPF 因其多功能性和性能而受到 Linux 社区的欢迎。一些最常见的用例包括:

  1. 网络:eBPF 可用于实现自定义网络功能,例如负载平衡、数据包过滤和路由,所有这些功能都在内核内,提供高性能和灵活性。
  2. 安全性:eBPF 程序可以通过监视系统调用、网络活动和其他内核事件、检测和防止未经授权的操作来强制执行安全策略。
  3. 可观察性和跟踪:eBPF 通过将探测器附加到各种内核子系统来实现复杂的系统和应用程序监控,使开发人员和管理员能够深入了解其系统的性能和行为。
  4. 性能优化:eBPF 可以通过动态修改内核数据结构和函数来帮助识别性能瓶颈并优化系统行为。

eBPF 是一项强大而灵活的技术,它改变了开发人员和管理员与 Linux 交互的方式。