Linux内核入门及WSL2上的重编译笔记

公良扬
2023-12-01

重新编译内核主要是为了使用libbpf,日后也可以再使用rust::redbpf

内核源码下载

官网:The Linux Kernel Archives

内核有几个分支

mainline

mainline指由Linus Torvalds亲自制作的内核发布版,是官方当前最新版本的kernel source。在Torvalds对所有其他程序员所做出的重大变化进行整合,并且对先前版本的bug进行几轮修复之后,大约每十周正式发布一个新版本。mainline事实上代表着一个linux kernel分支,这个分支有另一个名称,叫做vanilla。

longterm

longterm,是Long Term Support的缩写,长期维护的意思。

stable

stable顾名思义 稳定版

linux-next、snapshot

linux-next和snapshot,都是代码提交周期结束之前生成的快照 用于给Linux代码贡献者们做测试。

这里使用镜像站下载Index of /sites/ftp.kernel.org/pub/linux/kernel/

选择了5.13版本的源码

移入已有的linux子系统中

这里使用的是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/

成功按照预期执行

 类似资料: