自定义WSL内核及内核模块
引言#
WSL(Windows Subsystem for Linux),是微软公司开发的一款基于Hyper-V的轻量级虚拟机,支持完整的Linux内核。
微软官方维护的WSL内核在GitHub上公开发布(microsoft/WSL2-Linux-Kernel)。
自定义kernel#
克隆(clone)microsoft/WSL2-Linux-Kernel仓库#
终端中输入以下命令并单击回车:
1 | $ git clone https://github.com/microsoft/WSL2-Linux-Kernel.git |
克隆完成后,进入仓库主文件夹:
1 | $ cd WSL-Linux-Kernel |
编译教程#
在Ubuntu发行版中,借助以下命令完成x86_64WSL内核的编译[1]:
- 终端输入以下命令并回车,安装编译内核所需工具:
1 | $ sudo apt install build-essential flex bison dwarves libssl-dev libelf-dev cpio qemu-utils libncurses-dev |
- 通过终端图形界面配置内核:
1 | $ make menuconfig KCONFIG_CONFIG=Microsoft/config-wsl |
- 使用WSL2内核配置构建linux kernel,编译内核模块并将内核模块放在工作目录下的
modules目录中:
1 | $ make KCONFIG_CONFIG=Microsoft/config-wsl && make INSTALL_MOD_PATH="$PWD/modules" modules_install |
可以在第一个make命令后传入-j$(nproc)参数来加速编译。
之后,你可以用仓库内提供的脚本生成模块虚拟磁盘VHDX:
1 | $ sudo ./Microsoft/scripts/gen_modules_vhdx.sh "$PWD/modules" $(make -s kernelrelease) modules.vhdx |
可以删除编译产物来节省存储空间:
1 | $ make clean && rm -r "$PWD/modules" |
故障排除#
⚠️ 注意:
编译自定义内核并使用配套内核的关键是在Windows®环境下将modules.vhdx的访问权限设置为Everyone只读权限。
就是说,需要在Windows®下对modules.vhdx执行如下命令[2]:
1 | icacls.exe "./modules.vhd" "/grant:r" "Everyone:(R)" |
自定义WSL内核及内核模块