Windows Subsystem for Linux <- 自定义 Linux 内核
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 这样的。)
然后取得内核源码:
- 如果只想在官方代码的基础上自定义的话,可以在 https://github.com/microsoft/WSL2-Linux-Kernel/releases 取得包含配置的源代码。
- 如果想换新的版本,可以从 https://kernel.org/ 取得对应版本的内核源码。当然也可以从 https://github.com/microsoft/WSL2-Linux-Kernel/blob/linux-msft-wsl-5.4.y/Microsoft/config-wsl 拿一份原版内核的 Config 当作参考。
如果有需要的话,可以像平常编译内核一样用 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 就会是汝自己的内核的版本号啦。
以上。