ebpf在欧拉系统上的使用
一、检查一下你的欧拉系统版本,确保它支持 eBPF:
[root@anonymous ~]# cat /etc/openEuler-release
openEuler release 24.03 (LTS-SP3)
[root@anonymous ~]# uname -r
6.6.0-140.0.0.123.oe2403sp3.x86_64
二、准备工作
先给你的欧拉系统装好“调料”。打开终端,执行下面的命令就行:
sudo dnf install -y bcc bpftrace kernel-devel llvm clang
每个软件包是干什么的?(核心重点)
1.bcc(BPF Compiler Collection)
- 全名:BPF 编译器集合
- 通俗理解:一个“工具百宝箱”,里面装了 50+ 个可以直接使用的 eBPF 监控命令,比如 execsnoop(追踪新进程)、biolatency(看磁盘慢不慢)。
- 为什么需要它:你不需要自己写代码,直接敲这些命令就能用 eBPF。
2. bpftrace
- 全名:BPF Trace(BPF 追踪脚本语言)
- 通俗理解:一个“一行命令搞定监控”的神器。你可以像写简短的句子一样,写出强大的监控脚本。比如前面教程里的:
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("打开了文件: %s\n", str(args->filename)); }'
1. 事件源:tracepoint:syscalls:sys_enter_openat
-
tracepoint:内核中预先埋好的“钩子点”。相当于在马路上提前装好的感应器。 -
syscalls:系统调用类别。系统调用是程序请求内核干活(比如读写文件、创建进程)的“官方通道”。 -
sys_enter_openat:具体的事件名称。openat是一个打开文件的系统调用(程序想打开某个文件时会触发)。sys_enter_表示“刚进入这个系统调用时”,也就是程序刚要打开文件的那一瞬间。
通俗理解:我们在内核的“文件打开操作”的入口处,安装了一个监听器。每当任何一个程序试图打开文件,这个监听器就会立刻触发。
2. 动作:{ printf("打开了文件: %s\n", str(args->filename)); }
大括号 { ... } 里定义了事件发生时要执行的代码。
-
printf(...):输出一行文字,类似其他编程语言里的打印。 -
"打开了文件: %s\n":输出模板。%s是一个占位符,会被后面的内容替换;\n表示换行。 -
str(args->filename):-
args是一个特殊变量,包含了事件发生时内核传递的所有信息(比如要打开的文件名、打开模式等)。 -
args->filename取出文件名(原始格式是指针)。 -
str(...)将指针转换为可读的字符串。
-
通俗理解:当有人打开文件,就打印一行字:“打开了文件: 具体文件名.txt”。
你运行这条命令后,bpftrace 会把这个小脚本编译成 eBPF 字节码,并注入到 Linux 内核里。
脚本在内核中静静等待。每当系统中的任何一个程序调用 openat 想打开文件时,内核就会执行脚本里的 printf。
输出结果打印在你的终端上,显示刚刚哪个文件被打开了。
为什么需要它:快速写自定义监控,不用学复杂的 C 语言。
3. kernel-devel
-
全名:Kernel Development(内核开发头文件)
-
通俗理解:内核的“说明书”和“零件库”。eBPF 程序需要知道内核里有哪些函数、数据结构,这个包提供了这些定义。
-
为什么需要它:没有它,eBPF 工具无法编译和加载到内核里。
4. llvm
-
全名:Low Level Virtual Machine(底层虚拟机编译器)
-
通俗理解:一个“翻译官”。把人类写的 C 语言代码(或 bpftrace 脚本)翻译成 eBPF 虚拟机能够理解的“字节码”。
-
为什么需要它:eBPF 程序运行在内核中的一个沙盒虚拟机里,必须经过 LLVM 编译。
5. clang
-
全名:C Language Frontend for LLVM(LLVM 的 C 语言前端)
-
通俗理解:LLVM 的“嘴巴”,专门负责“吃”C 语言代码。写 eBPF 程序主要用 C 语言,clang 负责解析并交给 LLVM 编译。
-
为什么需要它:编译 eBPF 程序的标准工具。

浙公网安备 33010602011771号