lsmod 命令在 Linux 的 Windows 子系统中不起作用

lsmod 命令在 Linux 的 Windows 子系统中不起作用

我已经从微软商店在 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 内核 GithubWSL 文档了解如何使用自定义内核加载 WSL。

但希望 Netextender 不需要这样做。

相关内容