记录一下 WSL2 更换内核的过程
最近准备开始看 Kernel Pwn 了,但是 wsl2 的内核似乎并不是原版的,所以进行一个替换。
前置条件
确保你使用了 WSL2 而不是 WSL,且 Windows 版本符合 Windows 内部版本 19041 及更高版本
确认内核版本
首先先确认一下自己的内核版本。
我安装过 neofetch
所以直接用 neofetch
了,也可以使用 cat /proc/version
或者 uname -a
这些指令来查看。
原本的内核是 5.15.79.1
版本的。
选择内核版本
我安装 wsl2 的时候 Ubuntu 版本是 22.04.1 LTS
,截至目前 2023/02/13
的最新内核版本是 6.1.9
,两者兼容,所以就直接上最新版了。
如果存在不兼容的问题:例如想要给 Ubuntu16 安装 6.X 版本内核,那么你就需要先升级 Ubuntu 版本了,否则直接打不开 ww
在 The Linux Kernel Archives 下载内核,我用的是 镜像站
# Replace the filename and the folder name accroding to your cases!
curl -LO https://mirrors.edge.kernel.org//pub/linux/kernel/v6.x/linux-6.1.9.tar.gz
tar xf linux-6.1.9.tar.gz
cd linux-6.1.9
使用 WSL2-Linux-Kernel 配置文件
这个 .config
文件针对 wsl2
做出了调整与优化。尽管直到我安装时,它的分支仍然是 linux-msft-wsl-5.15.y
,也就是针对 5.15
内核的编译选项,但是仍然适用于我所安装的 6.1.9
版本内核。
curl https://raw.githubusercontent.com/microsoft/WSL2-Linux-Kernel/linux-msft-wsl-5.15.y/Microsoft/config-wsl >> .config
(可选) 调整配置文件
我修改了 .config
文件里的 CONFIG_LOCALVERSION
字段,以表明内核特点,你也可以在里面修改更多。
编译内核
因为我们已经有了 .config
文件,所以直接 make
一把梭就好了。
在这之前,确认你已安装了所有的依赖项。你可以通过以下指令来安装。
sudo apt install build-essential flex bison dwarves libssl-dev libelf-dev
# Go https://github.com/microsoft/WSL2-Linux-Kernel#build-instructions to see the latest build dependencies
在这里,请按照你自己的配置修改 jobs 的数量。
我的 CPU i7-12700F
拥有 12 核 20 线程,所以我可以使用 -j20
选项
sudo make -j20 && sudo make modules -j20 && sudo make modules_install -j20 && sudo make install -j20
在编译前,它会有很多配置项(即在 .config
内没有指定的新内核的配置项)要你指定,没有特殊需求的话一路回车即可。
耐心等待安装完成后,可以在标准输出内找到类似字段。 Kernel:
后的路径即为内核路径。
Kernel: arch/x86/boot/bzImage is ready (#2)
DESCEND objtool
DESCEND bpf/resolve_btfids
CALL scripts/checksyscalls.sh
DEPMOD /lib/modules/6.1.9-linux-standard-WSL2
INSTALL /boot
修改内核
将其复制到你想要的位置。在我的案例中,我将其复制到了 E:\Ubuntu-2204LTS\linux_kernel_6.1.9
注意这个位置应该存在于你的主硬盘而不是 wsl 中
cp arch/x86/boot/bzImage /mnt/E/Ubuntu-2204LTS/linux_kernel_6.1.9
打开你的用户目录,修改 .wslconfig
文件,在 [wsl2]
标签中添加 kernel
字段,它的值为带有转义反斜杠的 Windows 路径。
例如,在我的案例中, .wslconfig
文件长这个样子。
[wsl2]
kernelCommandLine = vsyscall=emulate
kernel=E:\\Ubuntu-2204LTS\\linux_kernel_6.1.9
[user]
default=root
你可以通过 Win+R
输入 %USERPROFILE
打开用户目录,通常,它位于 C:\Users\<YOUR_USER_NAME>\
下。
如果不存在 .wslconfig
文件,那就创建它。
如果不存在 [wsl2]
标签,那就创建它。
重启 wsl
现在,重启你的 wsl2,重新查看内核版本。
如果不出意外,你的内核应该已经修改成功了。
wsl --shutdown
wsl