ANCK(Alibaba Cloud Linux Kernel)是阿里云优化的Linux内核版本。本文将介绍如何正确使用ANCK的eBPF的特性。
背景信息
eBPF(extended Berkeley Packet Filter)因其安全可编程的特性而广泛应用于网络、追踪和诊断等领域,其所支持的功能与内核版本密切相关。一些用户或社区组件可能习惯于使用内核版本号来判断目标内核是否具备某些特定的eBPF能力,然而,这种做法在ANCK中是不被推荐的,因为ANCK对基于上游社区发布的标准内核在功能上做了增强。例如5.10.134-17版本是基于稳定社区的5.10.134内核进行开发的,但会持续为其添加新功能。因此,ANCK包含了以下内容:
- 上游社区5.10内核中所有的eBPF功能。 
- 上游社区在后续的5.11及更高版本,以及 - 6.x系列内核中引入新功能(例如新的- bpf prog类型、- helper函数等)。
- 重要的安全补丁(CVE)和错误修复( - bugfix)。
- 性能优化和增强等。 
正确使用eBPF特性
查看ANCK内核支持的eBPF功能
- (推荐)查看官方说明 - 您可以在ANCK的ReleaseNotes中查看不同版本对应的eBPF特性。 
- bpftool工具探测 - (可选)执行以下命令,安装 - bpftool工具。- sudo yum install bpftool
- 您可以从不同维度选择以下命令以检测运行环境。 - 执行以下命令,查看精确的内核版本。 - uname -r
- 执行以下命令,探测eBPF功能的支持情况。 - sudo bpftool feature probe
- 执行以下命令,查看内核的BTF信息。 - bpftool btf dump file /sys/kernel/btf/vmlinux
 
 
- 手动测试法 - 若希望确认某一具体功能的可用性,可以编写一个最小化的单元测试程序,以自测该程序是否能够通过内核 - verifier的验证,顺利加载并运行。
规范编写代码
长期维护
- 持续关注ANCK的ReleaseNotes。 
- 建立测试环境和机制,在新内核发布后第一时间运行测试用例套件。 
- 使用eBPF CO-RE及BTF符号检测来提升兼容性。 
可能遇到的问题
场景一:正常加载的程序突然加载失败
问题现象
程序加载过程报错信息如下所示。
libbpf: prog 'xxx': BPF program load failed: xxx
libbpf: prog 'xxx': -- BEGIN PROG LOAD LOG --
  [verifier output ...]
-- END PROG LOAD LOG --问题原因
新版本的ANCK提高了verifier对BPF程序的安全要求。
- 代码中使用了有安全隐患的操作。 
- 上游社区调整了某些操作的行为规范,标记为不再安全或合法。 - 例如上游社区的bpf: Allow delete from sockmap/sockhash only if update is allowed补丁缩小了使用 - bpf_map_delete_elem()的适用范围。由于某些场景现在被视为不安全,因此在新内核中,之前能够调用该- helper函数的eBPF程序可能会被拒绝。
解决方案
在最新的上游Linux内核中测试您的程序。
- 如果上游内核也报错,您可以检查并修改程序代码。 
- 如果上游内核正常,请联系我们反馈问题。 
场景二:功能支持情况混乱
问题现象
其他Linux发行版的5.10内核不支持某些功能,但ANCK 5.10能正常使用。
问题原因
不同社区和发行版对5.10内核的支持存在差异。通常,它们均支持上游5.10及之前版本的eBPF特性,而5.11及之后的特性需视具体情况评估。
相关文档
eBPF特性与上游内核版本号的关联:BPF Features by Linux Kernel Version。