本文共 6246 字,大约阅读时间需要 20 分钟。
目录
Linux内核一直是实现监视/可观察性,网络和安全性的理想场所。不幸的是,这通常是不切实际的,因为它需要更改内核源代码或加载内核模块,并导致彼此堆叠的抽象层。eBPF是一项革命性的技术,可以在Linux内核中运行沙盒程序,而无需更改内核源代码或加载内核模块。通过使Linux内核可编程,基础架构软件可以利用现有的层,使其更加智能和功能丰富,而无需继续为系统增加额外的复杂性。
eBPF导致在网络,安全性,应用程序性能分析/性能跟踪和性能故障排除等领域开发了新一代的工具,这些工具不再依赖现有的内核功能,而是在不影响执行效率或安全性的情况下主动重新编程运行时行为。
在看到和理解所有系统调用并将其与所有网络操作的数据包和套接字级别视图相结合的基础上,可以采用革命性的新方法来保护系统。尽管系统调用筛选,网络级筛选和流程上下文跟踪的各个方面通常由完全独立的系统处理,但eBPF允许将各个方面的可见性和控制相结合,以创建在更多上下文和更好控制级别上运行的安全系统。
将eBPF程序附加到跟踪点以及内核和用户应用程序探测点的能力,使人们对应用程序和系统本身的运行时行为具有空前的可见性。通过为应用程序端和系统端提供自省功能,可以将两种视图组合在一起,从而提供强大而独特的见解来对系统性能问题进行故障排除。先进的统计数据结构允许以有效的方式提取有意义的可见性数据,而无需像通常由类似系统完成的那样导出大量采样数据。
可编程性和效率的结合使eBPF自然满足网络解决方案的所有分组处理需求。eBPF的可编程性使您能够添加其他协议解析器,并轻松对任何转发逻辑进行编程以满足不断变化的需求,而无需离开Linux内核的数据包处理上下文。JIT编译器提供的效率提供了与本机编译的内核内代码接近的执行性能。
eBPF不再依赖于操作系统公开的静态计数器和计量器,而是启用了自定义指标的收集和内核聚合以及基于各种可能来源的可见性事件的生成。通过仅收集所需的可见性数据并通过在事件源处生成直方图和类似的数据结构,而不是依赖于样本的导出,这扩展了可以实现的可见性深度,并显着减少了整个系统的开销。
eBPF.io是每个人都可以在eBPF主题上进行学习和协作的地方。eBPF是一个开放社区,每个人都可以参与和共享。无论您是想阅读eBPF的入门指南,查找更多的阅读材料,还是迈出成为主要eBPF项目贡献者的第一步,eBPF.io都会为您提供帮助。
以下各章是对eBPF的快速介绍。如果您想了解有关eBPF的更多信息,请参阅《。无论您是要构建eBPF程序的开发人员,还是对利用eBPF的解决方案感兴趣的人员,了解基本概念和体系结构都是很有用的。
eBPF程序是事件驱动的,并在内核或应用程序通过某个挂钩点时运行。预定义的挂钩包括系统调用,函数进入/退出,内核跟踪点,网络事件以及其他几个。
如果针对特定需要不存在预定义的挂钩,则可以创建内核探针(kprobe)或用户探针(uprobe),以将eBPF程序附加到内核或用户应用程序中的几乎任何位置。
在很多情况下,不是直接使用,而是通过,或等项目间接使用,这些项目在提供了抽象,并且不需要直接编写程序,而是提供了指定基于意图的定义的功能,然后使用eBPF实施。
如果不存在更高级别的抽象,则需要直接编写程序。Linux内核希望eBPF程序以字节码的形式加载。虽然当然可以直接编写字节码,但更常见的开发实践是利用编译器套件将伪C代码编译为eBPF字节码。
确定了所需的钩子后,可以使用bpf系统调用将eBPF程序加载到Linux内核中。通常使用可用的eBPF库之一完成此操作。下一节将介绍可用的开发工具链。
当程序被加载到Linux内核中时,在连接到请求的钩子之前,它需要经过两个步骤:
1.验证
验证步骤可确保eBPF程序安全运行。它验证程序是否满足几个条件,例如:
2.JIT编译
即时(JIT)编译步骤将程序的通用字节码转换为特定于机器的指令集,以优化程序的执行速度。这使得eBPF程序的运行效率与本地编译的内核代码或作为内核模块加载的代码一样有效。
eBPF程序的重要方面是共享收集的信息和存储状态的能力。为此,eBPF程序可以利用eBPF映射的概念来存储和检索各种数据结构中的数据。可以通过系统调用从eBPF程序以及用户空间中的应用程序访问eBPF映射。
以下是不完整的受支持地图类型列表,以帮助您理解数据结构的多样性。对于各种映射类型,可以使用共享版本和每个CPU版本。
eBPF程序无法调用任意内核功能。允许这样做会将eBPF程序绑定到特定的内核版本,并使程序的兼容性复杂化。相反,eBPF程序可以将函数调用到辅助函数中,该函数是内核提供的众所周知且稳定的API。
可用的帮助程序调用集在不断发展。可用的帮助程序调用的示例:
eBPF程序可与尾部和函数调用的概念组合。函数调用允许在eBPF程序中定义和调用函数。尾部调用可以调用并执行另一个eBPF程序并替换执行上下文,类似于execve()系统调用对常规进程的操作方式。
有了强大的力量,就还必须承担巨大的责任。
eBPF是一项非常强大的技术,现在运行在许多关键软件基础架构组件的核心。在eBPF的开发过程中,考虑将eBPF包含在Linux内核中时,eBPF的安全性是最关键的方面。eBPF安全性可通过以下几层来确保:
所需特权
除非启用了非特权eBPF,否则所有打算将eBPF程序加载到Linux内核中的进程都必须在特权模式(root)下运行,或者需要功能CAP_BPF。这意味着不受信任的程序无法加载eBPF程序。
如果启用了非特权eBPF,则非特权进程可以加载某些eBPF程序,但这些程序的功能集有所减少,并且对内核的访问受到限制。
验证者
如果允许进程加载eBPF程序,则所有程序仍将通过eBPF验证程序。eBPF验证程序可确保程序本身的安全。例如,这意味着:
硬化
成功完成验证后,eBPF程序将根据是从特权进程还是非特权进程加载的程序来执行强化过程。此步骤包括:
抽象的运行时上下文
eBPF程序无法直接访问任意内核内存。必须通过eBPF帮助器访问对程序上下文之外的数据和数据结构的访问。这保证了一致的数据访问,并使任何此类访问均受eBPF程序的特权约束,例如,如果可以保证修改的安全性,允许运行的eBPF程序修改某些数据结构的数据。eBPF程序不能随机修改内核中的数据结构。
让我们从一个类比开始。你还记得地理城吗?20年前,网页几乎完全是用静态标记语言(HTML)编写的。网页基本上是一个文档,其中包含能够显示它的应用程序(浏览器)。纵观当今的网页,网页已成为功能完善的应用程序,基于Web的技术已取代了以需要编译的语言编写的绝大多数应用程序。是什么促成了这一发展?
简短的答案是通过引入JavaScript来实现可编程性。它开启了一场巨大的革命,导致浏览器发展成为几乎独立的操作系统。
进化为什么发生?程序员不再局限于运行特定浏览器版本的用户。代替说服标准机构需要新的HTML标签,必需的构建块的可用性使底层浏览器的创新速度与运行在顶部的应用程序脱钩。当然,这有点过分简单了,因为HTML确实随着时间的推移而发展并为成功做出了贡献,但是HTML本身的发展还不够。
在采用此示例并将其应用于eBPF之前,让我们看一下对JavaScript引入至关重要的几个关键方面:
对于上述所有原因,出于相同的原因,可以在eBPF中找到确切的计数器零件。
现在让我们回到eBPF。为了了解eBPF对Linux内核的可编程性影响,有助于对Linux内核的体系结构以及它与应用程序和硬件的交互方式有一个较高的了解。
Linux内核的主要目的是抽象硬件或虚拟硬件,并提供一致的API(系统调用),允许应用程序运行和共享资源。为了实现这一目标,维护了广泛的子系统和层集来分配这些职责。每个子系统通常允许进行某种程度的配置,以解决用户的不同需求。如果无法配置所需的行为,则历史上需要更改内核,剩下两个选择:
本机支持
内核模块
使用eBPF,可以使用一个新选项,该选项允许重新编程Linux内核的行为,而无需更改内核源代码或加载内核模块。在许多方面,这与JavaScript和其他脚本语言如何解锁已变得难以更改或代价昂贵的系统演变非常相似。
存在一些开发工具链来协助eBPF程序的开发和管理。它们都满足用户的不同需求:
BCC是一个框架,使用户可以使用内置的eBPF程序编写python程序。该框架主要针对涉及应用程序和系统分析/跟踪的用例,其中使用eBPF程序收集统计信息或生成事件,而用户空间中的对等方收集数据并以人类可读的形式显示。运行python程序将生成eBPF字节码并将其加载到内核中。
bpftrace是Linux eBPF的高级跟踪语言,在最新的Linux内核(4.x)中可用。bpftrace使用LLVM作为后端将脚本编译为eBPF字节码,并利用BCC与Linux eBPF子系统以及现有的Linux跟踪功能进行交互:内核动态跟踪(kprobes),用户级动态跟踪(uprobes)和跟踪点。bpftrace语言受awk,C和先前的跟踪器(例如DTrace和SystemTap)的启发。
eBPF Go库提供了一个通用的eBPF库,该库将获取eBPF字节码的过程与eBPF程序的加载和管理解耦。通常通过编写高级语言来创建eBPF程序,然后使用clang / LLVM编译器将其编译为eBPF字节码。
eBPF导致了新一代软件的开发,该软件能够对Linux内核的行为进行重新编程,甚至可以跨传统上完全独立的多个子系统应用逻辑。
libbpf库是基于C / C ++的通用eBPF库,它通过将易于使用的库API用于应用程序。
如果您想了解有关eBPF的更多信息,请继续使用以下其他材料进行阅读:
泛型
Cilium
哈勃
要了解有关eBPF及其用例的更多信息:
源码地址:
转载地址:http://lmpaf.baihongyu.com/