抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

是什么

eBPF 是extended Berkeley Packet Filter(扩展的伯利克数据包过滤器)的缩写,从字面意思理解,eBPF 就是一个过滤器(Filter)。功能类似于现代化HOOK框架。

eBPF的出现给 Linux内核带来了创新。扩展设计的高效BPF字节码表示,配合全新设计的BPF字节码执行虚拟机,形成了一个功能强大的BPF子系统。所有的eBPF程序运行在这个虚拟机中,就像运行在沙盒环境中一样,不会对系统内核的稳定性造成任何伤害。eBPF虚拟机在保证系统稳定与安全的前提下,高效地执行 BPF字节码,引入的BPF挂载点可以让eBPF程序在系统的各个角落中得以执行,对于多数程序来说,它的执行是无侵入性的。

如何运行

EBPF是事件驱动的,使用Hook技术,当内核或者应用程序运行到某个Hook点时启动。

Hook点包括:系统调用函数出入口内核跟踪函数网络事件

与传统Hook技术的区别是,这些Hook点需要Linux内核相应的子系统做相应的代码补和调整,添加一个eBPF执行虚拟机。将eBPF代码编译成字节码后挂载到特定的内核地址,当Linux内核执行命中时,由eBPF虚拟机来加载执行。不同的程序类型可以在不同的eBPF挂载点上执行

工具库

eBPF作为BPF的扩展版本,执行的实体同样为一条条的 BPF指令。我们一般通过 BCC、bpftrace、libbpf等项目间接使用eBPF。

这些项目提供了高级语言接口,如C&C++Python、Go来支持eBPF程序逻辑的开发,然后使用LLVM将其编译成eBPF字节码,具体过程是在编译eBPF源程序时指定clang-target bpf参数。这些工具与库降低了eBPF的使用成本,

BCC

BCC是BPF编译器集合,是最早开发BPF跟踪程序的高级框架。BCC简化了用C语言编写eBPF程序的过程,通过类似于LLVM的编译器套件,还支持使用Python、Lua、C&C++等语言进行eBPF程序开发。

bpftrace

bpftrace 是一种高级跟踪语言,为创建eBPF程序提供了便捷的高级语言支持,适用于Linux 4.x及更高版本。bpftrace采用LLVM作为后端,将脚本编译为eBPF字节码,并利用BCC与Linux BPF进行交互,从而以cBPF方式灵活使用现有的Linux跟踪功能:内核动态跟踪(kprobe)、用户级动态跟踪(uprobe)和跟踪点。
bpftrace 基于eBPF和BCC实现通过探针(probe)技术跟踪内核和程序的运行时信息,然后通过内建的图表方式展示出来,满足使用者不同的跟踪、性能分析等需求。

libbpf

eBPF程序注入内核后可以访问所有的内核空间。但同时也带来了一些负担,如eBPF程序无法控制周围内核环境的内存布局,因此必须依赖独立开发、编译和部署的内核,从而导致可移植性问题。此外,内核类型和数据结构会不断变化,这些内核结构体中的字段可能会被重命名或删除。换句话说,不同内核发布版本中的所有内容都有可能发生变化。这些因素给eBPF的可移植性带来了挑战。
libbpf的出现正是为了解决eBPF的可移植性问题,使其可以像应用程序一样,一次编译后可放到不同的机器、不同内核版本的系统中运行。libbpf支持构建 BPF CO-RE(Compile Once- Run Everywhere,一次编译、到处运行)应用程序。与BCC相比,它不需要将Clang/LLVM运行时部署到目标服务器,也不依赖于可用的内核开发头文件。

环境搭建

ubuntu22.04

安装BCC

1
sudo apt-get install bpfcc-tools linux-headers-$(unmae -r) libbpfcc-dev -y

安装bpftrace

1
sudo apt-get install -y bpftrace

安装libbpf

1
2
3
4
sudo apt-get install -y libbpf-dev
sudo apt-get install -y apt-file
sudo apt-file update
#执行apt-file list命令验证

以源码方式安装eBPF开发工具与库

bcc编译安装

安装依赖

1
sudo apt install -y bison build-essential cmake flex git libedit-dev liblzma-dev \libllvm14 llvm-14-dev libclang-14-dev python3 zlib1g-dev libelf-dev libfl-dev python3-distutils

git获取编译

1
2
3
4
5
6
7
8
9
10
git clone https://github.com/iovisor/bcc.git
mkdir bcc/build; cd bcc/build
cmake .. -DENABLE_LLVM_SHARED=1
make
sudo make install
cmake -DPYTHON_CMD=python3 -DENABLE_LLVM_SHARED=1 ..
pushd src/python/
make
sudo make install
popd

bpftrace编译安装

评论