跳到主要内容

记录一下 WSL2 更换内核的过程

· 阅读需 5 分钟
Muel - Nova

最近准备开始看 Kernel Pwn 了,但是 wsl2 的内核似乎并不是原版的,所以进行一个替换。

前置条件

确保你使用了 WSL2 而不是 WSL,且 Windows 版本符合 Windows 内部版本 19041 及更高版本

确认内核版本

首先先确认一下自己的内核版本。

我安装过 neofetch 所以直接用 neofetch 了,也可以使用 cat /proc/version 或者 uname -a 这些指令来查看。

原本的内核是 5.15.79.1 版本的。

kernel_version

选择内核版本

我安装 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

image-20230213122206839

修改内核

将其复制到你想要的位置。在我的案例中,我将其复制到了 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

image-20230213123158068

Loading Comments...