eBPF 简介

eBPF是什么?

eBPF 全称(Extended Berkeley Packet Filter)扩展的伯克利包过滤器

从这个名字中,你可以看到它的根源在于过滤网络数据包,而且最初的 论文 2 是在伯克利实验室(Lawrence Berkeley National Laboratory)写的。但是(在我看来)这个名字对于传达 eBPF 的真正力量并没有很大的帮助,因为"扩展" 版本可以实现比数据包过滤多得多的功能。最近,eBPF 被用作一个独立的名称,它所包含的内容比它的缩写更多。

eBPF 是一个框架,允许用户在操作系统的内核内加载和运行自定义程序。这意味着它可以扩展甚至修改内核的行为。

当 eBPF 程序被加载到内核中时,有一个验证器确保它是安全运行的,如果无法确认,则拒绝它。一旦加载,eBPF 程序需要被附加到一个事件上,这样,每当事件发生时,程序就会被触发。

现在,广泛使用的 Linux 内核都支持 “扩展” 部分,eBPF 和 BPF 这两个术语现在基本上可以互换使用。

基于 eBPF 的工具

正如你在本报告中所看到的,动态改变内核行为的能力非常有用。传统上,如果我们想观察应用程序的行为,我们在应用程序中添加代码,以产生日志和追踪。eBPF 允许我们收集关于应用程序行为的定制信息,通过在内核中观察它,而不必修改应用程序。我们可以在这种可观测性的基础上创建 eBPF 安全工具,从内核中检测甚至防止恶意活动。我们可以用 eBPF 创建强大的、高性能的网络功能,在内核内处理网络数据包,避免昂贵的用户空间转换。

从内核的角度来观测应用程序的概念并不新颖——这建立在较早的 Linux 功能之上,比如 perf 3,它也从内核内部收集行为和性能信息,而不需要修改被测量的应用程序。但是这些工具定义了可以收集的数据种类以及数据的格式。有了 eBPF,我们就有了更大的灵活性,因为我们可以编写完全自定义的程序,允许我们出于不同的目的建立广泛的工具。

eBPF 编程的能力异常强大,但也很复杂。对于我们大多数人来说,eBPF 的效用不是来自于自己写的程序,而是来自于使用别人创造的工具。有越来越多的项目和供应商在 eBPF 平台上创建了新一代的工具,包括可观测性、安全性、网络等。

如果你对 Linux 命令行很熟悉,迫不及待地想看到 eBPF 的运行,推荐你从 BCC 项目开始。BCC 包含丰富的追踪工具集合;即使只是瞥一眼列表也可以领略到 eBPF 广泛的应用,包括文件操作、内存使用、CPU 统计,甚至观察在系统任意位置输入的 bash 命令。

使用 eBPF 比直接编写内核代码更容易操作。