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

Linux内核观测与跟踪的利器BPF环境测试

内核观测工具BPF实例BPF介绍BPF实例使用 BCC 工具集最简单使用 libbpf BPF 骨架更接近生产环境使用 bpftool 直接加载适合调试总结BPF介绍BPF 最初诞生于 1992 年是一种用于网络数据包过滤的虚拟机技术。它允许用户空间程序向内核注入简单的过滤指令在内核态高效过滤数据包避免将无关数据拷贝到用户空间。鼎鼎大名的tcpdump就是基于BPF实现的。2014 年起内核将 BPF 扩展为 eBPF彻底革新了其能力通用虚拟机eBPF 指令集更接近现代 CPU 架构64 位寄存器、复杂指令可在内核中运行任意安全的用户定义程序。挂载点扩展不仅限于网络可挂载到内核函数入口/出口kprobes、用户空间函数uprobes、跟踪点tracepoints、网络数据包处理XDP、TC、cgroup 等数十种事件源。perf只能对这些事件进行统计跟踪展示而eBPF程序能在事件发生时执行用户自定义的函数。安全性eBPF 程序必须先通过验证器检查确保不会导致内核崩溃、无限循环或访问非法内存随后通过即时编译JIT 转换为原生机器码执行性能极高。内核与用户空间通信通过 eBPF Maps键值存储实现内核与用户空间、以及不同 eBPF 程序之间的数据交换。BPF实例eBPFExtended Berkeley Packet Filter二进制程序本身不能直接在终端像普通可执行文件那样运行。它的执行有特殊的流程你编写的 eBPF C 代码需要经过编译、加载、验证、挂载最终由内核执行。编写 eBPF 程序通常用 C 语言通过 clang 编译成 eBPF 字节码ELF 文件使用用户态加载程序将字节码加载到内核内核验证器检查安全性后将字节码编译为原生机器码将程序挂载到指定的挂载点如 kprobe、tracepoint、XDP 等当事件触发时内核执行该 eBPF 程序使用 BCC 工具集最简单通过bcc工具使用python来编写bpf程序非常方便可直接运行。#!/usr/bin/env python3 from bcc import BPF # eBPF C 代码作为字符串 bpf_code int hello_world(void *ctx) { bpf_trace_printk(Hello, World!\\n); return 0; } # 加载程序 b BPF(textbpf_code) # 挂载到 sys_clone 系统调用 b.attach_kprobe(eventb.get_syscall_fnname(execve), fn_namehello_world) # 读取输出 b.trace_print()直接在终端运动该python文件即可看到效果。使用 libbpf BPF 骨架更接近生产环境先写一个bpf钩子mybpf.c当内核执行函数sys_enter_execve时触发我们的钩子进行输出。#include linux/bpf.h #define SEC(NAME) __attribute__((section(NAME), used)) static int (*bpf_trace_printk)(const char *fmt, int fmt_size, ...) (void *)BPF_FUNC_trace_printk; SEC(tracepoint/syscalls/sys_enter_execve) int bpf_prog(void *ctx) { char msg[] Hello, BPF World!; bpf_trace_printk(msg, sizeof(msg)); return 0; } char _license[] SEC(license) GPL; // 编译方法clang -g -O2 -target bpf -c mybpf.c -o mybpf.o -I/usr/include/x86_64-linux-gnu/SEC(“tracepoint/syscalls/sys_enter_execve”) 定义挂载点为系统调用sys_enter_execve,当系统内核响应此调用时执行下面的bpf_prog函数进行打印输出。生成骨架bpftool gen skeleton mybpf.o mybpf.skel.h用户端简单加载程序loader.cgcc -o myloader loader.c -lbpf -lelf -lz 即可生成可执行程序执行后cat /sys/kernel/debug/tracing/trace_pipe 可查看mybpf.c程序的输出。/ minimal_loader.c #include stdio.h #include stdlib.h #include unistd.h #include signal.h #include bpf/libbpf.h #include bpf/bpf.h #include mybpf.skel.h // 由bpftool生成的骨架头文件 static volatile int exiting 0; static void sig_handler(int sig) { exiting 1; } int main(int argc, char **argv) { struct mybpf *skel; int err; // 1. 信号处理用于优雅退出 signal(SIGINT, sig_handler); signal(SIGTERM, sig_handler); // 2. 打开BPF程序从当前目录的mybpf.o文件 skel mybpf__open(); if (!skel) { fprintf(stderr, Failed to open BPF skeleton\n); return 1; } // 3. 加载并验证BPF程序到内核 err mybpf__load(skel); if (err) { fprintf(stderr, Failed to load BPF skeleton: %d\n, err); goto cleanup; } // 4. 附加到内核事件如kprobe err mybpf__attach(skel); if (err) { fprintf(stderr, Failed to attach BPF skeleton: %d\n, err); goto cleanup; } printf(BPF程序加载成功按Ctrl-C退出...\n); // 5. 主循环等待退出信号 while (!exiting) { sleep(1); } cleanup: // 6. 清理资源自动卸载BPF程序 mybpf__destroy(skel); return err; }使用 bpftool 直接加载适合调试查看当前bpf程序 bpftool prog list152: cgroup_device name sd_devices tag a97c143260cd9940 gpl loaded_at2026-03-25T14:25:080800 uid0xlated 416B jited 260B memlock 4096B156: cgroup_device name s_thunderbird_t tag 5592a8780089fcce gpl loaded_at2026-03-25T14:26:170800 uid1000xlated 296B jited 164B memlock 4096B map_ids48172: cgroup_skb name sd_fw_egress tag 772db7720b2728e9 gpl loaded_at2026-03-25T15:18:080800 uid0xlated 64B jited 56B memlock 4096B173: cgroup_skb name sd_fw_ingress tag 772db7720b2728e9 gpl loaded_at2026-03-25T15:18:080800 uid0xlated 64B jited 56B memlock 4096B rootzhongsc-ThinkPad-P51:/work/bpf/linux-obser加载自己的bpf程序# 编译 eBPF 程序clang-g-O2-targetbpf-cmybpf.c-omybpf.o -I/usr/include/x86_64-linux-gnu/# 加载到内核并挂载事件bpftool prog loadall mybpf.o /sys/fs/bpf/mybpf autoattach# 卸载sudorm/sys/fs/bpf/my_prog总结原来linux提供了如此强大的工具让用户可以跟踪内核和用户态的任意函数很多强大的工具都是通过它实现的linux还有什么好玩的工具敬请期待后续章节。

