在wsl 中输入uname -r发现内核版本竟然是5.15.146.1-microsoft-standard-WSL2还停留在5.15.y这能忍?我决定自行编译6.6的内核并替换原版。虽然现在最新版是6.9-rc3但6.6版本是高贵的LTS版本!

下载Linux源代码

打开kernel.org
就可以看到linux打包后的源代码文件了,选择一个下载。内核下载

下载微软的内核config文件

由于wsl的内核都是经过定制的,我们编译好的内核想要在wsl中使用,需要在编译的时候使用微软wsl-kernel
项目提供的config文件。6.1.y的config文件可以在这里找到wsl-kernel

编译

我们将使用wsl子系统进行编译,我这里使用的是全新安装的ubuntu2204版本先安装编译工具

1
sudo apt install build-essential flex bison dwarves libssl-dev libelf-dev bc

然后我们先将下载好的源代码拷贝进来,或者也可以直接在子系统内下载
6.6版本

1
2
3
4
5
6
7
8
cd ~
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.26.tar.xz
tar -xvf linux-6.6.26.tar.xz
cd linux-6.6.26/
mkdir Microsoft
wget https://cdn.jsdelivr.net/gh/microsoft/[email protected]/arch/x86/configs/config-wsl -O ./Microsoft/config-wsl
# make KCONFIG_CONFIG=Microsoft/config-wsl
make KCONFIG_CONFIG=Microsoft/config-wsl -j$(nproc)

6.1.y版本

1
2
3
4
5
6
7
cd ~
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.85.tar.xz
tar -xvf linux-6.1.85.tar.xz
cd linux-6.1.85/
mkdir Microsoft
wget https://cdn.jsdelivr.net/gh/microsoft/[email protected]/arch/x86/configs/config-wsl -O ./Microsoft/config-wsl
make KCONFIG_CONFIG=Microsoft/config-wsl -j$(nproc)

编译的开始可能会有一些内核编译选项让我们选择,我们一路回车用默认设置即可。

替换默认内核

通常情况下编译完成的内核会在arch/x86/boot下有个名为bzImage的文件。这就是我们的成果。我们将其复制出来,例如

1
mv ./bzImage /mnt/c/

这就将它复制到了c盘下,然后我们打开.wslconfig文件,对其作如下修改,注意路劲中的\要用\\替换。

1
2
[wsl2]
kernel = the\\path\\to\\bzImage

然后用wsl --shutdown将子系统关闭后再启动就能用上自己编译的新内核了!

经过修改的内核

网络上有很多大神对linux做了很多优化,我们可以选择这些内核将wsl的内核替换。例如Xanmod
我们可以在github上找到为wsl2适配好的版本。例如我们选择新鲜出炉的最新版本编译好的文件,下载编译好的bzImage文件,放到我们想要的位置,再修改.wslconfig,重启wsl就能看到使用的内核已经变了。
uname -r

结语

经过实践,可以发现wsl2替换内核还是很方便的。