此为历史版本和 IPFS 入口查阅区,回到作品页
Horo
IPFS 指纹 这是什么

作品指纹

Windows Subsystem for Linux <- 自定义 Linux 内核

Horo
·

TL;DR: 为 WSL2 更换自己编译的 Linux 内核。


先来个效果,目前 WSL2 的官方内核是 5.4.72(详细可以参考 适用于 Linux 的 Windows 子系统内核发行说明 )。

所以为啥要自定义内核呢?

WSL 2 中的 Linux 内核是 Microsoft 根据最新的稳定版分支(基于 kernel.org 上提供的源代码)构建的。此内核已专门针对 WSL 2 进行了调整,针对大小和性能进行了优化,以便在 Windows 上提供良好的 Linux 体验。 内核将由 Windows 更新提供服务,这意味着你将获得最新的安全修补程序和内核改进功能,而无需自行管理它。
 WSL 2 包括了自己的 Linux 内核,具有完全的系统调用兼容性。 优点包括:
  • 可以在 WSL 内部运行的一组全新应用,例如 Docker 等。
  • 对 Linux 内核的任何更新都立即可供使用。 (无需等待 WSL 团队实现更新并添加更改)。

当然也许不是所有人都能满意默认的内核配置。例如最近的预览版新增了在 WSL 中挂载 GNU/Linux 常用的文件系统的硬盘(或者虚拟硬盘)到 WSL 中的功能。但支持的只有内核支持的文件系统(像 exFAT 这种通过 FUSE 支持的文件系统就不行了,以及咱知道 Windows 有原生支持 exFAT 这件事。),WSL 2 的默认内核里貌似只有 EXT2/3/4 和 btrfs 的支持。以及也有的人可能想在里面运行 LXC 或者 UML 什么的。这个时候就可以考虑定制自己的内核啦。

https://wsl.dev 有几种前人尝试过的方案,像是给内核加入 ZFS 支持这样的。

开始(之前和现在)

既然都到了有自定义内核的想法的时间了,那手边一定有一个 WSL 2 的环境了吧。

以及可以自定义内核的 wslconfig 要求 Windows 版本 19041 或更高。

根据汝所使用的发行版的区别,安装上编译常用的工具。(例如 Debian 系的 build-essentials ,Arch 的 bade-devel 这样的。)

然后取得内核源码:

如果有需要的话,可以像平常编译内核一样用 make menuconfig 等命令调整内核选项,之后就可以编译啦:

$ make $(nproc) -s  O=out distclean olddefconfig all
# 编译完成后把编译好的内核(默认的位置应该是 ./out/arch/x86/boot/bzImage) 复制出来备用。
$ cp  ./out/arch/x86/boot/bzImage  /mnt/c/Users/Horo/AppData/Local/Lxss/kernel

用 wslconfig 配置 WSL 使用自定义内核

用文字编辑器创建一个 C:\Users\<这里是汝的用户名>\.wslconfig ,参考这里修改配置,关键的就是那个 kernel 参数。汝也可以参考上面的文档修改 WSL 的可用内存,CPU等其它的选项。

[wsl2]
# 这里的路径要用转义的反斜线。
kernel = C:\\Users\\Horo\\Appdata\\Local\\Lxss\\kernel

汝有可能需要先运行 wsl --shutdown 以关闭 WSL 2 VM,然后重新启动 WSL 实例才能让上面的更改生效。如果一切顺利的话, /proc/version 就会是汝自己的内核的版本号啦。

以上。

CC BY-NC-ND 2.0 授权