WSL2 Ubuntu下无法用Makefile编译内核模块求助
WSL2下编译Linux内核模块问题解决指南
问题根源
WSL2默认使用微软维护的定制Linux内核,而非Ubuntu发行版原生内核,你之前安装的linux-headers等依赖是针对Ubuntu原生内核的,和当前运行的WSL2内核不匹配,导致/lib/modules/5.15.79.1-microsoft-standard-WSL2/build目录不存在;另外lsmod无输出是因为WSL2默认内核未开启模块加载支持,或模块机制未正常初始化。
解决步骤
1. 安装匹配WSL2内核的头文件
方法一:通过APT直接安装(优先尝试)
- 先更新WSL2内核:在Windows PowerShell中执行
wsl --update,确保内核是最新版本,然后重启WSL(wsl --shutdown)。 - 回到Ubuntu WSL终端,更新系统源并安装对应头文件:
sudo apt update && sudo apt upgrade -y sudo apt install linux-headers-$(uname -r) - 安装完成后,检查
/lib/modules/$(uname -r)/build是否存在,若存在即可正常编译。
方法二:手动构建内核头文件(APT安装失败时用)
- 克隆微软WSL2内核仓库:
git clone https://github.com/microsoft/WSL2-Linux-Kernel.git cd WSL2-Linux-Kernel - 切换到当前内核对应的版本:
git checkout $(uname -r) - 导入当前内核配置:
zcat /proc/config.gz > .config - 安装编译依赖:
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev - 构建并安装头文件:
make headers_install INSTALL_HDR_PATH=/usr - 创建软链接指向内核源码目录:
sudo ln -s $(pwd) /lib/modules/$(uname -r)/build
2. 调整Makefile适配WSL2
确保你的Makefile正确指向内核源码路径,示例如下:
obj-m += simple.o # 自动获取内核头文件路径,若手动构建则替换为你的源码目录 KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) all: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules clean: $(MAKE) -C $(KERNELDIR) M=$(PWD) clean
3. 解决lsmod无输出及模块加载问题
WSL2默认内核关闭了模块加载支持,若要加载自定义模块,需编译自定义WSL2内核:
- 在克隆的WSL2内核源码目录中,执行
make menuconfig,开启以下配置:General setup->Enable loadable module support(确保CONFIG_MODULES=y)- 按需开启其他模块相关配置(如
CONFIG_MODULE_UNLOAD=y等)
- 编译内核:
make -j$(nproc) - 在Windows用户目录(如
C:\Users\你的用户名)创建.wslconfig文件,内容如下:[wsl2] kernel=C:\\path\\to\\WSL2-Linux-Kernel\\arch\\x86_64\\boot\\bzImage - 重启WSL:
wsl --shutdown,重新打开Ubuntu后即可使用lsmod和加载自定义模块。
错误操作纠正
你之前安装的linux-tools-virtual、hwdata是针对Ubuntu原生内核的工具,对WSL2内核无作用,无需安装。
内容的提问来源于stack exchange,提问作者Eddiex045
相关产品推荐
相关产品推荐

