# ebpf.probe开发指南
ebpf.probe是一个bpf探针程序的开发框架,定义了一些开发规范,方便bpf程序的开发集成;
## ebpf.probe目录结构
目录结构:
```sh
├── build.sh # BPF探针构建脚本
├── install.sh # BPF探针安装脚本
├── src # bpf程序源码目录
│ ├── include # 公共头文件
│ │ ├── tcp.h # TCP基础库头文件
│ │ ├── linux_4.18.0-147.5.1.6.h425.h # 内核版本的头文件(仅包含probe使用相关)
│ │ ├── linux_4.19.90-2003.4.0.0036.oe1.h # 内核版本的头文件(仅包含probe使用相关)
│ │ └── vmlinux.h -> linux_4.19.90-2003.4.0.0036.oe1.h # 根据编译环境生成的vmlinux.h
│ └── lib # 基础库
│ ├── tcp.c # TCP基础库文件
│ ├── container.c # 容器基础库文件
│ ├── xx.c # xx基础库文件
│ ├── Makefile # makefile
│ └── tcpprobe # tcpprobe探针
│ ├── tcp_link.meta # 探针数据采集meta文件
│ ├── tcpprobe.bpf.c # 探针内核BPF程序
│ ├── tcpprobe.c # 探针用户态BPF程序
│ └── tcpprobe.h # 相关头文件
│ └── xxprobe # xxprobe探针
│ ├── xx.meta # 探针数据采集meta文件
│ ├── xxprobe.bpf.c # 探针内核BPF程序
│ ├── xxprobe.c # 探针用户态BPF程序
│ └── xxprobe.h # 相关头文件
└── tools # 工具目录
├── bpftool # bpftool工具,用于生成vmlinux.h/BPF skeletons头文件
└── gen_vmlinux_h.sh # 自动生成vmlinux.h
```
## 如何编译
### 编译命令
```sh
# 环境准备(首次编译内核BPF探针时,需要构建内核头文件)
/etc/yum.repos.d/openEuler.repo
[source]
name=SOURCE
baseurl=https://repo.huaweicloud.com/openeuler/openEuler-20.03-LTS-SP2/source/
enabled=1
gpgcheck=0
[everything]
name=EveryThing
enabled=1
gpgcheck=0
baseurl=http://repo.huaweicloud.com/openeuler/openEuler-20.03-LTS-SP2/everything/x86_64/
**** 注意必须携带source源 ****
# 查看build方法
build.sh -h/--help : Show this message.
build.sh --check: Check the environment including arch/os/kernel/packages.
build.sh -g/--gen : Generate the linux header file.
build.sh -c/--clean: Clean the built binary.
build.sh -b/--build: Build all the probes.
# 生成编译环境的内核vmlinux.h头文件
build.sh -g
编程成功后可以在 gala-gopher/src/probes/extends/ebpf.probe/src/include/ 查看到具体生成的头文件
[root@master ebpf.probe]# ll src/include/
total 6404
-rw-r--r--. 1 root root 192 Oct 25 10:19 args.h
-rw-r--r--. 1 root root 16576 Oct 25 10:19 bpf.h
-rw-r--r--. 1 root root 648 Oct 25 10:19 container.h
-rw-r--r--. 1 root root 2928 Oct 25 10:19 ext_def.h
-rw-r--r--. 1 root root 1996914 Oct 25 10:19 linux_4.19.90-2012.4.0.0053.oe1.h
-rw-r--r--. 1 root root 2847 Oct 25 10:19 tcp.h
-rw-r--r--. 1 root root 1772 Oct 25 10:19 util.h
lrwxrwxrwx. 1 root root 27 Oct 25 10:19 vmlinux.h -> linux_4.19.90-2012.4.0.0053.oe1.h
**** linux_4.19.90-2012.4.0.0053.oe1.h 就是编译生成的头文件
# 编译bpf程序
[root@localhost ebpf.probe]# ./build.sh -b
# 安装bpf程序,安装到 /usr/bin/extends/ebpf.probe 目录下
[root@localhost ebpf.probe]# ./install.sh
/opt/A-Ops/gala-gopher/src/probes/extends/ebpf.probe/src/lib/util.c
.output .output/tcpprobe/ .output/killprobe/ .output/libbpf
tcpprobe/tcpprobe killprobe/killprobe /usr/bin/extends/ebpf.probe
mkdir -p /usr/bin/extends/ebpf.probe
cp tcpprobe/tcpprobe killprobe/killprobe /usr/bin/extends/ebpf.probe
[root@localhost ebpf.probe]#
# 清理编译过程
[root@localhost ebpf.probe]# ./build.sh -c
```
注:
1. bpf探针依赖libbpf开发库,./build.sh过程中会从git下载libbpf的稳定版本,编译环境要求能正常访问git;
2. bpf探针要求编译环境安装 elfutils-devel、clang、llvm等软件包,其中clang版本>=10.x.x,./build.sh中会检查安装;
## 如何新增probe程序
### 内核ebpf探针开发过程
1. 在src目录下创建一个独立目录, Makefile中增加新的探针;
```sh
# 1 killprobe为新增的探针目录
[root@localhost src]# ll
total 20K
drwxr-xr-x. 2 root root 4.0K Apr 24 02:09 include
drwxr-xr-x. 2 root root 4.0K Apr 24 05:33 killprobe
drwxr-xr-x. 2 root root 4.0K Apr 24 05:33 lib
-rw-r--r--. 1 root root 2.7K Apr 24 03:57 Makefile
drwxr-xr-x. 2 root root 4.0K Apr 24 05:33 tcpprobe
[root@localhost src]#
# 2 Makefile中增加killprobe探针, killprobe/killprobe /前为探针目录名,/后为探针名称(编译完成后,探针名称即为执行程序名);
[root@localhost src]# vim Makefile
# add probe
APPS := tcpprobe/tcpprobe \
killprobe/killprobe \
lvsprobe/trace_lvs \
haproxyprobe/trace_haproxy \
dnsmasqprobe/trace_dnsmasq \
nginxprobe/nginx_probe \
taskprobe/taskprobe \
```
2. 开发探针BPF代码,BPF源码文件名采用 *探针名*.bpf.c方式命名;
```sh
[root@localhost killprobe]# ll
total 1.6K
-rw-r--r--. 1 root root 1.3K Apr 24 02:09 killprobe.bpf.c
-rw-r--r--. 1 root root 294 Apr 24 02:09 killprobe.h
[root@localhost killprobe]#
```
1. - BPF程序开发SDK
```
#ifdef BPF_PROG_USER
#undef BPF_PROG_USER
#endif
#define BPF_PROG_KERN
#include "bpf.h" *SDK 头文件*
// kprobe/kretprobe/raw_trace 三种观测方式对应的API
#define KPROBE(func, type) // func 内核探针,BPF程序ctx类型
#define KRETPROBE(func, type) // func 内核探针,BPF程序ctx类型
#define KRAWTRACE(func, type) // func 内核探针,BPF程序ctx类型
举例:KPROBE(__x64_sys_kill, pt_regs) // 针对内核__x64_sys_kill完成kprobe方式观测
// 观测点读取参数API
PT_REGS_PARM1/2/3...6
// 内核同一个观测点,同时完成kprobe/kretprobe的API
#define KPROBE_RET(func, type)
举例:KPROBE_RET(tcp_v4_inbound_md5_hash, pt_regs) // 针对内核tcp_v4_inbound_md5_hash同时kprobe/kretprobe。
这种API一般用于观测点需要同时观测入参、返回值。
// 同时观测kprobe/kretprobe对应的读参API
#define PROBE_GET_PARMS(func, ctx, probe_val, caller_type)
#define PROBE_PARM1(probe_val)
...
...
#define PROBE_PARM5(probe_val)
PT_REGS_RC(ctx) // 读返回值
```
- BPF程序编译,编译过程完全自动化,build成功后,会产生相应的\*.skel.h、\*.bpf.o 文件。\*.skel.h文件内包括BPF程序的prog、map数据结构、程序加载、卸载等API。方便用户态程序对BPF程序进行操作。
```
在src/.output/killprobe下;
[root@localhost killprobe]# ll
total 17.6K
-rw-r--r--. 1 root root 3.6K Apr 24 05:41 killprobe.bpf.o
-rw-r--r--. 1 root root 14K Apr 24 05:41 killprobe.skel.h
```
3. 开发用户态程序;
探针用户态程序的目的是从BPF程序中获取观测数据。
```sh
[root@localhost ebpf.probe]# ll src/killprobe/
total 16K
-rw-r--r-- 1 root root 1.3K Nov 27 09:23 killprobe.bpf.c
-rw-r--r-- 1 root root 1.3K Nov 27 09:23 killprobe.c # 用户态程序
-rw-r--r-- 1 root root 274 Nov 27 09:23 killprobe.h
-rw-r--r-- 1 root root 749 Nov 27 09:23 killprobe.meta
```
- 用户态程序开发SDK
```
#ifdef BPF_PROG_KERN
#undef BPF_PROG_KERN
#endif
#ifdef BPF_PROG_USER
#undef BPF_PROG_USER
#endif
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
gala-gopher一款基于eBPF技术的探针框架,通过协同各种内核观测工具(包括CPU、网络、I/O、内存等)实现将操作系统运行状态白盒化呈现,并通过扩展能力提供系统性能瓶颈分析,应用性能劣化故障诊断等特性。gala-gopher集成了常用的native探针以及知名中间件探针;gala-gopher有良好的扩展性,能方便的集成各种类型的探针程序,发挥社区的力量丰富探针框架的能力
资源推荐
资源详情
资源评论
收起资源包目录
基于eBPF技术的探针框架,通过协同各种内核观测工具(包括CPU、网络、I/O、内存等)实现将操作系统运行状态白盒化呈现 (438个子文件)
bpftool_aarch64 3.75MB
bpftool_aarch64 1.79MB
bpftool_x86_64 4.01MB
bpftool_x86_64 2.53MB
dwarves.tar.bz2 743KB
stackprobe.c 49KB
imdb.c 39KB
symbol.c 28KB
container.c 21KB
ioprobe.c 21KB
tcp_probe.c 20KB
config.c 19KB
tcp.c 19KB
resource.c 18KB
proc_probe.c 18KB
system_procs.c 18KB
java_support.c 17KB
meta.c 16KB
debug_elf_reader.c 16KB
profiling_event.c 16KB
system_net.c 15KB
event2json.c 15KB
ksliprobe.bpf.c 15KB
endpoint.c 15KB
containerd_probe.c 14KB
elf_symb.c 13KB
pgsliprobe.c 13KB
test_imdb.c 13KB
probe.c 13KB
system_cpu.c 13KB
ingress.c 12KB
tcp.bpf.c 12KB
tprofiling.c 11KB
daemon.c 11KB
test_probes.c 11KB
system_disk.c 11KB
schedprobe.c 11KB
flame_graph.c 10KB
stackprobe_config.c 10KB
gopher_elf.c 10KB
object.c 10KB
tcp_abn.bpf.c 10KB
redissli.bpf.c 10KB
system_os.c 10KB
tcp_fd.c 9KB
kafkaprobe.bpf.c 9KB
whitelist_config.c 9KB
svg.c 8KB
memleak_glibc.bpf.c 8KB
event.c 8KB
memleak_fp.bpf.c 8KB
tcp_event.c 8KB
args.c 8KB
kprobe.bpf.c 8KB
proc_info.c 8KB
sched_systime.bpf.c 8KB
taskprobe.c 8KB
loader.c 8KB
trace_haproxy.c 8KB
tc_loader.c 8KB
trace_lvs.c 8KB
ksliprobe.c 7KB
jvm_agent.c 7KB
elf_reader.c 7KB
util.c 7KB
kafka.c 7KB
jvm_attach.c 7KB
event_config.c 7KB
nginx_probe.c 7KB
trace_lvs.bpf.c 7KB
io_err.bpf.c 7KB
httpprobe.c 6KB
nsprobe.c 6KB
pgsli_kprobe.bpf.c 6KB
kern_symb.c 6KB
page_cache.bpf.c 6KB
redissli.c 6KB
oncpu.bpf.c 6KB
proc_io.bpf.c 6KB
tcp_link.bpf.c 6KB
trace_dnsmasq.c 6KB
nginx_probe.bpf.c 6KB
offcpu.bpf.c 6KB
udp.bpf.c 6KB
system_meminfo.c 6KB
server.c 5KB
fd_info.c 5KB
client.c 5KB
sched_syscall.bpf.c 5KB
tcp_rate.bpf.c 5KB
virt_proc.c 5KB
extend_probe.c 5KB
qdisc.bpf.c 5KB
statistic.c 5KB
test_logs.c 5KB
cgprobe.bpf.c 5KB
trace_haproxy.bpf.c 5KB
egress.c 5KB
thread_probe.c 5KB
tcp_sockbuf.bpf.c 5KB
共 438 条
- 1
- 2
- 3
- 4
- 5
资源评论
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6732
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功