我已经从微软商店在 Windows 10 中安装了适用于 Linux 的 Windows 子系统,其中 ubunut 版本为 20.04。我尝试通过终端在该子系统中安装 Netextender 软件,但是我收到以下错误消息。
libkmod: ERROR ../libkmod/libkmod-module.c:1668 kmod_module_new_from_loaded: could not open /proc/modules: No such file or directory
我通过输入命令检查了 ubuntu os 笔记本电脑lsmod
,但它提供了模块列表,但在 linux 的 windows 子系统中不可用。当我搜索有关此问题的信息时,它显示 windows 中存在类似的内核问题。但我不明白为什么它不起作用。有人可以帮忙解决这个问题吗?
答案1
简短答案
您可能正在运行 WSL1。 lsmod
需要 WSL2。
解释
首先wsl -l -v
(从 PowerShell 或 CMD)确认你的 WSL 版本。你可能会看到类似以下内容:
NAME STATE VERSION
* Ubuntu Running 1
WSL1 和 WSL2 之间的主要区别之一:
- WSL1 是一个“翻译层”,它试图将 Linux 系统调用转换为 Windows 内核的 API。
- WSL2 是一个在真实的 Linux 内核下运行的“虚拟化”环境。
例如,当ls
命令获取文件列表时:
- 在 WSL1 下,Windows 使用 Windows API 提供文件列表以获取 WSL rootfs 中的文件。
- 在 WSL2 下,Linux 内核使用虚拟磁盘中的 ext4 文件系统来检索文件列表。对于 Windows 驱动器上的文件(例如
/mnc/c
),它使用 9P 网络协议来获取文件。
考虑到这一点,WSL1 能够做到这么多,这确实令人惊叹。但是限制。 lsmod
就是其中之一。虽然 WSL1 确实提供了某些/proc
映射(例如进程),但“内核模块”的概念与 Windows 映射没有多大关系。
也许可以列出 Windows 驱动程序,但这实际上不会带来任何好处。
转换为 WSL2
假设你已经拥有 WSL2已启用在 Windows 上,你可以使用以下方法将 Ubuntu 实例转换为 WSL2:
wsl --set-version Ubuntu 2
虽然这个命令非常安全,但我还是建议您先使用以下命令备份您的实例:
wsl --export Ubuntu backup.tar
与初始wsl
命令一样,这是一个 Windows 命令,因此需要从 PowerShell 或 CMD 运行。
安装/启用 WSL2
如果你没有启用 WSL2,可以按照以下第 2-5 步进行操作本文档。
启用 WSL2 确实不是更新已安装的实例,因此您仍然需要执行wsl --set-version
上面的转换步骤()。
限制
但请注意,WSL 提供的内核已经编译了所有可用的模块,因此结果lsmod
只会是一个空列表。
你能如果你愿意,可以编译你自己的内核,并加载模块。请参阅WSL Linux 内核 Github和WSL 文档了解如何使用自定义内核加载 WSL。
但希望 Netextender 不需要这样做。