当前位置: 首页 > article >正文

在 Kata Containers 中编译支持 eBPF 的 Guest Kernel 并验证生效

此前在 8 月份因项目需求我对 Kata 容器进行了调研并在 CentOS 上部署了单机版 Kata 环境。当时受限于进度仅完成基础环境搭建。近期我重新开始探索 eBPF 在 Kata 容器中的支持与适配情况于是有了这篇文章。后续我还会输出 Kata 容器在 K8s 中的完整部署指南敬请关注。1. 背景Kata Containers 与普通容器运行时不同。普通容器直接共享宿主机内核而 Kata Containers 中的工作负载运行在独立的轻量虚拟机内因此实际使用的是Guest Kernel而不是宿主机内核。这意味着仅在宿主机启用 eBPF 相关配置并不能自动让 Kata 容器具备 eBPF 能力。若需要在 Kata 容器内部使用 eBPF必须为 Kata 使用的Guest Kernel启用 eBPF、Tracing、BTF 等相关内核配置。本文档记录了完整的操作流程包括编译支持 eBPF 的 Kata Guest Kernel安装编译产物将实际运行中的 Kata Runtime 切换到新内核在 Kata 容器内验证 eBPF 能力是否可用2. 目标本文档的目标是完成以下工作基于 Kata 官方构建脚本准备 Guest Kernel 源码修改 Guest Kernel 配置启用 eBPF 相关能力编译并安装新的 Guest Kernel让当前 Kata Runtime 使用新的 Guest Kernel启动 Kata 容器并确认Guest Kernel 已切换为新版本eBPF 关键能力已经启用BTF、tracefs、bpffs 等运行时接口可用3. 环境说明本次排查过程中发现系统中同时存在两套 Kata 相关路径编译安装输出路径/usr/share/kata-containers/实际运行中的 Kata 路径/opt/kata/实际运行时使用的是/opt/kata/...这套 Kata 资产而不是/usr/share/kata-containers/...。关键路径如下Kata shim:/opt/kata/bin/containerd-shim-kata-v2Kata 配置文件:/opt/kata/share/defaults/kata-containers/configuration-qemu.toml运行时使用的 Guest Kernel 配置项:kernel /opt/kata/share/kata-containers/vmlinux.container这也是为什么仅执行build-kernel.sh install后虽然新内核已经安装到/usr/share/kata-containers/但 Kata 容器内部仍然使用旧 Guest Kernel 的原因。4. 前提条件在开始前需要满足以下条件已安装 Kata Containers已安装 containerd系统可以正常使用ctr启动 Kata 容器具备 root 或 sudo 权限系统能够获取 Kata 源码系统具备内核编译环境5. 获取 Kata 源码执行以下命令获取源码并进入内核构建目录git clone https://github.com/kata-containers/kata-containers.git cd kata-containers/tools/packaging/kernel目录结构示例ls输出6. 安装并配置yq在执行build-kernel.sh setup时脚本会依赖yq。如果未安装会报错ERROR: yq command is not in your $PATH6.1 安装yq将预先下载好的yq二进制安装到系统 PATHsudo mv ~/yq_linux_amd64 /usr/local/bin/yq sudo chmod x /usr/local/bin/yq yq --version6.2 处理sudo环境无法找到yq在本次环境中发现普通用户可以通过/usr/local/bin/yq找到yq但sudo环境的 PATH 中不包含/usr/local/bin验证命令如下which yqsudo which yq如果输出类似/usr/local/bin/yqwhich: no yq in (/sbin:/bin:/usr/sbin:/usr/bin)则需要将其复制到/usr/binsudo cp /usr/local/bin/yq /usr/bin/yqsudo chmod x /usr/bin/yqsudo /usr/bin/yq --version7. 准备 Guest Kernel 源码执行cd ~/kata-containers/tools/packaging/kernel ./build-kernel.sh setup成功后会输出类似信息Kernel source ready: /home/zain/kata-containers/tools/packaging/kernel/kata-linux-6.18.15-185这表示 Guest Kernel 源码已经准备完成本次实际目录为~/kata-containers/tools/packaging/kernel/kata-linux-6.18.15-1858. 修改 Guest Kernel 配置以启用 eBPF进入源码目录并备份原始配置cd ~/kata-containers/tools/packaging/kernel/kata-linux-6.18.15-185 cp .config .config.bak8.1 追加 eBPF 相关配置将以下配置追加到.configcat .config EOF CONFIG_BPFy CONFIG_BPF_SYSCALLy CONFIG_BPF_JITy CONFIG_BPF_JIT_ALWAYS_ONy CONFIG_BPF_EVENTSy CONFIG_CGROUP_BPFy CONFIG_KPROBESy CONFIG_KPROBE_EVENTSy CONFIG_UPROBESy CONFIG_UPROBE_EVENTSy CONFIG_TRACINGy CONFIG_FTRACEy CONFIG_FUNCTION_TRACERy CONFIG_FUNCTION_GRAPH_TRACERy CONFIG_KALLSYMSy CONFIG_KALLSYMS_ALLy CONFIG_DEBUG_INFOy CONFIG_DEBUG_INFO_DWARF5y CONFIG_DEBUG_INFO_BTFy CONFIG_IKCONFIGy CONFIG_IKCONFIG_PROCy CONFIG_BPF_LSMy CONFIG_BPF_PRELOADy CONFIG_NET_CLS_BPFy CONFIG_NET_ACT_BPFy CONFIG_BPF_STREAM_PARSERy EOF然后执行make olddefconfig8.2 关于override: reassigning to symbol ...警告执行make olddefconfig时可能会看到如下提示.config:3486:warning: override: reassigning to symbol BPF ... # configuration written to .config这是正常现象不表示失败。其含义是某些配置项原本已经存在于.config本次又追加了一次make olddefconfig会采用最新值并重新生成配置文件只要最后看到# configuration written to .config即可认为配置写入成功。9. 检查关键配置项执行以下命令检查grep -E CONFIG_(BPF|BTF|FTRACE|KPROBE|UPROBE|IKCONFIG|TRACING|KALLSYMS|DEBUG_INFO) .config本次确认生效的关键配置包括CONFIG_BPFy CONFIG_BPF_SYSCALLy CONFIG_KPROBESy CONFIG_UPROBESy CONFIG_DEBUG_INFO_BTFy CONFIG_TRACINGy CONFIG_FTRACEy CONFIG_KPROBE_EVENTSy CONFIG_UPROBE_EVENTSy CONFIG_BPF_EVENTSy这些配置表明eBPF 核心能力已启用kprobe / tracing 所需能力已启用BTF 已启用可支持现代 libbpf/CO-RE 场景10. 编译 Guest Kernel返回打包目录并执行编译cd ~/kata-containers/tools/packaging/kernel ./build-kernel.sh build如果编译成功最后会看到类似输出BUILD arch/x86/boot/bzImage Kernel: arch/x86/boot/bzImage is ready (#1)11. 安装 Guest Kernel执行安装sudo ./build-kernel.sh install安装成功后会输出类似内容INFO: Config version: 185 INFO: Kernel version: 6.18.15 lrwxrwxrwx. 1 root root 19 ... /usr/share/kata-containers/vmlinux.container - vmlinux-6.18.15-185 lrwxrwxrwx. 1 root root 19 ... /usr/share/kata-containers/vmlinuz.container - vmlinuz-6.18.15-185说明编译产物已经安装到/usr/share/kata-containers/vmlinux-6.18.15-185/usr/share/kata-containers/vmlinuz-6.18.15-185/usr/share/kata-containers/config-6.18.15-185但此时还需要额外处理因为当前运行中的 Kata 使用的是/opt/kata/...路径而不是/usr/share/kata-containers/...。12. 确认实际运行中的 Kata 配置为了定位当前 Kata 实际使用的 Guest Kernel检查配置文件grep -nE path|kernel|image|initrd /opt/kata/share/defaults/kata-containers/configuration-qemu.toml本次环境中的关键配置为15:path /opt/kata/bin/qemu-system-x86_64 16:kernel /opt/kata/share/kata-containers/vmlinux.container 17:image /opt/kata/share/kata-containers/kata-containers.img说明当前 Kata 实际使用的是kernel /opt/kata/share/kata-containers/vmlinux.container因此必须将新编译好的 Guest Kernel 复制到/opt/kata/share/kata-containers/并更新符号链接。13. 将新内核同步到实际运行路径执行sudo cp /usr/share/kata-containers/vmlinux-6.18.15-185 /opt/kata/share/kata-containers/ sudo cp /usr/share/kata-containers/vmlinuz-6.18.15-185 /opt/kata/share/kata-containers/ sudo cp /usr/share/kata-containers/config-6.18.15-185 /opt/kata/share/kata-containers/更新默认符号链接sudo ln -sf vmlinux-6.18.15-185 /opt/kata/share/kata-containers/vmlinux.container sudo ln -sf vmlinuz-6.18.15-185 /opt/kata/share/kata-containers/vmlinuz.container可使用以下命令检查ls -l /opt/kata/share/kata-containers/vmlinux.container ls -l /opt/kata/share/kata-containers/vmlinuz.container readlink -f /opt/kata/share/kata-containers/vmlinux.container14. 重启 containerd使 containerd 和 Kata Runtime 重新加载配置sudo systemctl restart containerd15. 启动 Kata 容器验证 Guest Kernel 是否生效本次环境中本地已有镜像quay.io/libpod/ubuntu:latest因此直接使用该镜像启动 Kata 容器sudo ctr run --runtime io.containerd.kata.v2 --rm -t quay.io/libpod/ubuntu:latest kata-ebpf bash进入容器后执行uname -r若输出仍为旧版本例如6.12.47说明当前 Kata 运行时仍未切换到新 Guest Kernel需要回头检查/opt/kata/share/defaults/kata-containers/configuration-qemu.toml/opt/kata/share/kata-containers/vmlinux.containercontainerd 是否已经重启16. 验证 Guest Kernel 是否具备 eBPF 能力在 Kata 容器内部执行以下检查。16.1 检查内核配置zgrep -E CONFIG_(BPF|BPF_SYSCALL|BPF_EVENTS|KPROBES|KPROBE_EVENTS|TRACING|FTRACE|DEBUG_INFO_BTF|UPROBES|UPROBE_EVENTS) /proc/config.gz本次验证输出为CONFIG_BPFy CONFIG_BPF_SYSCALLy CONFIG_KPROBESy CONFIG_UPROBESy CONFIG_DEBUG_INFO_BTFy CONFIG_TRACINGy CONFIG_FTRACEy CONFIG_KPROBE_EVENTSy CONFIG_UPROBE_EVENTSy CONFIG_BPF_EVENTSy说明eBPF 核心功能已开启tracing / kprobe 相关能力已开启BTF 已启用16.2 检查运行时文件系统和 BTF 接口ls -ld /sys/fs/bpf ls -ld /sys/kernel/tracing ls -l /sys/kernel/btf/vmlinux本次验证结果表明/sys/fs/bpf存在/sys/kernel/tracing存在/sys/kernel/btf/vmlinux存在这意味着bpffs 可用tracing/tracefs 可用BTF 可用17. 结果判定满足以下条件时可以认为 Kata Guest Kernel 已具备可用的 eBPF 基础能力uname -r显示为新编译安装的 Guest Kernel 版本CONFIG_BPFyCONFIG_BPF_SYSCALLyCONFIG_KPROBESyCONFIG_KPROBE_EVENTSyCONFIG_TRACINGyCONFIG_FTRACEyCONFIG_DEBUG_INFO_BTFy/sys/fs/bpf存在/sys/kernel/tracing存在/sys/kernel/btf/vmlinux存在本次验证结果表明上述条件均已满足因此可以得出结论当前 Kata Guest 已具备可用的 eBPF 基础能力。18. 常见问题18.1build-kernel.sh setup提示yq command is not in your $PATH原因是系统中未安装yq或者sudo环境的 PATH 中不包含yq所在目录。处理方式安装yq如有必要将yq复制到/usr/bin18.2 安装完新内核后Kata 容器内仍然是旧 Guest Kernel常见原因是新内核只安装到了/usr/share/kata-containers/但实际运行中的 Kata 使用的是/opt/kata/...路径需要确认实际配置文件中的kernel ...指向哪个路径并将新内核同步到该路径。18.3 为什么修改宿主机内核配置没有用因为 Kata 容器运行在 Guest VM 内部实际使用的是 Guest Kernel而不是宿主机内核。 因此必须修改 Kata Guest Kernel 配置而不是仅修改宿主机内核。19. 关键经验总结19.1 必须确认“实际运行中的 Kata 路径”不要默认认为运行时一定使用/usr/share/kata-containers/。 不同安装方式可能使用不同的目录例如本次环境中实际使用的是/opt/kata/...。19.2 要以 Guest 内验证为准真正判断是否成功不能只看宿主机上的文件或符号链接而应以 Kata 容器内部的结果为准例如uname -r zgrep ... /proc/config.gz ls /sys/fs/bpf ls /sys/kernel/tracing ls /sys/kernel/btf/vmlinux19.3 eBPF 能力是 Guest Kernel 的能力在 Kata 场景下eBPF 能否使用取决于 Guest Kernel 的配置和运行时接口是否可用。19.4 发现tracing 和 bpf下面没有文件 可能无法运行ebpf去查看了下 /sys/fs/bpf /sys/kernel/tracing发现没有对应的文件在目录下初步判定了下可能是启动kata容器时没有给出高特权具体解决方法和ebpf的运行指南在下一篇给出答案。

