Linux内核代码提供了很多eBPF的示例代码(以linux6.1版本内核代码为例),我们可以在/Linux/samples/bpf目录下找到示例代码。
1、查看Linux内核版本
本文不讨论交叉编译的情况,因为eBPF还在快速发展中,不同版本的Linux内核的支持情况不太一至。所以第一步,我们需要通过uname命令查看本机的Linux内核版本号,以便下面几个步骤的开展。
pi@raspberrypi:/usr/src/linux-6.1/samples/bpf $ uname -a
Linux raspberrypi 6.1.21+ #1642 Mon Apr 3 17:19:14 BST 2023 armv6l GNU/Linux
2、下载linux内核代码
Linux内核代码托管在github里,我们可以通过左边的master这里下拉后,找到第1章里查询出来的当前linux内核对应版本的内核代码。如下图单击选择v6.1版本。
然后在左边code这个下拉框里选择Download ZIP直接下载或者复制HTTPS那里的URL后通过git下载源代码到本地主机。
3、拷贝并安装源代码
这一步很简单,直接将下载下来的文件直接拷贝或者解压缩到/usr/src目录下则可。
pi@raspberrypi:~ $ sudo unzip ./linux-6.1.zip -d /usr/src/
解压完成后如下命令查看,如果看到有/usr/src/linux-6.1/samples目录,则说明内核源代码已经正确安装好。
pi@raspberrypi:~ $ cd /usr/src/linux-6.1/samples/
pi@raspberrypi:/usr/src/linux-6.1/samples $ ls -l | grep bpf
drwxr-xr-x 2 root root 4096 May 25 13:36 bpf
4、配置编译环境
sudo apt install make
sudo apt install clang
sudo apt install llvm
sudo apt install gcc
sudo apt install flex
sudo apt install bison
sudo make defconfig
sudo make headers_install
sudo make modules_prepare
sudo cp /sys/kernel/btf/vmlinux /usr/src/linux-5.19
sudo ln -s ./x86_64-linux-gnu/sys/ ./sys
sudo ln -s /usr/include/linux/capability.h /usr/include/sys/capability.h
sudo ln -s /usr/lib/x86_64-linux-gnu/libcap.so.2.44 /usr/lib/libcap.so
sudo ln -s /usr/src/linux-5.19/include/asm-generic/ /usr/src/linux-5.19/include/include/asm
sudo ln -s /usr/src/linux-5.19/samples/bpf/Module.symvers /usr/src/linux-5.19
5、编译
注意上面第4步的各个步骤都要做一下,否则会出现种头文件找不到,库文件找不到的错误。
然后运行以下命令后就可以把所有示例代码编译成功。
sudo make M=samples/bpf