颠覆传统、应用大爆发,eBPF何以改变Linux?
eBPF 毫⽆疑问是当下最⽕的技术之⼀。2014 年,eBPF 首次出现在 Linux 内核中。经过社区不断迭代,目前,eBPF 在技术上已经成熟,并在故障诊断、⽹络优化、安全控制、性能监控等领域获得⼤量应⽤,项⽬数量呈爆炸式增⻓。在此前的采访中,有不少受访专家对 InfoQ 表示,eBPF 的发展前景广阔,属于 eBPF 的时代已经来临。
那么,eBPF 技术到底为 Linux 带来了哪些改变?为什么近几年突然爆火?国内外发展和落地情况如何?如何预防和处理 eBPF 带来的安全问题?近期,InfoQ 采访了⻄安邮电⼤学教授、⻰蜥社区 eBPF 技术探索 SIG Owner 陈莉君教授,以期进一步了解 eBPF 技术特性以及应⽤实践。
陈莉君教授:最早可以追溯到 1992 年。在 1992 年 USENIX 会议上,论文“The BSD Packet Filter: A New Architecture for User-level Packet Capture”提出了革命性的包过滤机制 BSD Packet Filter(简称为 BPF),这比当时最先进的数据包过滤技术还快 20 倍。这主要得益于 BPF 的两大设计:第一,内核态引入一个新的虚拟机,所有指令都在内核虚拟机中运行;第二,用户态使用 BPF 字节码来定义过滤表达式,然后传递给内核,由内核虚拟机解释执行。
在 Linux 2.1.75 中,首次引入了 BPF 技术。在 Linux 3.0 中,增加了 BPF 即时编译器,它替换掉了原本性能更差的解释器,进一步优化了 BPF 指令运行的效率。
2014 年,Alexei Starovoitov 将 BPF 扩展为一个通用的虚拟机,也就是 eBPF。eBPF 不仅扩展了寄存器的数量,引入了全新的 BPF 映射存储,还在 4.x 内核中将原本单一的数据包过滤事件逐步扩展到了内核态函数、用户态函数、跟踪点、性能事件(perf_events)以及安全控制等。
eBPF 的诞生是 BPF 技术的一个转折点,使得 BPF 不再仅限于网络栈,而是成为内核的一个顶级子系统。
具体来看,eBPF 有以下几个重要特性:
• 性能优化:eBPF 允许在内核空间运行用户空间代码,它可以实现很多低级别的操作,而且执行速度非常快。
• 安全:它可以限制程序执行的内存和 CPU 资源,防止恶意程序占用系统资源或对系统造成危害。
• 功能丰富:支持网络数据包过滤、路由、负载均衡、跟踪、性能分析等,这使得它能够在很多领域得到应用。
• 开源社区的力量:随着 eBPF 功能的不断扩展,开源社区的开发者和用户也在不断增加,这为 eBPF 的发展创造了很多机会。
陈莉君教授:eBPF 近几年爆火的背后,有以下几个因素助推:
• eBPF 技术本身具有的优越性,能够给内核带来性能提升、扩展性、安全性等。
• 越来越多的 SaaS 平台和应用程序的出现,需要实时监控和调优,而 eBPF 的实时性能分析可以很好的满足此类需求。
• eBPF 提供了一种新的灵活性,可以集中地管理和监控大量服务。这使得系统运维人员更容易应对许多运维问题,而不需要花费大量的时间进行调查和调整。
• eBPF 可以收集、分析、运用巨量数据,为公司提供可视化的监控和预测,这将带来前所未有的管理优势。
• 云计算和容器化计算技术的普及,使得 eBPF 可以与容器技术紧密结合,更方便的收集容器内的性能和状态数据;
• 谷歌和其他巨头公司使用 eBPF 作为它们的跟踪技术和监控解决方案,这给它赋予了更大的价值和关注度。
陈莉君教授:eBPF 在 Linux 中有多项改变,如提高内核灵活性,可以在不需要重新编译内核的情况下实现系统功能的快速修改和扩展;改善安全性,eBPF 应用可以进行精确的安全检查,从而提供更好的内核安全性,以及检测和防止内核攻击;改善性能,eBPF 允许开发者构建内核性能数据采集程序,从而使内核性能数据采集变得更加简单,可用于检测内核性能问题,如异常、调试、性能分析等。
eBPF 是 Linux 内核中软件实现的虚拟机,其工作原理是:用户把 eBPF 程序编译为 eBPF 指令,然后通过 bpf() 系统调用将 eBPF 指令加载到内核的特定挂载点,由特定的事件来触发 eBPF 指令的执行。在挂载 eBPF 指令时内核会进行充分验证,避免 eBPF 代码影响内核的安全和稳定性。另外内核也会进行 JIT 编译,把 eBPF 指令翻译为本地指令,减少性能开销。
内核在网络处理路径上中预置了很多 eBPF 的挂载点,例如 xdp、qdisc、tcp-bpf、socket 等。eBPF 程序可以加载到这些挂载点,并调用内核提供的特定 helper 函数来修改和控制网络报文。eBPF 程序可以通过 map 数据结构来保存和交换数据。
陈莉君教授:eBPF 的性能和稳定性使它成为一种非常强大的内核性能调优工具,它的主要应用场景有:
• 网络跟踪:eBPF 可以让用户在内核中捕获和分析数据包,从而对网络进行性能跟踪。
• 性能监控:eBPF 可以通过实时监控系统性能数据(如 CPU 利用率、内存使用情况等),帮助用户诊断和解决系统问题。
• 系统安全:eBPF 可以用于实现防火墙规则、安全监控等安全功能。
• 资源分配:eBPF 可以用于动态分配系统资源,例如根据网络流量动态调整网络缓冲区大小。
• 网络优化:eBPF 可以用于实现网络优化,例如通过读取 TCP 连接信息来调整 TCP 参数以提高网络性能,还有实现负载均衡、容器网络管理等。
陈莉君教授:在国内外,eBPF 得到了快速发展,尤其是在网络领域,它已经被广泛应用于各种网络设备、操作系统、容器平台、SDN 以及 NFV 等领域。
eBPF 的开源项目,最典型的就是 iovisor 带来的 BCC、bpftrace 等工具,成为 eBPF 在跟踪和诊断领域的最佳实践。Cilium、Katran、Falco 等一系列基于 eBPF 优化网络和安全的开源项目也逐步诞生。最流行的网络解决方案之一 Calico,就在最近的版本中引入了 eBPF 数据面网络,大大提升了网络的性能。
开发者可以重点关注以下开源项目:
• BCC:BCC 是一种开源的 eBPF ⽂件工具集,可以帮助开发者创建、分析和调试系统性能监控工具。BCC 还提供比 Tcpdump 和 iptables 更强大的数据包处理能力。
• Cilium:用于透明地保护容器应用之间的网络连接。Cilium 基于 eBPF 技术开发,因此集成了 eBPF 的大部分特性和优点,提供负载均衡和监控、排障等非常多的功能。
• Falco:可以实现对调用行为的监控,并依赖于强大的规则引擎,对异常的系统调用行为进行告警。
• Coolbpf:以 CO-RE(Compile Once--Run Everywhere)为基础实现,保留了资源占用低、可移植性强等优点,还融合了 BCC 动态编译的特性,适合在生产环境批量部署应用。支持在同一个 eBPF 程序,运行在 5.x、4.x,甚至 3.10 的内核上。
• LMP 项目:LMP(Linux显微镜)基于eBPF探索和孵化更多的创新项目,形成对Linux内核深入探索和细粒度观察,给初学者探索和学习提供一种项目超市。
陈莉君教授:eBPF 技术探索 SIG 致力于深入研究分析 BPF 前沿技术和产学研界发展,增强 Networking、Tracing、Observability、Security 四个纬度技术深度和落地效果,打造国内最有影响力的 BPF 项目和社区。SIG 成立的初衷是推动 eBPF 技术在国内的应用和发展,做国内领先者社区,国际上协同和对标 eBPF 知名社区。通过技术创新和技术合作,降低 eBPF 的学习和使用门槛,为高校师生、eBPF 技术爱好者、Linux 从业者提供工具和平台,打造创新的 eBPF 技术落地到 Linux 内核社区。
eBPF 技术探索 SIG 在以下几方面取得了不错的进展:
• 首届 eBPF 中国研讨会诞生:为广大 eBPF 爱好者提供了交流平台和前沿技术分享机会,各类开源项目集中亮相,为 eBPF 技术在国内的发展提供了无限可能。
• 云栖大会龙蜥操作系统峰会 eBPF 专场活动举行:线下参与技术讨论,助力 eBPF 技术的蓬勃发展。
• 社区项目 Coolbpf 和 Eunomia 的结合,进一步推动低门槛和易部署的 eBPF 技术落地,同时 eBPF 和 WASM 技术的融合成果得到了落地,编写和运行 eBPF 代码将变得轻而易举。
• 提出远程编译和本地编译的容器服务,以及低版本内核支持 eBPF 的能力,让使用者更加专注自身 eBPF 功能开发,不必关注编译和执行环境的复杂性。即将推出轻量级 BPF 字节码生成方式,让 Coolbpf 也支持脚本化的方式运行,却不必安装 LLVM/Clang 编译依赖库。
• Linux 显微镜(LMP)项目在现有基于 eBPF 的 20 多个相关工具基础上,探索和孵化更多的 eBPF 创新项目、相关工具;继续深入产学研融合,进一步完善 ORAS 和 OCI 镜像相关的支持;重构并迁移现有的 eBPF 工具,提供完整的、开箱即用的分析工具组件;在 eBPF 开 发积累的过程中,开发 eBPF 相关通用组件,在进程调度和文件系统方面,落地基于 eBPF 的 Linux 内核微内核化。
陈莉君教授:龙蜥社区 eBPF 技术探索 SIG 将进一步致力于 eBPF 前沿技术的研究,以及把 eBPF 这项技术更多的应用于高校师生、eBPF 技术爱好者,降低学习和入门难度,以及部署的简易化。
• 将 eBPF 与其他技术(如微服务)集成,以便在复杂的应用场景中获得更佳的效果,在可观测领域有更多工具和平台涌现。
• 实现更加高效和简洁的 eBPF 编译器,不需要安装太多的依赖库。针对内核领域,更多功能进行 eBPF 定制,如路由、Netfilter、流量管理等功能。
• 开发一些易于使用的 eBPF 工具,以便用户更好地理解和使用 eBPF 技术。
• WASM 和 eBPF 两个应用生态进一步完美结合。
SIG 将通过双周会的形式,定期和大家汇报 eBPF 领域和 Linux 内核领域当前国内外的研究热点和技术新闻;通过线上线下分享的形式,保持技术领先性和持续关注度;通过线下 Meetup 或者峰会的形式,拉进 SIG 成员的距离,形成良好的共同探讨技术的氛围。
陈莉君教授:eBPF 虽然强大,但不是万能的,同开发普通的应用程序相比,它存在着很多的限制,往往会给开发者带来一定的不便。比如,eBPF 指令集有限,这意味着它没有办法去完成某些复杂的任务,如复杂的字符串处理、循环等;eBPF 栈空间大小有限,而且只有 512 字节,带来了开发上的不便;eBPF 能够调用的函数比较有限,只能调用内核提供的 helper 函数,无法像开发其它应用程序一样任意地调用三方库;eBPF 程序调试功能较弱,导致无法快速定位编写程序时出现的 bug。
陈莉君教授:eBPF 作为内核技术,具有很高的权限和扩展性,因此也需要相应的安全措施。一些常见的安全威胁包括:恶意代码执行,通过构造恶意的 eBPF 程序,可以在内核环境中执行任意代码,这是一个严重的安全问题;数据泄露,不当的 eBPF 程序可能会泄露系统敏感信息,这包括内存中的数据和网络流量;内存损坏:eBPF 程序可以直接访问内存,如果程序不正确,可能导致内存损坏,导致系统崩溃。
为了预防和处理这些威胁,应该采取以下措施:
• 对 eBPF 程序进行审核:在加载 eBPF 程序之前,应该对其进行审核,确保它是安全的。eBPF 的 verifier 一直在做更多的权衡和考虑,对程序进行安全校验。
• 限制 eBPF 程序的权限:应该通过使用 eBPF 的安全模型,限制 eBPF 程序的权限,例如,限制它只能读取特定的数据。
• 使用沙盒技术:使用沙盒技术,隔离 eBPF 程序,防止它对系统造成危害。
• 实施监控:通过实施监控,监测 eBPF 程序的行为。
陈莉君教授:首先要掌握 Linux 系统操作系统知识,再了解 eBPF 的大概原理,它是一种 Linux 内核可扩展性技术,它允许用户探索系统行为,以便在内核中运行自己的程序。此外,还要了解 eBPF 的关键概念,包括 BPF 程序、套接字程序、文件和目录程序、日志程序、安全程序、跟踪程序、XDP 程序,等等。
熟悉 eBPF 的编程语言,eBPF 程序使用 C 来编写(用户空间程序可以采用 Go、Rust 等语言),并且可以通过用户空间库调用它们的特定功能。可以使用 LLVM、clang、gcc 等编译器来编译 eBPF 程序。目前,龙蜥社区推出的 Coolbpf 项目,可以简化这部分的开发工作。
了解 eBPF 调试工具,例如 BCC/bpftrace,Kprobes、bpftool 等,这些工具可以帮助开发者在使用 eBPF 时开发和调试程序。
根据开发者自身的情况,选择合适的 eBPF 程序,然后开始学习并编写自己的 eBPF 程序。此外,还可以查看其他开发者的代码,以便获得更多的灵感。
陈莉君教授:Linux 得以成功,主要得益于其开源自由、社区参与贡献、技术性能与安全性能兼备的特点。此外,Linux 发展在中国也吸引了众多行业领域的参与,形成了一个良好的生态环境,这也是其成功的重要原因。
值得关注的一些 Linux 及 eBPF 动态:
• Linux 支持 eBPF 调度策略的定制。eBPF 调度策略系列补丁将会进一步提升这个功能的稳定性,预计今年会有比较多的实际应用呈现。通过编写 (e)BPF 程序对 Linux 内核的任务调度决策进行定制可以帮助开发人员更快地试验和探索新的调度策略,使得内核的调度策略更贴近实际应用的需要。
• eBPF 社区和 WASM 社区的融合:目前国内有很多项目在做这两个技术的融合,例如 Eunomia 的 wasm-bpf 项目。
• 开源 AI 和机器学习热度继续:更多开源 AI 和机器学习工具和项目的发展,以满足对这些技术的需求。ChatGPT 风靡全球,更多的企业和个人投入到机器学习和人工智能大潮中,加速更多平台和新的项目推出和演进,也将使 Linux 进一步得到加速和深度应用。
• 云原生和可观测技术兴起:云原生技术的发展对 Linux 内核技术和 eBPF 技术具有很大的推动作用,基于 eBPF 的无侵入机制应用在可观测领域,具有非常大的想象空间。
没有 NGINX 和 OpenResty 的未来:Cloudflare 工程师正花费大量时间用 Rust 重构现有功能
开源意味着不问责,我们准备好应对比 Log4Shell 更大的安全危机了吗?|Log4j 一周年特别报道
微信扫码关注该文公众号作者