相关文章:

Linux内核观测与跟踪的利器BPF环境测试

内核观测工具BPF实例BPF介绍BPF实例使用 BCC 工具集(最简单)使用 libbpf BPF 骨架(更接近生产环境)使用 bpftool 直接加载(适合调试)总结BPF介绍 BPF 最初诞生于 1992 年,是一种用于网络数据包…...

大三大学生挖洞收入十万背后:网安圈的“天才少年”,普通人能复制吗?

大三学生挖洞收入十万背后:网安圈的 “天才少年” ,普通人能复制吗? SRC首期学员战绩疯传:大四小白45天回本6K?大三在读2个月挖洞收获六位数? 当朋友圈被"零基础挖洞暴富"的捷报疯狂刷屏时&…...

MySQL 8.0迁移后表名报错?别急着改my.cnf,先搞懂lower_case_table_names这个坑

MySQL 8.0表名大小写陷阱:从踩坑到系统化解决方案 当数据库管理员小李将公司核心业务系统从MySQL 5.7迁移到8.0版本后,系统突然开始频繁报错"表不存在",而实际上这些表明明就在数据库中。这个看似简单的表象背后,隐藏着…...

Claude Code 速查表

其中的:键盘快捷键常规控制Ctrl C:取消输入 / 生成Ctrl D:退出会话Ctrl L:清屏Ctrl O:切换详细输出Ctrl R:反向搜索历史Ctrl G:在编辑器中打开提示Ctrl B:后台运行任务Ctrl …...

BilibiliDown:B站音视频资源管理的全场景解决方案

BilibiliDown:B站音视频资源管理的全场景解决方案 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bi…...

程序员视角:五笔输入法98版为何更适合代码编写?

程序员视角:五笔输入法98版为何更适合代码编写? 在程序员的世界里,效率就是生命。从IDE的选择到快捷键的配置,每一个细节都可能影响编码的速度和质量。而作为中文开发者,输入法的选择往往被忽视——直到你发现自己在输…...

browser-use爆火:AI Agent接管浏览器,测试自动化正在被重构

导读 最近在实际项目和工具演进中,可以明显看到一个变化: AI 不再只是写代码,而是开始“直接干活”。 这款 browser-use开源工具非常厉害。它能让AI Agent🚀直接操控浏览器。实现网页任务自动化简单高效 (๑•̀ㅂ•́)و✧。该…...

