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

零基础快速开发eBPF程序

eBPF(extended Berkeley Packet Filter)是Linux内核中的一项革命性技术,允许开发者在不修改内核源码的情况下安全运行沙盒化程序。对于零基础开发者,使用BCC框架是最简单的入门方式。以下是详细的开发步骤:

一、环境准备

  1. 系统要求
  • Linux内核版本4.1+(推荐5.15+或6.2+)
  • Ubuntu 20.04或更新版本(或类似发行版)
  1. 安装必要工具
sudo apt update sudo apt install -y git build-essential libelf-dev zlib1g-dev llvm clang
  1. 安装BCC工具集
sudo apt install -y bcc-tools libbcc-examples

提示:BCC是BPF编译器集合,提供了Python接口,简化了eBPF开发流程。

二、开发第一个eBPF程序

步骤1:编写eBPF程序(hello.c)

创建一个名为​​hello.c​​的文件,输入以下内容:

#include <linux/bpf.h> #include <bpf/bpf_helpers.h> int hello_world(void *ctx) { bpf_trace_printk("Hello, World!"); return 0; }

关键说明

  • ​bpf_trace_printk()​​是eBPF中常用的辅助函数,用于输出调试信息
  • 与普通程序不同,eBPF程序输出到内核调试文件​​/sys/kernel/debug/tracing/trace_pipe​

步骤2:编写用户态程序(hello.py)

创建一个名为​​hello.py​​的文件,输入以下内容:

#!/usr/bin/env python3 from bcc import BPF # 1) 加载BPF程序 b = BPF(src_file="hello.c") # 2) 挂载kprobe到系统调用openat2 b.attach_kprobe(event="do_sys_openat2", fn_name="hello_world") # 3) 读取并打印内核调试输出 print("Tracing... Hit Ctrl+C to end.") b.trace_print()

关键说明

  • ​BPF(src_file="hello.c")​​加载eBPF程序
  • ​attach_kprobe()​​将程序挂载到内核探针(kprobe)
  • ​trace_print()​​读取并打印内核调试输出

步骤3:运行程序

sudo python3 hello.py

程序开始运行后,每当有进程调用​​openat2​​系统调用(如打开文件),就会在终端输出"Hello, World!"。

三、理解工作原理

  1. BCC的作用:BCC将eBPF程序的编译、加载和管理过程抽象化,提供Python接口
  2. eBPF执行流程
  • BCC调用LLVM将C代码编译为BPF字节码
  • 将字节码加载到内核中
  • 通过kprobe等机制触发执行
  • 输出结果通过​​/sys/kernel/debug/tracing/trace_pipe​​返回

四、进阶实践

1. 监控系统调用

修改​​hello.c​​,添加系统调用监控功能:

#include <linux/bpf.h> #include <bpf/bpf_helpers.h> #include <linux/ptrace.h> #include <linux/sched.h> BPF_HASH(counts, u32, u64); int trace_sys_enter(void *ctx) { u32 pid = bpf_get_current_pid_tgid() >> 32; u64 zero = 0, *p; p = counts.lookup_or_init(&pid, &zero); (*p)++; return 0; }

2. 运行监控程序

from bcc import BPF b = BPF(text=""" #include <linux/bpf.h> #include <bpf/bpf_helpers.h> #include <linux/ptrace.h> #include <linux/sched.h> BPF_HASH(counts, u32, u64); int trace_sys_enter(void *ctx) { u32 pid = bpf_get_current_pid_tgid() >> 32; u64 zero = 0, *p; p = counts.lookup_or_init(&pid, &zero); (*p)++; return 0; } """) b.attach_kprobe(event="sys_enter", fn_name="trace_sys_enter") while True: try: for k, v in b["counts"].items(): print("PID {}: {}".format(k.value, v.value)) b["counts"].clear() sleep(2) except KeyboardInterrupt: exit()

