ebpf执行报错no BTF found for kernel

news2024/10/6 16:19:33

一、现象描述

采用cilium epbf框架开发的ebpf程序无法在系统上正常运行。

curtis@curtis-desktop:~$ cd work/
curtis@curtis-desktop:~/work$ ls
kmodule  vfs_write_moitor
curtis@curtis-desktop:~/work$
curtis@curtis-desktop:~/work$ sudo ./vfs_write_moitor -filename=/mnt/kk -pid=10
[sudo] password for curtis:
2023/06/29 08:12:13 loading objects: field KprobeDoSysOpen: program kprobe_do_sys_open: apply CO-RE relocations: load kernel spec: no BTF found for kernel version 5.15.0-1032-raspi: not supported

二、支持BPF内核选项

CONFIG_BPF=y:启用BPF子系统,允许使用BPF功能。
CONFIG_BPF_SYSCALL=y:启用BPF系统调用,允许用户空间程序通过系统调用与内核交互。
CONFIG_NETFILTER_XT_MATCH_BPF=m:编译为模块的BPF扩展,允许在Netfilter框架中使用BPF进行数据包匹配。
CONFIG_NET_CLS_BPF=m:编译为模块的BPF分类器,允许使用BPF对数据包进行分类和处理。
CONFIG_NET_ACT_BPF=m:编译为模块的BPF动作器,允许使用BPF对数据包进行动作处理。
CONFIG_BPF_JIT=y:启用BPF即时编译器,提高BPF程序的执行效率。
CONFIG_HAVE_BPF_JIT=y:表示系统支持BPF即时编译器。
CONFIG_BPF_EVENTS=y:启用BPF事件通知机制,允许用户空间程序监控和处理BPF相关事件。

三、支持BTF/CO-RE内核选项

CONFIG_DEBUG_INFO_BTF=y

https://www.ebpf.top/post/btf-bpf-type-format/

3.1 BTF(BPF Type Format)

是一种用于描述BPF程序的数据结构格式。BPF是一种在Linux内核中运行的虚拟机,可以用于网络数据包过滤、系统调用跟踪、性能分析等方面。BTF可以帮助开发者更方便地编写BPF程序,因为它提供了一种类型安全的方式来访问内核数据结构。

3.2 CO-RE(Compile Once - Run Everywhere)

CO-RE是一种用于优化BPF程序加载和共享的技术。它可以将BPF程序的字节码和相关的元数据打包成一个可重定位的对象文件,然后在运行时动态加载和共享这个对象文件。这样可以避免重复编译和加载相同的BPF程序,从而提高系统的性能和可维护性。

CO-RE依赖BTF是因为BTF提供了BPF程序的类型信息,这对于CO-RE的优化和动态加载非常重要。CO-RE需要使用BTF来检查BPF程序的类型正确性,以及在运行时动态解析BPF程序的符号和类型信息。因此,BTF是CO-RE的一个重要组成部分。

https://www.ebpf.top/post/btfgen-one-step-closer-to-truly-portable-ebpf-programs/

CO-RE (一次编译 - 到处运行)
CO-RE 机制正是为解决上述问题提出的方案。在该方案中,eBPF 程序一次编译,然后在运行时进行更新(patched):基于运行的机器的内核结构布局更新运行指令。BPF CO-RE (Compile Once - Run Everywhere) 介绍了该技术背后的所有细节。对于本文,需要理解的是 CO-RE 需要有目标内核的 BTF 信息(BPF Type Format 类型格式)。BTF 信息由内核本身提供的,这需要在内核编译时设置 CONFIG_DEBUG_INFO_BTF=y 选项 。该选项在Linux 内核 5.2 中引入的,许多流行的 Linux 发行版在其后的部分内核版本才默认启用。这意味着有很多用户运行的内核并没有导出 BTF 信息,因此不能使用基于 CO-RE 的工具。

四、解决办法

开启对应的内核选项,重新替换内核即可正常运行ebpf程序,编译之前一定要反复确定CONFIG_DEBUG_INFO_BTF选项被打开,可以通过查看.config配置文件。

请添加图片描述
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/698570.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第九十天学习记录:C++核心:函数提高

函数默认参数 在C中,函数的形参列表中的形参是可以有默认值的。 语法:返回值类型 函数名 (参数默认值){} 问:C语言可以在函数的形参赋默认值吗? 答: 在C语言中&#xf…

Unity 之 抖音小游戏本地数据最新存储方法分享

Unity 之 抖音小游戏本地数据最新存储方法分享 一、抖音小游戏文件存储系统背景二、文件存储系统的使用方法2.1 初始化2.1 创建目录2.3 存储数据2.4 删除目录/文件2.5 其他相关操作 三,小结 抖音小游戏是一种基于抖音平台开发的小型游戏,与传统的 APP 不…

Java POI (2)—— Excel文件的上传与导出(实例演示)

一、单文件的上传功能 这里是一个demo的流程图,下面按照这个流程图做了一个简单的实现,有部分判断没有加上,实际操作中,可以根据自己的需求进行增加或者修改。并且此处还是在接受文件传入后将文件进行了下载,保存到本地…

哪个爬虫库用的最多?

在Python中,最常用的爬虫库是requests和BeautifulSoup。requests库用于发送HTTP请求和处理响应,而BeautifulSoup库用于解析HTML文档。这两个库通常结合使用,用于爬取网页内容并提取所需的数据。其他常用的爬虫库还包括Scrapy、Selenium等。 常…

