Skip to content

Latest commit

 

History

History
185 lines (127 loc) · 6.13 KB

File metadata and controls

185 lines (127 loc) · 6.13 KB

eBPF 开发环境配置

说明介绍

这里介绍如何搭建 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 能跑就行,无需在意配置

Ubuntu 软件包

安装以下软件包以便编译和运行 eBPF 程序:

1、 Linux 内核的头文件,用于针对特定内核版本构建 eBPF 程序.

sudo apt install linux-headers-$(uname -r)

2、 libbpfcc 库,提供了一个更高级的接口来编写和编译 eBPF 程序. 它包含了 eBPF 开发所需的工具和实用程序.

sudo apt install libbpfcc-dev

3、 libbpf 库,提供了与 eBPF 程序和映射交互的低级接口. 它提供了加载、验证和执行 eBPF 程序的功能.

sudo apt install libbpf-dev

4、 llvm,这是一套模块化和可重用的编译器和工具链技术. 它包括 eBPF 程序编译所需的 LLVM 基础设施.

sudo apt install llvm

5、 clang 编译器前端,用于 CC++ 编程语言. 它支持编译 eBPF 程序.

sudo apt install clang

6、 gcc-multilib 包允许你在单台机器上为多种架构编译和构建软件. 它提供了为不同目标架构生成可执行文件和库的支持. 如果你计划开发或构建针对多种架构的软件,可以安装这个包.

sudo apt install gcc-multilib

7、 build-essential 包是 Ubuntu 上构建软件所需的基本软件包和工具的集合. 它包括 GCC 编译器、基本库和像 make 这样的构建相关工具. 虽然不是专门用于 eBPF 开发,但安装 build-essential 对一般开发目的来说很方便.

sudo apt install build-essential

8、 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

我们还需要安装 Go. 推荐的安装方式如下:

sudo add-apt-repository ppa:longsleep/golang-backports
sudo apt update
sudo apt install golang-go

这样就可以在使用类似 sysupdate 的工具时,始终保持最新版本.

Go 包

在我们的项目中,我们将使用以下 Go 包:

  1. netlink:netlink 是 Linux 中_用户空间_程序与内核通信的接口. 它可用于添加和删除接口、设置 IP 地址和路由,以及配置 IPsec. Netlink 通信需要提升的权限,所以在大多数情况下,使用这个库的代码需要以 root 身份运行.

  2. gopacket:gopacket 允许你高效地捕获、解码和分析网络数据包. 这个包对网络监控、数据包构建和网络安全应用很有用.

  3. gopacket/layers:layers 提供了创建和操作网络层_头部_的功能,以及处理 IP 地址、IP 协议号和其他网络相关数据的实用函数.

  4. ebpf:ebpf 为 eBPF 程序和映射提供了高级 API,让我们可以从 Go 应用程序中与它们交互. 它包括加载编译以及将 eBPF 程序附加到内核中各种钩子的功能,还可以访问 eBPF 映射. 此外,它还附带了 bpf2go,这是一个命令行工具,用于生成 eBPF 程序的 Go 绑定. 它将 C 代码编译成 eBPF 字节码,然后嵌入到 Go 文件中.

  5. ebpf/perf:perf 提供了一套工具,用于将自定义的 perf_events 提交到由用户空间设置的环形缓冲区,使我们能够使用 eBPF 映射在_内核空间_程序和_用户空间_程序之间发送和接收数据.

  6. 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/unix

eBPF 生态系统


eBPF 生态系统在不断发展,可能在这里演示的完全相同的内容在未来某个时候可能不再适用.

当前使用的操作系统、软件版本和库:

  • 操作系统: 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

只要掌握原理就是了,所谓一代版本一代神,代代版本靠底层