前言
随着Win 10 2004版本的正式推送,很多人也都用上了最新的WSL 2,这使得Win 10成了最好的Linux发行版(雾)。WSL 2相比WSL 1,最大的改变就是使用了真正的Linux内核,而不仅仅是一个适配层。我们可以通过命令uname -r
查看这个内核的版本,通过正式推送获得的WSL 2的内核版本应当是4.19.84
。这本没有什么问题,可是我在最近的操作系统实验过程中注意到,Microsoft可能对这个内核动过什么手脚,导致该内核无法支持minix文件系统(Bochs虚拟机挂载的虚拟硬盘就是该文件系统),而Linux内核的官方文档表示,Linux内核是原生支持该文件系统的……估计是微软在编译内核的时候把这个功能去掉了吧。或者,即使你不使用minix文件系统,仅仅是想体验最新版的内核,也可以尝试一下。
本次我们编译https://www.kernel.org/上面最新的5.7版本的内核。
前置工作
首先,我们需要一个可用的Linux环境,Ubuntu就很不错,当然也可以直接用 WSL 编译。我使用的是刚刚发布的20.04,作为内核编译的平台。
我们需要安装编译内核所必要的依赖:
sudo apt install g++ make flex bison libssl-dev libelf-dev bc
接着我们需要将内核源码下载下来,直接去https://www.kernel.org/上下载即可,我下载的是5.7.0版本,地址如下:
https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.7.tar.xz
接着我们使用如下的命令解压该压缩文件:
tar xvf linux-5.7.tar.xz
cd linux-5.7
接着,我们需要配置文件,否则在编译是就需要填写大量的选项,麻烦又无聊。我们可以使用微软官方的配置文件,但是官方配置比较老(4.19.84)。好在,有叶欣仁为我们整理了适合Linux 5.7的WSL 2的配置文件,文件在下方:
https://github.com/xieyubo/WSL2-Linux-Kernel/blob/wsl-xyb-port-5.7.y/Microsoft/config-wsl
如果上面使用的是其他版本的 kernel,这里可以切换分支,最新可用的分支是 wsl-xyb-port-5.11.y,对应着 5.11 版本的内核
下载该文件后,在linux-5.7文件夹下新建一个叫Microsoft的文件夹,将配置文件改名为config-wsl
放入其中即可。
当然,由于是微软的配置文件,我们需要做一些修改,我主要就做了两处修改。
其一,由于我需要minix文件系统支持,就打开了CONFIG_MINIX_FS
,即:
CONFIG_MINIX_FS=y
其二,是一个可有可无的选项:CONFIG_LOCALVERSION
字段,你可以在这个字段下写一些个性化的东西,例如自己的名字,这样在新系统中使用uname -r
查看内核版本时就会出现自己的名字。
开始编译
编译内核是在linux-5.7文件夹下进行的,在该文件夹下执行命令:
make KCONFIG_CONFIG=Microsoft/config-wsl
就开始了内核的编译工作,如果想要发挥多核心处理器的优势,可以命令后面加上-j n
的参数,即可使用n个核心进行编译。
我使用四核心进行编译大概需要十分钟。
编译完成后的内核镜像存放为arch/x86/boot/bzImage
文件,将其重命名为kernel
,并拷贝到win 10中。
替换WSL内核
在替换内核之前,首先需要关闭正在运行的WSL实例,在CMD中使用如下命令即可:
wsl --shutdown
接着进入Win 10中的C:\Windows\System32\lxss\tools
文件夹下,将kernel文件替换为刚刚编译的那个即可(当然最好把旧的那个备份下)。重启Windows 10。
再次进入WSL 2后,使用uname -r
命令,就可以看到内核已经变成5.7版本的内核了,如果编译时加上了个性化信息的话,也会出现在内核版本的后面。
Done!