相关文章:

在 Kata Containers 中编译支持 eBPF 的 Guest Kernel 并验证生效

此前在 8 月份因项目需求,我对 Kata 容器进行了调研,并在 CentOS 上部署了单机版 Kata 环境。当时受限于进度,仅完成基础环境搭建。近期我重新开始探索 eBPF 在 Kata 容器中的支持与适配情况,于是有了这篇文章。后续我还会输出 Ka…...

51单片机驱动共阴极数码管显示0~9

文章目录 概要 硬件设计 软件设计 编译下载 小结 概要 项目采用共阴极单支数码管作为显示器件,通过单片机I/O口输出段选信号控制数码管段亮灭,配合延时函数实现数字0~9每隔1秒自动加1,并循环往复显示的功能。 硬件设计 1. 核心器件 …...

模拟1688商品详情的Python API实现,返回符合风格的JSON数据

该文件包含两个模拟商品数据,结构完整覆盖以下核心字段:商品基础信息:商品ID、标题、价格(含原价与现价)、库存量商品描述:富文本描述内容视觉展示:多图链接列表(主图详情图&#xf…...

Google Banana pro 画卡通信息图

提示词:[System / Prompt]You are an illustration assistant specialized in creating hand-drawn cartoon-style infographics. Follow all rules below strictly and without deviation.🎨 STYLE RULES(风格规则)Use a pure ha…...

算力焦虑终结?揭秘GPU云服务器的民主化之路

从算力焦虑到算力民主:一份GPU云服务器的深度观察 在大模型参数规模朝着万亿单位迈进之时,于文生视频应用在短短几秒内所消耗的算力等同于传统应用数月用量之际,一个无法争议的事实呈现眼前:算力,特别是 GPU 算力&…...

Spring AI + RAG + 向量库 10 道模拟面试

文章目录1. 什么是 Spring AI?它解决什么问题?2. Spring AI 的核心组件有哪些?3. Spring AI 和 LangChain 的区别?4. 什么是 RAG?为什么要用 RAG?5. RAG 的完整流程是什么?6. 为什么要用向量数据…...

Obsidian笔记记录与Gitee云存储

Obsidian下载 首先下载ObsidianObsidian - 磨砺你的思维,下载完成后打开会弹出本地仓库创建的提示 每个仓库都是一个相对独立的空间,我们的笔记和插件都存放在里面,如核心插件的插入模板的模板文件夹和第三方插件都是各仓库独立,…...

Dev-C++中项目类型如何选择?

在Dev-C中选择项目类型时,主要根据开发需求来决定。以下是常见选项及其适用场景:1. 控制台程序(Console Application)用途:适用于命令行界面的程序(如算法练习、数据处理等)。特点:运…...

破解密码.

1.开启虚拟机,快速点击鼠标,用上下键选择第二个选项2.然后按E键3.按左右上下键,将光标移到”quiet"后边,4.输入“rd.break"5.按”ctrlx或F10“,进入该界面6.输入此代码后设置密码(不要设置和之前…...

Chrome DevTools在Agent编程工具上的安装

1.Cursor上安装vscode打开Agent Settings{"mcpServers": {"chrome-devtools": {"command": "npx","args": ["chrome-devtools-mcplatest"]}} }claude code和codex在CLI中# Claude Codeclaude mcp add chrome-devt…...

CMD和PowerShell在激活conda环境中遇到的问题

问题引入近日在部署一个agent项目中遇到了激活虚拟环境的问题,现在的IDE默认终端一般是powershell,用conda命令创建、删除环境没啥问题,但是就是激活进入不了。而平时我用conda命令一般用cmd终端(其实之前一直没注意cmd和powershe…...

HakcMyVM-Darkside

信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.2.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2026-03-15 03:46 EDT Nmap scan report for darkside (192.168.2.19) Host is up (0.00023s latency). MAC Address: 08:00:27:3B:49:15 (PCS Systemt…...

基于C语言的轻量级在线商城服务端设计与实现

在当前以Java、Go和Python为主导的电商后端技术生态中,使用C语言构建Web服务似乎显得格格不入。然而,在资源受限环境或对性能有极致追求的场景下,C语言的价值不容忽视。它能够提供对内存和系统调用的精确控制,避免高级语言运行时带…...

欧姆龙CP1H与台达VFD - M变频器的MODBUS RTU通讯实战

欧姆龙CP1H的MODBUS RTU简易主站通讯,通过CP1W-CIF11板与台达VFD-M变频器进行。PLC程序进行轮询通讯,正常情况下只进行读操作,当修改频率或者操作启停命令时,才进行写操作,写操作完成后自动移除。 从而起到保护从站变频…...

从能跑到跑得快:一次大模型硬件加速的工程实践

从能跑到跑得快:一次大模型硬件加速的工程实践 写大模型应用时,很多团队最先遇到的问题不是“模型会不会答”,而是“模型为什么这么慢”。 一套模型在开发阶段能跑起来,和它能在线上稳定、低延迟、可并发地服务用户,是…...

【第二周】RAG与Agent实战13:通用提示词模板 (PromptTemplate)

在之前我们直接将字符串传给模型: model.invoke("帮我写一首诗")这种写法叫做 Zero-shot(零样本) 提示。但在实际应用中,我们需要动态地替换提示词中的内容(比如用户的名字、查询的问题、文档的片段&#xf…...

基于VirtualLab Fusion的复合光源仿真

摘要能够在一个系统中包含多个光源是许多应用的基础,如成像或照明。VirtualLabFusion提供了解决这类问题的高级选项。在本文档中,我们简要概述了如何设置复合光源,并给出了几个仿真示例。概览复合光源可以:包含任意数量的主光源。…...

快速清理手机QQ大量占用的存储空间

快速清理手机QQ大量占用的存储空间 众所周知,手机QQ随着使用会占据越来越多的磁盘空间,甚至多达上百GB。 在面对如此大量的存储数据时,无论是QQ自带的清理工具,还是手机管家之类系统自带的清理工具,其实往往都表现很糟…...

LITESTAR 4D 新模块:Sport Plus-运动场高级照明管理模块

您是否想要一个程序以自动,简单和快速的方式设计运动区域的照明?如果是这样,LITESTAR 4D Litecalc 运动区的额外模块 Sport Plus 是理想的解决方案。区域和高桅杆定义运动区域和高杆定义中可以设定以下内容:1. 运动设施的一般区域…...

使用OpenClaw+Skill自动发布微信公众号文章

一、OpenClaw 介绍 OpenClaw 是一款‌本地优先、可自托管的AI自动化代理工具‌,可以运行在你自己的电脑上,通过各种聊天工具(飞书、QQ、Telegram 等)与你对话,帮你完成各种任务。 1.1 什么是 OpenClaw? 你可…...

受激发射损耗(STED)显微镜原理

摘要受激发射损耗(STED)显微镜描述了一种常用的技术,以实现在生物应用的超分辨率。在这种方法中,两束激光—一束正常,一束转变成甜甜圈模式—被叠加到荧光样品上。通过使用荧光过程的发射和损耗以及利用由此产生的饱和效应,与通常…...

电工操作证报名照片太大?1分钟学会照片压缩技巧

报考电工操作证,作为从事电力作业、设备维修、线路安装的一线人员,日常工作强度大、时间零散,报名办证时照片上传常常成为麻烦事。很多电工朋友已经按要求拍好证件照,清晰度、着装、背景都没问题,就因为照片文件体积太…...

在虚拟机中安装一个linux操作系统

...

ch4_1

//--------------------- // ch4_1.cpp //--------------------- #include<iostream> using namespace std; //--------------------- int main(){int i1,sum0; //初始化while(i<100){sumsumi;ii1;}cout<<"sum "<<sum<<endl; }//---…...

AgenticAIoT - 自进化智能物联网平台

AgenticAIoT - 自进化智能物联网平台 平台简介 AgenticAIoT 是一款企业级自进化智能物联网平台,深度融合 AI 大模型、物联网(IoT) 与 AI 自主编程 三大核心能力。平台以"智能设备接入 + 数据智能流转 + 规则引擎联动 + AI 决策运维 + 自主进化"为核心理念,提供…...

redhat8安装教程

一&#xff0c;下载vm,redhat8的镜像文件与Xshall VM 的安装地址&#xff1a;VMware-workstation-full-17.6.1-24319023.exe_免费高速下载|百度网盘-分享无限制 redhat8镜像文件&#xff1a; RHEL-server-8.0-x86_64-LinuxProbe.Com.iso_免费高速下载|百度网盘-分享无限制 …...

基于SpringBoot与微信小程序的付费自习室系统设计与实现

一、系统开发背景与目标 随着社会对学习效率的重视&#xff0c;付费自习室成为学生、职场人士备考进修的热门选择&#xff0c;但传统预约依赖电话沟通或现场登记&#xff0c;存在座位冲突、时段选择不便等问题。基于SpringBoot后端与微信小程序前端的付费自习室系统&#xff0c…...

基于小程序的篮球场馆预订系统设计与实现

一、系统开发背景与意义 随着全民健身意识的提升&#xff0c;篮球运动成为大众喜爱的体育项目&#xff0c;但篮球场馆预订存在诸多痛点&#xff1a;传统预订依赖电话或现场排队&#xff0c;易出现信息滞后导致的场地冲突&#xff1b;用户难以实时了解场馆空闲时段、场地类型&am…...

从零搭建企业级堡垒机:JumpServer 开源 PAM 平台深度实战指南

引言 在当今云原生与混合 IT 架构盛行的时代&#xff0c;如何安全地管理对服务器、数据库、K8s 集群的访问权限&#xff0c;已成为每个企业必须面对的核心问题。传统“账号共享 密码硬编码”的方式早已被时代淘汰&#xff0c;取而代之的是 特权访问管理&#xff08;Privilege…...

5-7列表去重

输入一个列表&#xff0c;去掉列表中重复的数字&#xff0c;按原来次序输出&#xff01;输入格式:在一行中输入列表输出格式:在一行中输出不重复列表元素neval(input()) a[] for i in n:if i not in a:a.append(i) a1 .join(str(x) for x in a) print(a1)neval(input()) a[] fo…...