重新编译内核主要是为了使用libbpf,日后也可以再使用rust::redbpf
内核有几个分支
mainline指由Linus Torvalds亲自制作的内核发布版,是官方当前最新版本的kernel source。在Torvalds对所有其他程序员所做出的重大变化进行整合,并且对先前版本的bug进行几轮修复之后,大约每十周正式发布一个新版本。mainline事实上代表着一个linux kernel分支,这个分支有另一个名称,叫做vanilla。
longterm,是Long Term Support的缩写,长期维护的意思。
stable顾名思义 稳定版
linux-next和snapshot,都是代码提交周期结束之前生成的快照 用于给Linux代码贡献者们做测试。
这里使用镜像站下载Index of /sites/ftp.kernel.org/pub/linux/kernel/
选择了5.13版本的源码
这里使用的是Ubuntu20.04,移入后解压即可
sudo apt install build-essential flex bison dwarves libssl-dev libelf-dev
wsl的内核配置文件来自WSL2-Linux-Kernel/config-wsl at linux-msft-wsl-5.15.y · microsoft/WSL2-Linux-Kernel · GitHub
虽然这里写的是5.15版本,不过与5.10branch中对比没有变化,应该可以用于各个5.x版本
在解压后的根目录创建kernel.config文件并将上述文件内容粘贴进去
首先是我们重新编译的目标:CONFIG_DEBUG_INFO_BTF=y,搜索发现已经加入到配置文件中了,看来是我原来的内核版本太旧了
GCC配置
通用设置
IRQ=中断子系统
timer子系统
BPF子系统:
CONFIG_BPF_SYSCALL=y就允许XDP使用了
JIT是即时编译的意思,是另一种更快编译和执行BPF程序的方法一文读懂eBPF|即时编译(JIT)实现原理 - 腾讯云开发者社区-腾讯云
略过...
CONFIG_XDP_SOCKETS允许AF_XDP的使用,它是使用XDP技术实现的协议族,我们暂时不管这个选项
How to build a kernel with XDP support - Unweaving the web
官方指南中给出了编译的命令make KCONFIG_CONFIG=Microsoft/config-wsl
我们改成
make KCONFIG_CONFIG=kernel.config -j8
修改了配置文件和线程数,执行后一路回车默认(其中有个VFIO,可能与DPDK那边相关,遇到再说)
编译后的文件在arch/x86/boot/bzImage,替换C:\Windows\System32\lxss\tools\kernel并重新启动wsl即可
1.使用libbpf-bootstrap的minimal测试,按README操作即可,需要注意如果./minimal不能执行可能是tracefs和debugfs默认没有挂载,需要执行
mount -t tracefs nodev /sys/kernel/tracing
mount -t debugfs none /sys/kernel/debug/
成功按照预期执行