2022/02/15

[Linux] Run eBPF with Linux Kernel v5.16 on Ubuntu 21.10

有鑒於eBPF相關的架構都還在開發中,這邊紀錄了目前編譯成功且能夠執行的版本。

系統需求:Ubuntu 21.10 (因為需要clang-13,且至少70GB以上的硬碟空間)

如同目前Linux官方文件上說,需要clang-13+的版本才能編譯eBPF的code。所以在這裡使用了還在開發中的Ubuntu 21.10,但只要是有clang-13+的作業系統版本應該都適用。

整個流程主要參考Cilium的BPF and XDP Reference Guide,加上一些網路找的bug fix posts。

首先要安裝必要的套件

$ sudo apt-get install build-essential git make libelf-dev clang strace tar bpfcc-tools linux-headers-$(uname -r) gcc-multilib dwarves fakeroot libncurses5-dev libssl-dev ccache zstd flex bison libcap-dev
$ sudo apt-get install gcc bc llvm pkg-config libmnl-dev graphviz cmake
$ sudo apt install m4 libpcap-dev binutils-dev libreadline-dev python3-docutils

然後下載目前的核心版本
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git
$ git checkout v5.16
$ cp /boot/config-`uname -r` .config
$ yes '' | make oldconfig

因為沒有SYSTEM_TRUSTED_KEYS,所以要取代本來的.config
$ scripts/config --set-str SYSTEM_TRUSTED_KEYS ""
$ scripts/config --set-str SYSTEM_REVOCATION_KEYS ""

編譯及安裝v5.16
$ make -j `getconf _NPROCESSORS_ONLN` deb-pkg LOCALVERSION=-ebpf
$ sudo dpkg -i linux-image-5.16.0-*_5.16.0-*_amd64.deb
$ sudo dpkg -i linux-headers-5.16.0-*_5.16.0-*_amd64.deb
$ sudo dpkg -i linux-libc-dev_5.16.0*_amd64.deb

設定開機到核心v5.16,更改開機選單可以參考這篇

接著安裝libbpf
$ git clone https://github.com/libbpf/libbpf.git
$ cd libbpf/src
$ PKG_CONFIG_PATH=/build/root/lib64/pkgconfig DESTDIR=/build/root make install

因為在編譯eBPF的過程中Upstream上目前的Makefile還有些路徑問題,所以會導致缺少include檔案。
$ cd net-next
$ mkdir -p include/asm
$ cp /usr/src/linux-headers-5.16.0-ebpf/arch/x86/include/generated/uapi/asm/* include/asm
$ cp /usr/src/linux-headers-5.16.0-ebpf/arch/x86/include/generated/asm/* include/asm
$ cp /usr/src/linux-headers-5.16.0-ebpf/include/generated/* include/generated

還有必要的tools:
$ cd net-next/tools/bpf/bpftool/
$ make
$ sudo make install

$ cd net-next/tools/objtool/
$ make
$ sudo cp objtool /usr/local/sbin/

$ cd net-next/
$ cp /usr/src/linux-headers-5.16.0-ebpf/scripts/genksyms/genksyms scripts/genksyms
$ cp /usr/src/linux-headers-5.16.0-ebpf/scripts/mod/modpost scripts/mod
$ cp /usr/src/linux-headers-5.16.0-ebpf/scripts/module.lds scripts/
$ cp /usr/src/linux-headers-5.16.0-ebpf/Module.symvers .

最後就可以開始編譯eBPF selftests
$ cd tools/testing/selftests/bpf/
$ make V=1
$ sudo ./test_verifier

跑完後應該可以順利看到像這個結果:
Summary: 1309 PASSED, 628 SKIPPED, 0 FAILED

這樣代表就完成了。

沒有留言:

張貼留言