告别手动Dockerfile!io.fabric8插件如何用Maven配置自动生成镜像(附Spring Boot实战)

告别手动Dockerfile!io.fabric8插件如何用Maven配置自动生成镜像(附Spring Boot实战) 在Java生态中,容器化部署已成为现代应用交付的标准方式。传统做法要求开发者同时维护Dockerfile和构建脚本,这种割裂的配置方式不仅…...

老王-十条江湖铁律:比读百本厚黑书更管用

十条江湖铁律 ——比读百本厚黑书更管用“人若不想被算计, 就必须记住这10条—— 不是教你变坏, 而是—— 让你在复杂世界里,活得清醒且安全。”🏙️ 1. 小地方发达,速换圈子“庙小妖风大,池浅王八多。”小…...

收藏必备!小白程序员快速入门大模型:RAG技术演进全景图

本文介绍了检索增强生成(RAG)技术的演进历程,从基础范式到代码RAG的现状与挑战。文章涵盖了朴素RAG的局限性、语义增强范式、多模态融合、上下文感知以及代码RAG的核心难点与应对策略。此外,还探讨了RAG作为智能体核心记忆与知识子…...

3大核心模块:Steam成就管理开源工具从问题解决到效率提升的实战指南

3大核心模块:Steam成就管理开源工具从问题解决到效率提升的实战指南 【免费下载链接】SteamAchievementManager A manager for game achievements in Steam. 项目地址: https://gitcode.com/gh_mirrors/st/SteamAchievementManager 引言 在游戏玩家的日常体…...

游戏原画效率提升50%:Pixel Fashion Atelier在角色装备概念图批量生成中的应用

游戏原画效率提升50%:Pixel Fashion Atelier在角色装备概念图批量生成中的应用 1. 传统游戏原画设计的痛点 游戏开发过程中,角色装备设计往往是最耗时的环节之一。传统工作流程中,美术团队需要: 手工绘制数十种装备变体反复修改…...

如何在日常渗透中实现通杀漏洞挖掘

如何在日常渗透中实现通杀漏洞挖掘 你是不是天天遇到了edu刷屏?看到了某些漏洞平台,某些人交了一千个公益漏洞?是不是觉得很牛逼?其实不然,都不难,其实如果我要是想刷这玩意,可以交不完的漏洞&a…...

Kali 2023最新版安装Fluxion避坑指南:从git clone到镜像源全流程

Kali 2023最新版安装Fluxion避坑指南:从git clone到镜像源全流程 如果你正在学习网络安全渗透测试,Fluxion绝对是一个值得掌握的Wi-Fi安全审计工具。作为Kali Linux生态中最受欢迎的无线网络测试套件之一,它通过智能化的交互界面让复杂的攻击…...

Umi-OCR插件技术深度解析:如何构建高效的文字识别工作流

Umi-OCR插件技术深度解析:如何构建高效的文字识别工作流 【免费下载链接】Umi-OCR_plugins Umi-OCR 插件库 项目地址: https://gitcode.com/gh_mirrors/um/Umi-OCR_plugins Umi-OCR插件库为文字识别任务提供了多样化的解决方案,涵盖了从本地CPU加…...

别再手动算置信区间了!ArcGIS里用Python脚本批量计算FVC,效率提升90%

遥感植被覆盖度自动化计算:用Python脚本解放ArcGIS生产力 当面对数百景遥感数据需要计算植被覆盖度(FVC)时,手动操作ArcGIS界面不仅耗时费力,还容易因人为失误导致结果不一致。我曾在一个省级生态评估项目中,需要处理3年共36期Lan…...

如何安全高效地管理Cookie:Get cookies.txt LOCALLY本地处理终极实践指南

如何安全高效地管理Cookie:Get cookies.txt LOCALLY本地处理终极实践指南 【免费下载链接】Get-cookies.txt-LOCALLY Get cookies.txt, NEVER send information outside. 项目地址: https://gitcode.com/gh_mirrors/ge/Get-cookies.txt-LOCALLY 在数字时代&a…...

档案宝 档案管理系统怎么样?为什么企业选择他?

在当今信息化高速发展的时代,企业档案管理已经从传统的纸质化时代迈向了数字化、智能化的新阶段。随着企业规模的不断扩大和业务类型的日益复杂,档案管理面临着前所未有的挑战:档案数量激增、查找困难、存储空间紧张、安全隐患突出等问题严重…...

