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

eBPF入门教程(Ubuntu 24.04)

在当今的系统性能优化领域, eBPF(Extended Berkeley Packet Filter)正发挥着越来越重要的作用. 它不仅能够深入系统底层, 实现精准的性能跟踪, 还拥有内置的高性能网络功能, 甚至可以有效地检测系统中的恶意行为. 这些优势使得 eBPF 成为了系统开发和运维人员手中的一把利器.

环境准备

需要明确的是, eBPF 并非普通的应用层软件, 它与内核紧密相关. 因此, 确保系统内核版本的一致性至关重要. 以下是本文所使用的演示环境:

操作系统

  • Ubuntu 24.04
    • 内核版本: 6.8.0-52-generic
    • 处理器架构: x86_64

依赖软件安装

在开始使用 eBPF 之前, 需要安装一些必要的依赖软件. 打开终端, 依次执行以下命令:

sudo apt update
sudo apt install libelf-dev libbpf-dev python3-bpfcc bpfcc-tools libbpfcc-dev
sudo apt install linux-headers-$(uname -r)

虚拟机环境(可选)

如果你希望在一个独立的虚拟机环境中进行实验, 以避免对现有系统造成影响, vagrant 是一个不错的选择. 本文使用的基础镜像是: bento/ubuntu-24.04.

eBPF Hello World

编写 eBPF 程序有多种方法, 为了帮助新手快速入门, 这里我们选择使用 BCC Python 框架. 下面将展示一个简单的示例, 该示例会挂载(hook)在系统调用 execve 上, 每当这个系统调用被触发时, 程序会打印一句 "Hello eBPF!".

步骤 1: 创建 Python 脚本

创建一个名为 hello.py 的文件, 并将以下代码复制到该文件中:

from bcc import BPF

# 定义 eBPF 程序, 使用 C 语言编写
program = r"""
int hello(void *ctx) {
    // 打印输出信息
    bpf_trace_printk("Hello eBPF!");
    return 0;
}
"""

# 初始化 BPF 对象, 将 C 语言程序交给 bcc 处理
b = BPF(text=program)

# 获取 execve 系统调用的函数名
syscall = b.get_syscall_fnname("execve")

# 将 eBPF 程序挂载到 execve 系统调用上
b.attach_kprobe(event=syscall, fn_name="hello")

# 输出日志信息
b.trace_print()

步骤 2: 执行脚本

由于 eBPF 程序需要在内核中运行, 因此需要使用 sudo 权限来执行脚本:

sudo python3 hello.py

步骤 3: 观察输出

执行脚本后, 你会看到类似如下的输出:

b'            sshd-2548    [000] ...21   963.948685: bpf_trace_printk: Hello eBPF!'
b'              sh-2549    [000] ...21   963.950330: bpf_trace_printk: Hello eBPF!'
b'             env-2549    [000] ...21   963.951490: bpf_trace_printk: Hello eBPF!'
b'             env-2549    [000] ...21   963.951551: bpf_trace_printk: Hello eBPF!'
b'             env-2549    [000] ...21   963.951557: bpf_trace_printk: Hello eBPF!'
b'             env-2549    [000] ...21   963.951562: bpf_trace_printk: Hello eBPF!'
b'       run-parts-2550    [001] ...21   963.953146: bpf_trace_printk: Hello eBPF!'
b'           <...>-2551    [000] ...21   963.955544: bpf_trace_printk: Hello eBPF!'
b'           <...>-2552    [000] ...21   963.957097: bpf_trace_printk: Hello eBPF!'
b'           <...>-2553    [000] ...21   963.958475: bpf_trace_printk: Hello eBPF!'
b'           <...>-2554    [001] ...21   963.959866: bpf_trace_printk: Hello eBPF!'
...

需要注意的是, 输出结果会根据当时机器上正在执行的程序而有所不同.

样例解析

1. eBPF 程序的定义

在上述示例中, program 变量存储的是一段 C 语言编写的 eBPF 程序:


http://www.kler.cn/a/542465.html

相关文章:

  • jupyter notebook中3种读图片的方法_与_图片翻转(上下翻转,左右翻转,上下左右翻转)
  • (定时器,绘制事件,qt简单服务器的搭建)2025.2.11
  • 逆势而上,门店规模拓展的智慧攻略-中小企实战运营和营销工作室博客
  • deepseek+“D-id”或“即梦AI”快速生成短视频
  • 【时时三省】(C语言基础)基础习题1
  • 用 DeepSeek + Kimi 自动做 PPT,效率起飞
  • JavaScript设计模式 -- 工厂模式
  • 五、OSG学习笔记-矩阵变换
  • 25考研材料复试面试常见核心问题真题汇总,材料考研复试面试有哪些经典问题?材料考研复试过程最看重什么内容?
  • python C# 内存共享互传 图像 以及字符串
  • 蓝桥杯 Java B 组 - 第 1 周复习总结
  • 3、k8s项目的生命周期和yaml文件
  • uniapp商城之登录模块
  • 《深度学习》——CNN卷积神经网络模型及项目实例
  • 【Prometheus】MySQL主从搭建,以及如何通过prometheus监控MySQL运行状态
  • FTP(File Transfer Protocol)-文件传输协议
  • C++引用深度详解
  • Unity做2D小游戏5------多个动画互相转换
  • docker配置国内源
  • 【unity实战】实现摄像机跟随效果
  • 【AI知识点】大模型开源的各种级别和 deepseek 的开源级别
  • Java 大视界 -- 5G 与 Java 大数据融合的行业应用与发展趋势(82)
  • ArcGIS Pro SDK (二十六)自定义配置
  • 基于 PyTorch 的树叶分类任务:从数据准备到模型训练与测试
  • 25考研电子信息复试面试常见核心问题真题汇总,电子信息考研复试没有项目怎么办?电子信息考研复试到底该如何准备?
  • 进阶版MATLAB 3D柱状图