在 WSL2 的 Arch Linux 下编译并替换内核
2022-01-29 07:05:05

闲来无事,想把 WSL2 的 kernel 升级一下。GitHub 中微软官方发布的 WSL2 kernel 最新版本为5.10.74.3,但是 Microsoft Update Catalog 中一直没有相应版本的安装包(截止本文发布)

于是打算自己动手编译一下

编译环境

WSL2 下的 Arch Linux

image-20220129195006232

编译内核

整体编译思路就是利用微软的编译配置文件来编译 Linux kernel,并在相应的 Windows 目录下替换现有的内核

这里放一下 GitHub 中的 WSL2-Linux-Kernel

下载源码

在 GitHub 下载相应版本的 releases

1
wget https://github.com/microsoft/WSL2-Linux-Kernel/archive/refs/tags/linux-msft-wsl-5.10.74.3.tar.gz

下载完成后解压缩并进入目录

1
2
tar zxvf linux-msft-wsl-5.10.74.3.tar.gz
cd WSL2-Linux-Kernel-linux-msft-wsl-5.10.74.3/

为确保内核树绝对干净,进入内核目录并执行make mrproper命令

1
make clean && make mrproper

安装编译工具

微软也在项目里告知了步骤,其中也包括编译工具

image-20220129183105502

这个不能照葫芦画瓢直接复制下来,需要在 ArchWiki 中找一下 Arch Linux 中的包

build-essentialflexbison都集成在 Arch Linux 的base-devel里了,其他两个也有相对应的包

1
sudo pacman -S base-devel openssl libelf pahole xmlto kmod inetutils bc

关于pahole

在多次编译时,最终都会报错

1
2
3
BTF: .tmp_vmlinux.btf: pahole (pahole) is not available
Failed to generate BTF for vmlinux
Try to disable CONFIG_DEBUG_INFO_BTF

一种方法是在Microsoft/config-wsl中对CONFIG_DEBUG_INFO_BTF设置关闭

✨ 另一种方法是下载pahole,此方法取自 Stack Overflow,其他发行版遇到此问题也可以看一下


关于其余四个包:

ArchWiki 推荐


2022-02-08更新:

在最新推出的5.10.93.2版本中,官方修复了关于以上提到的BTF报错,针对 Ubuntu 给出依赖项dwarves

image-20220208151648920

image-20220208151617183


修改编译配置文件

打开Microsoft/config-wsl文件,把内核号修改了一下,改成自己的名字

image-20220129200205133

开始编译

1
make KCONFIG_CONFIG=Microsoft/config-wsl -j

编译开始时会出现编译选项,全部按照默认就可以了

image-20220129200241690

然后就可以等着编译完成了


可以看到编译完成的内核所在的路径为arch/x86/boot/bzImage

image-20220129201037392

image-20220129201122975

这就是编译好的 WSL2 的内核了

替换内核

WSL2 使用的内核是放在 Windows 目录下的C:\WINDOWS\System32\lxss\tools

只需要把编译好的bzImage复制到此路径下,并更名为kernel即可

image-20220129191238317

可以使用文件管理器复制内核

1
explorer.exe .

关闭所有 WSL,并将bzImage复制到C:\WINDOWS\System32\lxss\tools下并更名为kernel

替换内核前需要将所有 WSL 关闭

image-20220129201443082


启动 Arch Linux,并截图

image-20220129201701803

🌈 可以看到内核已经替换为5.10.74.3版本了