跳到主要内容

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

· 阅读需 5 分钟
Muel - Nova
Anime Would PWN This WORLD into 2D
🤖AI Summary

博客作者 nova 记录了在使用 WSL2(Windows 子系统 Linux 2)时,如何更换内核的全过程。由于要开始学习 Kernel Pwn,nova 决定替换 WSL2 的默认内核。

首先,nova 确认自己的 Windows 版本满足要求且使用的是 WSL2,之后检查当前的内核版本是 5.15.79.1。由于安装的 Ubuntu 版本是 22.04.1 LTS,nova 选择了兼容的最新内核版本 6.1.9 并从 Linux Kernel 的官网或镜像站下载了新内核。

配置文件 .config 是针对 WSL2 进行优化的,尽管针对的版本是 5.15,但也适用于 6.1.9。nova 在文件中修改了 CONFIG_LOCALVERSION 字段以标明内核特点。编译内核前,确保所有依赖项都已安装。nova 使用的是 i7-12700F CPU,所以可以利用 -j20 参数进行编译,编译过程中尽量一路回车默认即可。

编译完成后,nova 将生成的内核复制到主硬盘路径 E:\Ubuntu-2204LTS\linux_kernel_6.1.9 中,并在用户目录下的 .wslconfig 文件中添加 kernel 字段,指向该内核路径。

最后,重启 WSL2 并再次确认内核版本,确保新的内核已成功替换。

最近准备开始看 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...