我的创作纪念日(256)

目录 机缘 收获 日常 成就 憧憬 机缘 要说为什么我会选择IT这条路,我觉得是因为从小对电脑的兴趣,从小学2年级开始的电脑生涯,但是那时候也只是玩电脑游戏,而由于我接触电脑较早的缘故,开始有许多的朋友遇到问题…

vue+heatmapjs-vue实现热力图,点击/滑动可以监听并更新

实现效果如下: 点击的次数或者滑动越多,区域的颜色越深 1.下载最新版热力图插件 npm install heatmapjs-vue 2.main.js中全局引用 注意!!!只能全局引用,不能局部引用,局部引用就报错显示不出…

「2024」预备研究生mem-形式逻辑强化:入选名额

一、入选名额 从后往前推 二、课后题

第3章-数组

1. 数组的概述 数组(Array), 是多个相同类型数据按一定顺序排列 的集合, 并使用一个名字命名, 并通过编号的方式 对这些数据进行统一管理数组的常见概念 数组名下标(或索引)元素数组的长度 数组本身是引用数据类型, 而数组中的元…

spring boot admin服务监控报错

使用spring boot admin监控服务启动出现报错:adminHandlerMapping对象创建失败 org.springframework.beans.factory.BeanCreationException: Error creating bean with name adminHandlerMappingdefined in class path resource [de/codecentric/boot/admin/server…

C++Qt 入门

目录 Qt 是什么 Qt 与 Qt Creator 的关系 暗黑主题音乐播放器界面 UI 设计。 简约的视频界面设计。 炫酷车载音乐 APP 主界面开发。 Qt/C与 QML 如何选择 Qt 版本 Linux 下安装 Qt 配置中文输入法 Qt Creator 简单使用 第一个 Qt 程序 新建一个项目 ​编辑 项目文…

Java JDBC

目录 JDBC定义 为什么需要JDBC JDBC的工作原理 JDBC API JDBC编程模板 JDBC编程步骤 JDBC实战 1.JDBC定义 Java连接数据库的一种能力或是技术 2.为什么需要JDBC 总结:利用JDBC才可以使服务器端和数据库进行数据的传递和交互 场景1: 客户端&am…

chatgpt赋能python:Python选择排序算法图解

Python选择排序算法图解 选择排序是计算机科学中经典的排序算法之一,它的原理是从待排序的数据中选择最小的元素然后排在最前面,接着从剩下未排序的数据中继续这个过程,直到所有的数据都排好序。 在本篇文章中,我将深入探讨Pyth…

微服务架构之网关详解

前言 由于互联网的高速发展,网络数据请求数激增,使得服务器承受的压力越来越大。在早期的系统架构中,为减轻单台服务器的压力,通常使用 Load Balancer 来将网络流量平摊到多个服务器中。如今后端服务的种类和数量在不断变多&…

Django DRF - 【Token】认证基本使用

一. 前言 Django Rest Framework Token是Django Rest Framework中的一个扩展,用于实现用户认证和授权。它为每个用户生成一个唯一的Token,并将其存储在数据库中。在用户进行API请求时,用户需要在请求的HTTP Header中包含Token,这…

【广州华锐互动】机械设备事故VR模拟体验系统

随着虚拟现实技术的不断发展,越来越多的行业开始尝试将VR技术应用到实际场景中,以提供更加真实的体验。其中,机械伤害事故VR警示教育系统的出现,为机械工程师、安全培训人员等行业提供了一种全新的培训方式。在实现上,…

odoo16 中ondelete的用法

odoo 中的many2one类型字段有 ondelete设置,对应数据表中关系处理 a fields.Many2one(‘b’, string‘b’, ondelete‘set null’) 则当对模型b进行delete操作时,会引发如下操作 set null: 当b中删除记录时,modelA中相关记录的anull casc…

Redis实战案例8-缓存击穿及其解决方案和案例说明

1. 缓存击穿 缓存击穿是指一个被频繁访问(高并发访问并且缓存重建业务较复杂)的缓存键因为过期失效,同时又有大量并发请求访问此键,导致请求直接落到数据库或后端服务上,增加了系统的负载并可能导致系统崩溃 常见的解决…

开源虚拟化工具VirtualBox安装部署

什么是Virtualbox VirtualBox是一款由Oracle开发和维护的免费开源虚拟化软件,用于在一台计算机上创建和管理多个虚拟机。它允许用户在单个物理计算机上运行多个操作系统,例如Windows、Linux、macOS等。VirtualBox提供了一个虚拟化环境,使用户…

详细介绍如何使用 OpenCV 实现自动文档扫描仪--附实现源码

文末附相关源代码实现的免费下载链接 文档扫描是将物理文档转换为数字形式的过程。可以通过扫描仪或手机摄像头拍摄图像来完成。我们将在本教程中讨论如何使用计算机视觉和图像处理技术有效地实现这一目标。 在当今的计算机时代,几乎不需要任何物理文书工作。尽管如此,在仍…

现代操作系统第一章学习笔记

先附上一个原版的课后习题答案的链接。 课后习题答案 1.1 什么是操作系统 操作系统:他的任务是为应用程序提供一个更好、更简单、更清晰的计算机模型,并管理贮存、磁盘等所有设备。 计算机系统总的来说分为软件和硬件,如下图所示。多数计算…