别再只会用IP核了!手把手教你用Verilog RTL代码实现一个简单的RAM(附仿真对比)

从寄存器阵列到存储矩阵:Verilog RTL实现RAM的底层逻辑与工程实践 在FPGA和数字IC设计中,RAM(随机存取存储器)如同数字世界的记事本,承载着数据暂存与交换的关键使命。许多工程师习惯于直接调用供应商提供的IP核&#…...

W-TRS-5.5D7红外测温:电炖锅智能测温的革新力量

在追求健康饮食与智能烹饪的时代,电炖锅的温控技术革新至关重要。领麦微W-TRS-5.5D7红外测温传感器的出现,为电炖锅带来非接触检测锅温与食物温度的新突破,结合智能菜谱功能,开启电炖锅智能烹饪新纪元。非接触检测锅温&#xff1a…...

从零开始:使用Python Add-in快速构建ArcGIS自定义工具条

1. Python Add-in入门:ArcGIS插件开发新选择 第一次接触ArcGIS插件开发时,我被各种复杂的开发方式搞得晕头转向。直到发现了Python Add-in这个神器,才发现原来开发自定义工具条可以这么简单!Python Add-in是Esri在ArcGIS 10.1引入…...

AI Agent与传统RPA工具区别:深度解析企业智能自动化的代际跃迁

在人工智能技术从大语言模型的“对话式交互”向“行动式智能体”跨越的关键周期内,AI Agent(智能体)与传统 RPA(机器人流程自动化)工具的区别已成为企业数字化转型的核心议题。这一区别不仅体现在技术架构的演进上&…...

手把手教你用4090D单卡24G显存本地跑DeepSeek-R1:KTransformers保姆级安装与避坑指南

手把手教你用4090D单卡24G显存本地跑DeepSeek-R1:KTransformers保姆级安装与避坑指南 最近在折腾大模型本地部署的朋友们,应该都听说过DeepSeek-R1这个671B参数的"巨无霸"。传统认知里,这种规模的模型至少需要专业级GPU集群才能跑起…...

当Logo消失,品牌资产还剩多少?

这个问题问得直接——品牌费尽心思把Logo放大、放正、放在C位,可如果有一天消费者真的“看不见”它,品牌还剩下什么?答案取决于品牌建设的本质:是在做识别符号,还是在做价值沉淀。1. 认知资产:剩不下什么Lo…...

Elasticsearch IK 分词器远程词典

一、背景 在使用 Elasticsearch IK 分词器进行中文检索时,默认词库往往无法覆盖业务中的专业词汇(如:知识库、RAG架构、向量检索等)。 如果不进行扩展,这些词可能被错误拆分,导致: 检索结果不准…...

League Toolkit:重新定义英雄联盟游戏体验的智能辅助工具

League Toolkit:重新定义英雄联盟游戏体验的智能辅助工具 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 价值定位&am…...

功能关键词 AI 短剧爆发:Sora、Pixverse、可灵视频重构影视行业(中外模型对比)

c.myliang.cn深耕 AI 内容创作与 SEO 优化多年,聚焦 2026 年百度 SEO/GEO 关键词布局,结合 AI 短剧行业爆发趋势,帮影视从业者快速掌握 Sora、Pixverse、可灵视频等中外模型实操技巧,适配百度算法与行业需求,低成本打造…...

ESP32远程识别模块完整指南:如何实现无人机合规飞行

ESP32远程识别模块完整指南:如何实现无人机合规飞行 【免费下载链接】ArduRemoteID RemoteID support using OpenDroneID 项目地址: https://gitcode.com/gh_mirrors/ar/ArduRemoteID 随着全球无人机法规日益严格,FAA和欧盟都要求无人机必须配备专…...

软件检测领域CNAS能力验证信息怎么查?今年有哪些软件检测领域可以参加的能力验证?

实验室在初次申请CNAS资质或者扩项时,必须要参加一次能力验证活动,并获得满意结果。对于初次申请CNAS资质的软件检测实验室,能力验证应该在质量管理体系试运行期间完成。如果时间不合适,也可以选择参加测量审核活动。测量审核活动…...

VSCode远程开发必备:SSH端口转发一键配置指南(含常见问题排查)

VSCode远程开发实战:SSH端口转发高效配置与深度排错 当你在咖啡厅修改代码时,远程服务器上的数据库服务突然需要紧急调试;当团队协作时,同事的内网API接口需要临时开放给你测试——这些场景下,SSH端口转发就像一把瑞士…...