五、实用技巧与注意事项

  1. 调试技巧
  • 使用​​bpftool​​​查看eBPF程序状态:​​bpftool prog list​
  • 查看内核日志:​​dmesg | tail​
  1. 性能优化
  • eBPF程序指令数限制(约4096条)
  • 避免在循环中进行复杂操作
  1. 安全考虑
  • 确保eBPF程序不会影响系统稳定性
  • 在测试环境中先验证程序
  1. 学习路径建议
  • 初学者:理解基本概念,运行示例程序
  • 进阶:学习编写自定义程序,探索网络、安全、性能监控等场景
  • 高级:使用libbpf框架,实现更复杂的eBPF应用

六、常见问题

Q:eBPF程序在哪里运行?A:在Linux内核的虚拟机中运行,确保了安全性和性能。

Q:需要哪些前置知识?A:基本的Linux系统知识、C语言编程经验。

Q:为什么我的程序没有输出?A:检查内核调试文件​​/sys/kernel/debug/tracing/trace_pipe​​,确保已正确挂载kprobe。

通过以上步骤,你已成功开发并运行了第一个eBPF程序。eBPF技术在系统监控、网络分析、安全防护等领域有广泛应用,掌握这项技术将为你的系统编程能力带来质的飞跃。建议从简单的监控程序开始,逐步探索更复杂的场景。记住,eBPF的核心优势在于其安全性和灵活性,让你能够在不修改内核的情况下扩展系统功能。

http://www.jsqmd.com/news/707297/

相关文章:

  • 给大一新生的循迹小车保姆级教程:从模块接线到代码调试,一次搞定
  • 告别IO口焦虑:用FPGA+74HC595级联驱动16位数码管,一个工程搞定
  • VASP计算半导体带隙不准?试试HSE06杂化泛函,手把手教你四步搞定(附INCAR避坑指南)
  • 开源学术会议DDL追踪系统:YAML数据驱动与多端同步实践
  • 机器学习降维技术:原理、方法与实践指南
  • OpenCV与随机森林实现轻量级图像分类方案
  • 如何使用Gatsby构建高效技术文档:完整指南与最佳实践
  • Python机器学习数据集获取与处理全指南
  • 基于MCP协议实现Cursor AI与Figma设计稿的智能集成与自动化
  • 优化LLM训练的DRAM分配策略:位置感知与遗传算法
  • Bitalostored实战应用:如何将Redis迁移到Bitalostored并节省80%成本
  • 工厂老设备联网记:用智能网关给不支持WIFI的PLC“穿”上无线外衣(汇川/AB案例)
  • Phi-3.5-mini-instruct辅助Windows系统管理与优化:从安装到清理
  • 2026年3月陶瓷清洗机销售厂家联系方式,清洗设备/汽车零件超声波清洗机/履带式超声波清洗机,陶瓷清洗机销售厂家如何选 - 品牌推荐师
  • dplyr数据探索:高效R语言数据处理实战指南
  • 深求·墨鉴效果展示:看AI如何精准识别复杂表格与公式
  • 超越官方Demo:深入TI毫米波雷达生命体征检测的代码框架与数据流解析
  • Helios部署策略实战:滚动更新与健康检查配置
  • BMAX B1 Plus迷你主机评测:Apollo Lake平台的性价比之选
  • MySQL数据库教程
  • Perfetto Native内存分析实战:从‘抓不到’到‘看得清’,解决Heapprofd抓包与视图解读的常见坑
  • AI编程助手内嵌BERT文本分割:长代码注释的智能分析与重构
  • Mahout聚类分析在Stack Exchange技术问答数据中的应用与优化
  • 别再只会SSH了!用SecureCRT的Zmodem功能,5分钟搞定Windows与Linux服务器文件互传
  • 深入STC单片机ISP机制:从IAP_CONTR寄存器到软复位,理解不断电下载背后的原理
  • Awesome Codex Skills中的潜在客户研究助手:丰富客户资料的实用工具
  • R语言实战:用Tukey检验和multcompView包搞定多组数据比较(附完整代码与箱线图美化)
  • 【相当困难】斐波那契系列问题的递归和动态规划-Java:补充题目2
  • SMT元件双峰分布对电路设计的影响与建模方法
  • 2026道路太阳能路灯厂家怎么选:新农村太阳能路灯/老年车锂电池/货三轮锂电池/道路太阳能路灯/高杆太阳能路灯/选择指南 - 优质品牌商家