wsl2内核版本和模块版本不一致解决方法

*** /lib/modules/…build: No such file or directory错误解决办法

这篇文章历时1个月整,从4月5日一直到5月5日,这一问题才得以解决。以下是我的经验,可供大家参考:

原因剖析

wsl2内核是被修改过的,wsl无对应内核或者wsl内核版本和modules模块版本不一致导致出错。

1、查看内核版本:

uname -r

在这里插入图片描述/2、查看/lib/modules路径下的modules模块版本

cd /lib/modules

ls

在这里插入图片描述
如果ls后,目录里什么都没有,说明没有安装modules模块。仅需使用解决方法步骤2。

如果没有与uname -r版本相对应的内容,而是其他版本,则说明安装版本不对。注意,版本不一致不仅是数字不同,字母不同也属于版本不一致。使用解决步骤1,然后2。

我们最终的目标就是让uname -r查询的版本与cd /lib/modules路径下的modules模块版本完全一致。

解决方法

不要试图使用通过修改名字强制让不同版本的内容对应的方法,因为核心文件内容不一致,insmod还是会出错。(血泪教训)以下提供合理的解决方法:

1、重装Ubuntu(没有安装模块的话跳过这一步骤)

注意,如果wsl里有重要文件,一定先备份到windows上,因为这里就相当于重装一个wsl2的系统。

(1)卸载Ubuntu(也就是Linux发行版本)

进入设置中的应用功能,卸载Linux发行版本。
在这里插入图片描述

(2)卸载wsl2

在搜索框中搜索linux,删除Linux的Windows子系统
在这里插入图片描述

(3)重装Ubuntu

打开Microsoft store,搜索Ubuntu,下载较新的发行版本。(我选择的是20.04)
点击获取。
下载即可,先不要运行。
在这里插入图片描述

(4)重装wsl2

找到自己之前将wsl升级为wsl2下载的那个smi文件
找不到的话重新下载一个
网址: https://learn.microsoft.com/zh-cn/windows/wsl/install-manual
找到 步骤 4 - 下载 Linux 内核更新包
完成1、下载最新包
点击下载即可。
在这里插入图片描述
接下来,点击刚才下载好的smi文件
什么都不用修改,一直点击到安装完成。

(5)试运行

此时,Ubuntu已经重装完成,我们需要重新设置用户名和密码。此时/lib/modules路径下没有内容。

2、手动安装/lib/modules路径下的内核

在编译驱动的时候,需要内核头文件和modules文件。
WSL2的内核是修改过的,无法使用 ubuntu上游的内核,因此,我们需要手动编译并安装一个版本。

(1)下载内核代码

进入github网站:https://github.com/microsoft/WSL2-Linux-Kernel

找到与uname -r查找到版本对应的版本。
在这里插入图片描述
点tag,然后输入对应的数字内容
在这里插入图片描述
复制这个tags对应版本的名字(因为我们只下载一个分支版本而不是整个)
接下来在linux的终端输入命令

git clone -b xxx --depth=1 https://github.com/microsoft/WSL2-Linux-Kernel

xxx是tags对应版本的名字,例如这里的xxx我替换的就是 linux-msft-wsl-5.10.16.3
depth=1的意思是步长为1,意思是下载该分支下的第一个版本(这里我们不需要修改)

(2)编译和安装

首先,要下载一些必要的库

sudo apt install ncurses-dev
sudo apt install flex
sudo apt install bison
sudo apt install libssl-dev

接着,配置环境

cd WSL2-Linux-Kernel
LOCALVERSION= make KCONFIG_CONFIG=Microsoft/config-wsl -j8
sudo LOCALVERSION= make KCONFIG_CONFIG=Microsoft/config-wsl modules_install -j8

最后,安装headers (如果ubuntu内核版本比较新,该步骤不是必须的)

sudo make headers_install ARCH=x86_64 INSTALL_HDR_PATH=/usr

安装完成后,会在/lib/modules/目录下生成和当前内核版本一致的文件夹。
在这里插入图片描述

(3)检查(驱动编译)

➜ hello make
make -C /lib/modules/5.10.74.3-microsoft-standard-WSL2/build M=/home/dw/src/drivers/study/hello modules
make[1]: Entering directory ‘/home/dw/src/kernel/WSL2-Linux-Kernel’
CC [M] /home/dw/src/drivers/study/hello/hello.o
MODPOST /home/dw/src/drivers/study/hello/Module.symvers
CC [M] /home/dw/src/drivers/study/hello/hello.mod.o
LD [M] /home/dw/src/drivers/study/hello/hello.ko
make[1]: Leaving directory ‘/home/dw/src/kernel/WSL2-Linux-Kernel’
➜ hello sudo insmod ./hello.ko
➜ hello dmesg
[19254.803777] Hello World enter
➜ hello

重新make,成功运行。再insmod,成功。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值