这里介绍如何搭建 eBPF 开发环境, 抄的Setup an eBPF Development Environment
我当前的配置如下:
硬件信息
硬件型号: Intel_R_ Client Systems NUC8i7HVK
内存: 32.0 GiB
处理器: Intel® Core™ i7-8809G × 8
显卡: AMD Radeon™ RX Vega M GH Graphics
显卡 1: Intel® HD Graphics 630 (KBL GT2)
磁盘容量: 1.0 TB
软件信息
固件版本: HNKBLi70.86A.0067.2021.0528.1339
操作系统名称: Ubuntu 24.04.1 LTS
操作系统类型: 64 位
GNOME 版本: 46
窗口系统: X11
内核版本: Linux 6.8.0-45-generic
linux 能跑就行,无需在意配置
安装以下软件包以便编译和运行 eBPF 程序:
1、 Linux 内核的头文件,用于针对特定内核版本构建 eBPF 程序.
sudo apt install linux-headers-$(uname -r)2、 libbpfcc 库,提供了一个更高级的接口来编写和编译 eBPF 程序. 它包含了 eBPF 开发所需的工具和实用程序.
sudo apt install libbpfcc-dev3、 libbpf 库,提供了与 eBPF 程序和映射交互的低级接口. 它提供了加载、验证和执行 eBPF 程序的功能.
sudo apt install libbpf-dev4、 llvm,这是一套模块化和可重用的编译器和工具链技术. 它包括 eBPF 程序编译所需的 LLVM 基础设施.
sudo apt install llvm5、 clang 编译器前端,用于 C 和 C++ 编程语言. 它支持编译 eBPF 程序.
sudo apt install clang6、 gcc-multilib 包允许你在单台机器上为多种架构编译和构建软件. 它提供了为不同目标架构生成可执行文件和库的支持. 如果你计划开发或构建针对多种架构的软件,可以安装这个包.
sudo apt install gcc-multilib7、 build-essential 包是 Ubuntu 上构建软件所需的基本软件包和工具的集合. 它包括 GCC 编译器、基本库和像 make 这样的构建相关工具. 虽然不是专门用于 eBPF 开发,但安装 build-essential 对一般开发目的来说很方便.
sudo apt install build-essential8、 linux-tools 提供了一系列工具,这些工具对 Ubuntu 系统上的_内核级开发_、_性能分析_和_故障排除_非常有用. 这些工具可以帮助你处理 eBPF 程序和其他与内核相关的任务. 其中一个典型例子就是我们熟悉的 perf.
sudo apt install linux-tools-$(uname -r)9、 bpftool 是 Linux 内核中 BPF(Berkeley Packet Filter)子系统的一部分,是一个命令行工具. 它允许用户与 eBPF 程序、映射和其他 BPF 相关实体进行交互和管理. 我们稍后会用到这个工具. 点击这里可以了解更多.
sudo apt install linux-tools-common linux-tools-generic为了方便起见,这里列出了所有必需的命令:
sudo apt install linux-headers-$(uname -r)
sudo apt install libbpfcc-dev
sudo apt install libbpf-dev
sudo apt install llvm
sudo apt install clang
sudo apt install gcc-multilib
sudo apt install build-essential
sudo apt install linux-tools-$(uname -r)
sudo apt install linux-tools-common
sudo apt install linux-tools-generic我们还需要安装 Go. 推荐的安装方式如下:
sudo add-apt-repository ppa:longsleep/golang-backports
sudo apt update
sudo apt install golang-go这样就可以在使用类似 sysupdate 的工具时,始终保持最新版本.
在我们的项目中,我们将使用以下 Go 包:
-
netlink:netlink 是 Linux 中_用户空间_程序与内核通信的接口. 它可用于添加和删除接口、设置 IP 地址和路由,以及配置 IPsec.
Netlink通信需要提升的权限,所以在大多数情况下,使用这个库的代码需要以 root 身份运行. -
gopacket:gopacket 允许你高效地捕获、解码和分析网络数据包. 这个包对网络监控、数据包构建和网络安全应用很有用.
-
gopacket/layers:layers 提供了创建和操作网络层_头部_的功能,以及处理 IP 地址、IP 协议号和其他网络相关数据的实用函数.
-
ebpf:ebpf 为 eBPF 程序和映射提供了高级 API,让我们可以从 Go 应用程序中与它们交互. 它包括加载、编译以及将 eBPF 程序附加到内核中各种钩子的功能,还可以访问 eBPF 映射. 此外,它还附带了
bpf2go,这是一个命令行工具,用于生成 eBPF 程序的 Go 绑定. 它将 C 代码编译成 eBPF 字节码,然后嵌入到 Go 文件中. -
ebpf/perf:perf 提供了一套工具,用于将自定义的 perf_events 提交到由用户空间设置的环形缓冲区,使我们能够使用 eBPF 映射在_内核空间_程序和_用户空间_程序之间发送和接收数据.
-
unix:unix 包含用于处理 Unix 域套接字、进程管理和其他 Unix 特定功能的包. 当我们需要与 Unix 系统交互或将 Unix 特定代码移植到 Go 时,这些包很有用.
这些包可以通过以下命令安装:
go get github.com/vishvananda/netlink
go get github.com/google/gopacket
go get github.com/google/gopacket/layers
go get github.com/cilium/ebpf
go get github.com/cilium/ebpf/perf
go get golang.org/x/sys/unixeBPF 生态系统在不断发展,可能在这里演示的完全相同的内容在未来某个时候可能不再适用.
当前使用的操作系统、软件版本和库:
-
操作系统: Ubuntu 24.04.1 LTS
-
内核: 6.8.0-45-generic
-
Go: 1.22.4 linux/amd64
-
eBPF 包: v0.16.0
-
gopacket 包: v1.1.19
-
netlink 包: v1.3.0
-
bpftool: v7.4.0
-
LLVM: 18.0
-
Clang: 18.1.3 x86_64-pc-linux-gnu
-
GCC: 13.2.0
只要掌握原理就是了,所谓一代版本一代神,代代版本靠底层