自学内容网 自学内容网

BPF CO-RE(一)——BPF可移植性问题

本文介绍BPF CO-RE应用背景中的BPF可移植性问题。裁剪翻译自https://nakryiko.com/posts/bpf-portability-and-co-re/#bpf-state-of-the-art的对应小节。个人翻译,水平有限,如有错漏或想要交流的问题,欢迎评论。

BPF可移植性(portability):编写一个能够成功编译、经过内核验证并将在不同内核版本上运行而无须重新编译的能力。

一个BPF程序是一块用户提供的会直接插入内核的代码。一旦完成加载和验证,BPF程序将于内核上下文中运行。这些程序在内核内存空间操作,拥有对所有可用的内部内核状态的权限。

这使得BPF具备很强的能力,但也导致了可移植性问题:BPF技术不控制周围内核环境的内存布局,其需要与独立开发、编译并部署的内核一同工作。

此外,内核类型和数据结构随内核版本不断变化。

如今能够在如此多变的内核环境中使用BPF进行有用工作的原因部分在于并非所有BPF程序需要查看内部内核数据结构。内核内部的BPF机制提供了有限数量的能使BPF程序可以在不同内核版本间依赖的“稳定接口”,这些接口在用户程序侧抽象其内部结构和机制的改变,从而对用户表现为稳定的。

例如,对网络应用,通常查看有限数量的sk_buff属性就足以充分可用且通用。对此,BPF验证器提供一个稳定的__sk_buff“视角”,为BPF程序屏蔽了变化的struct sk_buff布局(layout)。所有__sk_buff字段方位被隐形重写为对真正的sk_buff的访问(有时相当复杂——需要进行一系列内部指针追踪,最终才能找到需要的字段)。

相似的机制可见于一系列不同的BPF程序类型。它们是作为BPF验证器理解的程序类型专有(type-specific)上下文完成的。

但是一旦需要查看任何原生(raw)内部内核数据(例如,非常常见的struct task_struct,其代表一个进程/线程,并包含进程信息),则无法缺乏上述接口。

在这种情况下,很可能读取到非预期数据。可能的情况有:

  • 如果内核在预期字段前加入额外字段,导致实际字段偏移量与预期不一致;
  • 一个字段被重命名(即thread_structfs字段的情况,其在4.6和4.7内核被重命名为fsbase);
  • 在内核的两个不同配置上运行BPF程序,一个关闭了一些专有特性并完全未编译(compile out)部分结构,常见的例子是审计字段(accounting field),其为可选,但如果存在会很有用。

以上均意味着不能使用设备服务器的内核头文件来本地编译BPF程序再将其以编译形式发布到其他系统,因为不同内核版本的内核头文件将会指定(specify)程序依赖的数据的不同内存布局。

目前为止,通常依赖BCC(BPF Compiler Conllection)来解决这个问题。借助BCC,可将BPF程序C源码作为纯字符串(plain string)嵌入用户空间程序(控制应用)。当控制程序被部署并运行在目标主机上时,BCC调用其内嵌的Clang/LLVM,放入本地内核包(需要确保从正确的kernel-devel包中安装到系统上),并进行实时编译。这能够确保BPF程序预期的内存布局时与目标主机的内核完全一致。如果要处理一些可选且可能在内核上compile-out的东西,仅需在源码中使用#ifdef/#else保护,从而处理重命名字段、变量的不同语义、或在当前配置中不可获取的可选的东西(optional stuff)。内嵌的Clang将会删除代码中的不相关的部分,并在具体内核中定制化BPF程序代码。

虽然此工作流程有效,但其有重大缺陷:

  • Clang/LLVM组合是一个巨大的库,导致需要与应用一同发布的巨大二进制文件;
  • Clang/LLVM组合会占据大量资源(resource-heavy),当编译BPF代码时,将占据大量资源,可能颠覆精心平衡的工作负载。反之,在一个繁忙的主机上,编译一个BPF程序可能需要数分钟;
  • 需要目标系统存在内核头文件,少数情况下这构成问题,尤其对于内核开发者来说是个麻烦的要求,因为他们经常需要构建并部署一次性内核作为开发过程的一部分。而在没有定制化构建的内核头文件的情况下,没有基于BCC的应用能够在这种内核上运行,使得开发者少了一系列有用的可以调试和监视的工具;
  • BPF程序测试和开发迭代十分痛苦,最轻微的编译错误也只能在运行时发现。

综上,虽然BCC是个很好的工具,尤其是针对快速原型设计、实验和小工具,但它在广泛用于BPF应用开发上具有很多缺陷。

而 BPF CO-RE 正在加强 BPF 可移植性,并且可以说是 BPF 程序开发的未来,特别是对于复杂的现实世界 BPF 应用程序。


原文地址:https://blog.csdn.net/m0_61797126/article/details/145223507

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!