我在 WSL2 上使用 Ubuntu 18.04,当我从 Windows 文件系统运行 .exe 时,它会正常执行。但是当我将 .exe 复制到 Linux 文件系统时,它的速度非常慢。请参见下面的示例:
(18.04)geert@SEA-WIN10-02:~$ time /mnt/c/Windows/system32/whoami.exe
geert
real 0m0.071s
user 0m0.000s
sys 0m0.003s
(18.04)geert@SEA-WIN10-02:~$ cp /mnt/c/Windows/system32/whoami.exe .
(18.04)geert@SEA-WIN10-02:~$ time ./whoami.exe
geert
real 0m10.198s
user 0m0.002s
sys 0m0.000s
当我使用 Ubuntu 20.04 或 22.04 时也会发生同样的情况。
在我的 WSL2 升级后(超出我的控制范围),它最近开始出现这种情况。
我正在使用 WSL2 上的 Linux 为 ARM 进行交叉编译。我正在使用一个 Windows 工具,它将 Intel Hex 输出转换为引导加载程序的加密版本。此工具现在减慢了构建速度。构建过去需要 4 分钟,现在需要 17 分钟。该工具没有改变;它是从版本控制中获取的,多年来一直没有改变。
另一个副作用是,构建完成后,每个应用程序的启动速度都非常慢。例如,在任务栏中单击任务管理器窗口后,需要 27 秒才能显示该窗口,Acrobat Reader 或任何其他应用程序也是如此;它们都需要 10 到 30 秒才能启动。CPU 使用率(不到 3%)和内存使用率(约 35%)是“正常”的,在启动应用程序时不会“飙升”。
运行 无法解决这个问题wsl --shutdown
。我必须重新启动系统才能让应用程序立即再次启动。
我正在使用的 WSL2 版本:
PS C:\Users\geert> (get-item C:\windows\system32\wsl.exe).VersionInfo.FileVersion
10.0.19041.2311 (WinBuild.160101.0800)
PS C:\Users\geert> wsl --version
WSL version: 1.0.3.0
Kernel version: 5.15.79.1
WSLg version: 1.0.47
MSRDC version: 1.2.3575
Direct3D version: 1.606.4
DXCore version: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows version: 10.0.19045.2486
PS C:\Users\geert> wsl --status
Default Distribution: Legacy
Default Version: 2
PS C:\Users\geert> wsl --update
Checking for updates.
The most recent version of Windows Subsystem for Linux is already installed.
有一个WSL 错误报告关于此问题,但它是由Windows Subsystem for Linux Preview
但我没有使用它引起的。我正在使用 WSL2 的最新官方发布版本。
有人知道为什么会发生这种情况以及如何解决吗?
更新:我在另一个装有旧版 WSL2 的系统上进行了测试,一切正常(构建需要 3 分 50 秒)。此版本的 WSL2 为:
PS C:\Users\geert> (get-item C:\windows\system32\wsl.exe).VersionInfo.FileVersion
10.0.19041.2311 (WinBuild.160101.0800)
PS C:\Users\geert> wsl --version
Invalid command line option: --version
Copyright (c) Microsoft Corporation. All rights reserved.
...
PS C:\Users\geert> wsl --status
Default Distribution: Ubuntu
Default Version: 2
...
Kernel version: 5.10.16
令人惊讶的是,这wsl.exe.VersionInfo.FileVersion
两个系统是相同的。
我暂时的结论是 WSL2 更新已损坏。
我的第二个系统上的 WSL2 的“旧”版本有一个“回滚”选项:
PS C:\Users\geert> wsl --version
Invalid command line option: --version
Copyright (c) Microsoft Corporation. All rights reserved.
Usage: wsl.exe [Argument] [Options...] [CommandLine]
...
--update [Options]
If no options are specified, the WSL 2 kernel will be updated
to the latest version.
Options:
--rollback
Revert to the previous version of the WSL 2 kernel.
但是存在问题的系统上的 WSL2 版本不再具有“回滚”选项(但具有“--version”选项)。
现在我无法回滚 WSL2,我该如何解决这个问题?
答案1
有一个WSL 错误报告关于此问题,但它是由
Windows Subsystem for Linux Preview
但我没有使用它引起的。我正在使用 WSL2 的最新官方发布版本。
嗯...你实际上是使用它。当发布时,WSL申请材料之前是预览版。现在它已经发布,正如你所见,它的错误报告仍然处于打开状态。显然它已经不是已修复。
现在我无法回滚 WSL2,我该如何解决这个问题?
重要的是要了解,WSL 现在有两种不同的“分发方法”:
最初,WSL 是作为Windows 功能通过打开或关闭 Windows 功能在“设置”中。
这是您所指的“旧”版本,它不支持该
--version
标志。现在,WSL 以 UWP 应用程序的形式分发。在最新版本的 Windows 10 和 11 中,它可以通过
wsl --install
、Microsoft Store 甚至下载应用程序包并手动安装来安装。这个版本似乎存在“
.exe
速度慢”的问题,至少在某些(也许是所有)版本中存在。
您仍然可以回滚到任一版本。无论哪种情况,首先卸载现有的 WSL 包(正如我在 Github 问题中的这个评论中提到)在“开始”菜单中搜索适用于 Linux 的 Windows 子系统,右键单击,然后卸载。您也可以通过标准添加或删除程序。
从您的评论中:
如果我卸载 WSL,我的 Linux 安装会丢失吗?
不。这将不是卸载所有发行版。这些是单独的软件包,例如Ubuntu,Debian,Ubuntu-22.04等。不要卸载这些,这样就没问题了。不过,先备份一下也无妨。要么查看这个答案(或其他)的wsl --export
,或者找到并复制ext4.vhdx
适合您的发行版的文件。
一旦问题应用版本卸载后,建议重新启动。之后,由于您使用的是 Windows 10,因此应该发现 WSL特征仍安装。(此功能对于 Windows 11 用户是可选的,仅在您需要 WSL1 支持时才需要。)
wsl --version
应该不再起作用,但wsl ~
应该启动较旧的“功能”版本(也与较旧的内核版本一起)。根据该 Github 问题中的用户,返回到较旧的 WSL 预应用程序(功能)版本解决了该问题。但目前,就功能而言,这是一个相当大的挫折。在 Windows 10 下,您将失去:
- WSLg(运行 Linux GUI 应用程序的能力)
wsl --mount
将其他设备纳入 WSL的能力- Systemd 支持
- 以及更多
此时,您还可以选择安装较旧的“应用程序”包。目前没有太多非“预览”的应用程序版本,但正如我在 Github 问题中提到的那样,您可以回到问题似乎开始发生之前的预发布版本。然而,根据最后的评论在该问题中,早在 0.66.2 版本中就存在该问题。因此,这可能是应用程序包中的系统性问题。
不过,如果你想尝试,你可以手动安装任何较旧的应用程序包。请参阅“无需通过商店安装/更新”在我的答案在这里- 只需从WSL 发布页面。