有鑒於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
這樣代表就完成了。
參考連結:
- https://www.ebpf.top/post/ebpf_c_env/
- SYSTEM_TRUSTED_KEYS: https://askubuntu.com/questions/1329538/compiling-the-kernel-5-11-11
- BPF and XDP Reference Guide: https://docs.cilium.io/en/stable/bpf/
沒有留言:
張貼留言