编译 WSL 的内核
默认情况下,适用于 Linux 版本的 Windows 子系统 (WSL2) 使用长期支持 (lts) Linux 内核。虽然当前的 WSL2 内核基于 Linux 内核的 5.x 版本,但最新的 lts 版本是 6.x 版本。
1
2
3
4
┌─[wxj@TheDarkStar]─[/software/WSL]
└──╼ $ uname -a
Linux TheDarkStar 5.15.153.1-microsoft-standard-WSL2 #1 SMP Fri Mar 29 23:14:13 UTC 2024 x86_64 GNU/Linux
可以看到目前我的 WSL 内核版本还是使用的 5.x ,官网并没有直接提供编译好的内核,如果想使用最新的内核则需要手动编译。可以到这里 下载最新或者指定的内核代码,然后编译。虽然官方建议使用 Ubuntu 编译,但是个人更喜欢使用 RedHat 系列的 Fedora。本次使用的是 Fedora40 编译 WSL 内核。
获取源码包:
1
2
3
4
5
6
7
8
mkdir /software/WSL && cd /software/WSL
wget https://github.com/microsoft/WSL2-Linux-Kernel/archive/refs/tags/linux-msft-wsl-6.6.36.3.tar.gz
┌─[wxj@TheDarkStar]─[/software/WSL]
└──╼ $ ll -h
total 220M
-rw-r--r-- 1 wxj wxj 220M Jul 26 10:07 linux-msft-wsl-6.6.36.3.tar.gz
## 也可以直接克隆对应的分支代码
git clone https://github.com/microsoft/WSL2-Linux-Kernel.git --depth=1 -b linux-msft-wsl-6.6.y
解压软件/进入目录:
1
2
tar zxf linux-msft-wsl-6.6.36.3.tar.gz
cd WSL2-Linux-Kernel-linux-msft-wsl-6.6.36.3/
安装依赖包
编译前需要先安装部分依赖包:需要安装的依赖包根据自己的环境变化,有些依赖库或者软件可能已经安装好了。可以直接执行 make 编译,有缺失的包会直接抛出错误
1
2
3
4
## Ubuntu 需要安装以下依赖
sudo apt update -y && sudo apt install -y build-essential flex bison libssl-dev libelf-dev bc python3 pahole
## Fedora
sudo dnf install -y flex bison bc dwarves
编译
make 编译的时候可以使用 -j
选项指定使用的 CPU 核心数,以此来提升或者限制效率,如果当前自己并不需要干其他事情的话可以不需要指定核心数,默认会调用当前空闲的所有核心;或者直接使用 -j$(nproc)
选项直接调用所有核心。为了避免影响宿主机建议还是指定可用的核心数,可以使用 lscpu
查看 CPU 信息。也可以全局配置 WSL 可以使用的 CPU 核心,类似 Vmware 配置虚拟机的 CPU 数量。可以参考我的 WSL 配置 .wslconfig
1
2
3
4
5
6
7
make -j$(nproc) KCONFIG_CONFIG=Microsoft/config-wsl
## 建议放在后台运行,并将日志输出到文件中,方便编译错误的时候过滤信息
## 必要时候可以使用 -j1 不使用并行编译,方便复现和排查错误,因为并发编译的时候,日志最后输出的信息可能离正在报错的位置距离很远。处理错误之后 make clean 之后重新编译
nohup make -j$(nproc) KCONFIG_CONFIG=Microsoft/config-wsl &> make.log &
## 使用自定义构建的内核时,可加载模块支持被禁用。在构建之前可以设置想要内置的任何模块。例如你想要加载 uvc 模块,可以尝试使用 menuconfig 选项编译选择
make menuconfig KCONFIG_CONFIG=Microsoft/config-wsl
编译的时候一路回车就行,除非特殊需要,一般采用默认配置就行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
└──╼ $ make -j$(nproc) KCONFIG_CONFIG=Microsoft/config-wsl
SYNC include/config/auto.conf
YACC scripts/kconfig/parser.tab.[ch]
HOSTCC scripts/kconfig/symbol.o
HOSTCC scripts/kconfig/util.o
HOSTCC scripts/kconfig/lexer.lex.o
HOSTCC scripts/kconfig/parser.tab.o
HOSTLD scripts/kconfig/conf
*
* Restart config...
*
*
* Mitigations for CPU vulnerabilities
*
Mitigations for CPU vulnerabilities (CPU_MITIGATIONS) [Y/n/?] (NEW)
选项说明:也可以参考 Hardware vulnerabilities 和 修改mitigations参数使Linux系统运行得更快
选择y(是):启用缓解措施。默认情况下,启用这些缓解措施可以帮助保护系统免受已知的处理器漏洞的影响。这通常是推荐的选择,因为它提高了系统的安全性。尽管这些缓解措施可能会对某些情况下的性能产生轻微的影响,但通常这个影响是可以接受的,尤其是对于需要额外安全性的场景。
选择n(否):禁用缓解措施。禁用缓解措施可能会在某些情况下略微提高性能,但代价是增加了系统对已知安全漏洞的暴露风险。这通常不推荐,除非你明确知道你所处的环境并不需要这些保护(例如在受控的测试环境中),并且你希望最大化性能。
建议 通常情况下,特别是在生产环境或任何需要保证安全的情况下,选择y是更好的选择,因为它能为系统提供额外的安全保护。如果你的主要目标是确保系统的安全性,那么应该选择启用这些缓解措施。
如果你是在一个非常特定的性能测试场景中,或者你有充分的理由相信你的环境不会受到这些漏洞的影响,你可以选择n来禁用它们。然而,这种情况比较少见,特别是在通用的使用环境中。
安装内核模块和头文件
1
2
3
4
5
6
7
8
sudo make modules_install headers_install
##
┌─[wxj@TheDarkStar]─[/software/WSL/WSL2-Linux-Kernel-linux-msft-wsl-6.6.36.3]
└──╼ $ ll arch/x86/boot/bzImage
-rw-r--r-- 1 wxj wxj 16007168 Jul 26 15:02 arch/x86/boot/bzImage
┌─[wxj@TheDarkStar]─[/software/WSL/WSL2-Linux-Kernel-linux-msft-wsl-6.6.36.3]
└──╼ $ ll arch/x86_64/boot/bzImage
lrwxrwxrwx 1 wxj wxj 22 Jul 26 15:02 arch/x86_64/boot/bzImage -> ../../x86/boot/bzImage
设置 WSL 内核
先将编译生成的内核文件复制到宿主机,
1
cp arch/x86/boot/bzImage /mnt/d/software/WSL/wsl-kernel-6.6.36.bzImage
宿主机 Windows 操作,打开另一个终端 powershell ,将文件移动到自己的路径下
1
2
3
4
5
6
mkdir D:\software\WSL\WSL2-Linux-Kernel-linux-msft-wsl-6.6.36.3
mv D:\software\WSL\wsl-kernel-6.6.36.bzImage D:\software\WSL\WSL2-Linux-Kernel-linux-msft-wsl-6.6.36.3\
## 利用 gvim 或者 其他文本编辑器修改 ~/.wslconfig 文件,设置刚才编译好的内核,如果是 cmd 操作则是 %USERPROFILE%\.wslconfig
[wsl2]
kernel=D:\\software\\WSL\\WSL2-Linux-Kernel-linux-msft-wsl-6.6.36.3\\wsl-kernel-6.6.36.bzImage ## 这里是编译好的 wsl 的内核的路径,路径最好使用 两个反斜杠
设置好之后,退出已经打开的 WSL 系统,在 Windows11 下的 WSL2 在退出终端之后为避免一直占用宿主机的资源,默认会很快(大概也就几秒钟)自动关闭子系统。也可以使用 wsl -l -v
查看子系统情况。也可以手动执行 wsl --shutdown
关闭所有子系统。
1
2
3
4
5
6
7
8
9
wsl --shutdown
## 之后重新启动 WSL 子系统
wsl -d fedora --cd ~
uname -a ## 检查内核是否已经应用
┌─[wxj@TheDarkStar]─[~]
└──╼ $ uname -a
Linux TheDarkStar 6.6.36.3-microsoft-standard-WSL2 #5 SMP PREEMPT_DYNAMIC Fri Jul 26 15:01:33 CST 2024 x86_64 GNU/Linux
直接下载编译好的内核
你也可以使用我已经编译好的 WSL 内核 6.6.36.3
问题处理
BTF: .tmp_vmlinux.btf: pahole (pahole) is not available – Error 2
1
2
3
4
5
6
BTF: .tmp_vmlinux.btf: pahole (pahole) is not available
Failed to generate BTF for vmlinux
Try to disable CONFIG_DEBUG_INFO_BTF
make[2]: *** [scripts/Makefile.vmlinux:37: vmlinux] Error 1
make[1]: *** [/software/WSL/WSL2-Linux-Kernel-linux-msft-wsl-6.6.36.3/Makefile:1164: vmlinux] Error 2
make[1]: *** Waiting for unfinished jobs....
1
2
## 安装 dwarvers ,如果不需要 BPF 调式,可以设置 CONFIG_DEBUG_INFO_BTF=n
sudo dnf install -y dwarves