操作系统的内核功能强大,它具有监督和控制整个系统的特权,通过软件方式,操作系统是实现观察性、安全性与网络功能的理想场所,但在操作系统的内核中进行任何修改,都会带来安全风险或性能损失,并会破坏原有软件对操作系统版本和模块的依赖关系。
能否实现操作系统可编程性,允许额外代码在不更改操作系统内核源代码的情况下运行,或在新模块中创建不需要的依赖项?
eBPF实现了这一点,它在操作系统中运行沙箱程序,可以方便地在不重建内核或加载内核模块的同时,实现网络、安全、应用程序分析/跟踪和性能故障排除等功能。由此,诞生了一波基于eBPF 的项目,包括下一代网络、可观察性和安全功能。
微软的新项目“eBPF for Windows”就是其中之一的开源项目。它面向 Windows 10 和 Windows Server 2016(及更高版本),旨在允许开发人员在现有 Windows 版本之上使用熟悉的 eBPF 工具链和应用程序编程接口 (API)。
什么是 eBPF?
Linux 将其内存分为两个不同的区域:内核空间和用户空间。内核空间是操作系统核心所在的地方,它可以完全不受限制地访问所有硬件——内存、存储、CPU 等。由于内核访问的特权性质,内核空间受到保护,只允许运行最受信任的代码,包括内核本身和各种设备驱动程序。
用户空间是任何非内核进程运行的地方,例如常规应用程序。用户空间代码对硬件的访问受到限制,并且依赖于在内核空间中运行的代码来进行特权操作,例如磁盘或网络 I/O。例如,要发送一个网络数据包,用户空间应用程序必须通过称为“系统调用”的内核 API 与内核空间网卡驱动程序对话。
由于内核具有监督和控制整个系统的特权,操作系统一直是实现可观察性、安全性和网络功能的理想场所。同时,操作系统内核由于其核心作用和对稳定性和安全性的高要求,难以演进。因此,与在操作系统之外实现的功能相比,操作系统级别的创新率传统上较低。
Linux内核4的发布提供了一种新的方法,称为eBPF技术。
eBPF下,内核包含了一个沙箱环境,可以让BPF字节码运行,这可以影响内核并使用内核资源——但实际上不会改变内核本身。
简化的 eBPF 架构
eBPF 与 Linux 内核的关系可以看作 JavaScript 与网页的关系:把HTML看作操作系统的内核,把网站看作产生的服务和行为。众所周知,HTML是静态的,但JavaScript的添加为网站带来了可编程性和灵活性——类似于eBPF为Linux内核带来可编程性的方式。
eBPF程序被加载到Linux环境中,并使用特定的触发器事件,称为hook。hook包括网络事件实例、内核跟踪点和内核函数。当遇到hook时,相应的eBPF代码被编译、验证和执行。
在加载到内核之前,eBPF 程序必须通过一组特定的检查。验证涉及在虚拟机中执行 eBPF 程序,这样做允许具有 10,000 多行代码的验证器执行一系列检查。验证器将遍历 eBPF 程序在内核中执行时可能采用的潜在路径,确保程序确实运行完成而没有任何循环。
最终,eBPF让程序员可以在 Linux 内核中安全地执行自定义字节码,而无需修改或添加内核源代码。eBPF 程序引入了自定义代码来与受保护的硬件资源交互,对内核的风险最小。
使用 eBPF,内核及其行为变得高度可定制,而不是固定的。
eBPF for Windows
去年,微软宣布了一个新的开源项目,简称为“eBPF for Windows”,将eBPF 引入Windows 10 和 Windows Server 2016,以及以后的版本,以支持拒绝服务保护和可观察性等用例。
让Linux 特性在 Windows上应用,这件事本身就值得关注。更重要的是,在过去的几年中,eBPF为Linux内核带来了新的可编程性。这也让业界对于这个新的开源项目十分感兴趣,这个新项目可以做些什么?当前的生态系统在eBPF开始向Windows发展的过程中又会如何演变?
eBPF 是为在 Windows 上运行而不是作为 Windows 的一部分而构建的,这意味着它将在现有版本的 Windows 上运行,而不需要对操作系统进行更新。
“对于已经在 Linux 上使用 eBPF 的开发人员,在 Windows 上使用 eBPF 以使相同类型的解决方案能够在两个平台上工作是很有吸引力的。即使对于那些只使用 Windows 的人,我们相信 eBPF 的可编程性、可扩展性和敏捷性优势将向更广泛的受众开放。”
SONiC 创始人兼 Azure 网络工程负责人Dave Maltz表示:“微软一直在投资 eBPF 的原因之一是,我们看到了让数据平面本身可编程和由软件控制的重要性。”
eBPF允许网络操作系统使用公共 API 来提供功能;提供该 API 的代码可以改进,但依赖它的代码在发生这种情况时不必更新,这使得网络堆栈有了更多的创新。分解网络堆栈意味着网络架构师可以选择他们想要运行的协议,并只使用所需的软件模块。
DASH(SONiC 主机的分布式 API)是一个网络项目,用于SDN数据平面,利用SmartNIC和其他硬件,通过在网络本身做更多工作(如加密或密钥管理),以合并计算和网络的方式,来提高云服务的网络性能。
“我们需要公开更高级别的 API 来控制该 SDN 数据路径,而 eBPF 是实现这一点的好方法,”Maltz 说。
eBPF -for-windows 项目架构概述
如图所示,现有的eBPF工具链(如clang)可以用于从各种语言的源代码生成eBPF字节码。生成的字节码可以被任何应用程序使用,也可以通过Windows netsh命令行工具手动使用,这两个工具都使用一个公开Libbpf API的共享库,不过这项工作仍在进行中。
该库将 eBPF 字节码发送给静态验证器,该验证器托管在一个用户模式保护进程中,这是一个 Windows 安全环境,允许内核组件由它信任的密钥签名的用户模式守护进程。如果字节码通过了验证器的所有安全检查,字节码就可以加载到运行在Windows内核模式执行上下文中的 uBPF解释器中,或者由 uBPF 即时 (JIT) 编译器编译并将本地代码加载到内核模式执行上下文。
安装到内核模式执行上下文中的 eBPF 程序可以附加到各种hook以处理事件,并调用 eBPF shim 公开的各种帮助程序 API,它在内部包装公共 Windows 内核 API,允许在现有版本的 Windows 上使用 eBPF。到目前为止,已经添加了两个hook(XDP 和套接字绑定),预计随着时间的推移,微软会添加更多的hook和helper。
“eBPF for Windows”项目仍处于起步阶段,长期目标是“将 eBPF 的力量带给 Windows 用户”,经过未来的发展,在理想情况下,大多数的 eBPF 程序在 Linux 和 Windows 上的行为方式相同。
当该项目成熟时,它将转移到eBPF 基金会。2021 年 8 月,Facebook、谷歌、Isovalent、微软和 Netflix 宣布成立eBPF 基金会。
该基金会以帮助支持该技术的发展,并促进许多正在发展的基于 eBPF 的开源项目之间的协作。
eBPF 的应用与挑战
近年来,基于 eBPF 的项目数量呈爆炸式增长,eBPF 也被广泛用于驱动各种各样的用例:在现代数据中心和云原生环境中提供高性能网络和负载平衡,以低开销提取细粒度的安全可观察性数据,帮助应用程序开发人员跟踪应用程序,为性能故障排除、预防性应用程序和容器运行时安全实施等提供见解。
另外,eBPF 很快就进入了大型数据中心的基础设施软件层,例如,Facebook 发布了基于 eBPF 的负载均衡器Katran,它已经为 Facebook 数据中心提供了几年的支持。
尽管 eBPF 是适应 Linux 内核的一种强大而有效的手段,但 eBPF 平台可能会给开发人员带来一定风险。eBPF 并不适合每个项目或情况。例如,eBPF 仅适用于最新的 Linux 内核,因此代码不容易移植到其他操作系统或项目。
此外,保护 eBPF 程序执行的安全特性也在一定程度上限制了 eBPF 的功能。
为了大家能够进一步探索论证开源的创新模式、协作模式、商业模式,我们将在5月24-26日举办2022网络开源技术生态线上峰会, “足不出户”尽享网络开源技术大咖带来的精彩分享。
参考文献:
https://www.techtarget.com/searchitoperations/tip/An-introduction-to-eBPF-and-where-it-shines
https://www.infoq.com/articles/gentle-linux-ebpf-introduction/
https://isovalent.com/blog/post/2021-08-ebpf-foundation-announcement
【活动专栏】
【转载须知】
若转载文章为原创文章,可在相应文章下或公众号后台留言;其他非转载类文章须在文首以不小于14号字体标明转载自SDNLAB。
【投稿】
欢迎SDN、NFV、边缘计算、SD-WAN、智能网卡、TSN、5G 网络切片等网络方向的观点类、新闻类、技术类稿件。
联系人:kk__wu(微信号)
投稿邮箱:pub@sdnlab.com
详情请参考:SDNLAB原创文章奖励计划