跳到主要内容

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

· 阅读需 5 分钟
MuelNova
Pwner who wants to write codes.

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