从 Microsoft 商店更新后 WSL 无法工作

J. *_*Doe 21 updates windows windows-subsystem-for-linux 20.04

版本
Microsoft Windows [版本 10.0.19044.1586]

WSL 版本
WSL 2

内核版本
5.10.16

发行版
Ubuntu20.04LTS

其他软件
Docker Desktop (Windows),版本 4.6.1 (76265) Docker Engine v20.10.13

重现步骤 我已经从 Microsoft Store 安装了 WSL 几天,并且运行良好。我从 Microsoft Store 获取了有关 WSL 的更新,并对其进行了更新,然后它停止工作。

bash shell的预期行为 。适用于 Linux 的 Windows 子系统已安装,因此应该可以正常运行。

实际行为 您好,我几天前已成功安装 WSL,一切正常。但在我从 Microsoft Store 获得有关 WSL 的更新后,我更新了 WSL,从那时起它就抛出此错误。我还重新启动了计算机并检查以确保我的虚拟机平台和适用于 Linux 的 Windows 子系统已打开,我发现这两个服务都已打开。我仍然遇到同样的错误。我可以得到关于这方面的任何指导吗?因为我必须使用 WSL 来实现我的教育目的,这将非常有帮助,谢谢

Installing, this may take a few minutes...<br>
WslRegisterDistribution failed with error: 0x80070050<br>
Error: 0x80070050 The file exists.

Press any key to continue...
Run Code Online (Sandbox Code Playgroud)

诊断日志 无响应

Not*_*1ds 36

基于最新信息的第二个可能的答案。我无法亲自对此进行测试,因为我没有遇到问题。

在尝试此操作之前,请备份(使用我在之前的答案中提到的步骤)。

  • wsl --shutdown(来自 PowerShell 或 CMD)
  • 在 Windows 中,运行注册表编辑器
  • 寻找\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss
  • DistributionName找到里面有的钥匙Ubuntu20.04LTS。将 更改Ubuntu20.04LTSUbuntu-20.04.

理论上,可以通过将发行版名称更改回应有的名称来解决问题。

  • 这对我有用!非常感谢。我确实执行了备份步骤,但此更改是使其再次正常工作所需的全部内容,根本不需要重新安装 (2认同)

Not*_*1ds 11

更新:这个答案是我第一次尝试解决方案(它确实有效),以及“安全”的方法。然而,我作为第二个答案发布的“快速而简单”(但不太“安全”)的注册表编辑似乎也适用于多个用户。 该答案包含问题的背景以及为什么这两种技术都可以解决问题。

通过阅读几个 Github 问题(包括从外观上看您在那里发布的问题),这似乎是 Ubuntu 应用程序最近的 Store 更新的问题。或ubuntu.exe编辑:我现在相信这只发生在,但如果您在该版本ubuntu2004.exe上遇到此问题,请告诉我)在更新后被破坏。ubuntu2004.exeubuntu.exe

ubuntu.exe命令实际上做了两件事——它首先检查 Ubuntu 是否安装在 WSL 中。如果没有,它会提取 Ubuntu rootfs 并要求您配置用户名和密码。如果已安装,它将使用该发行版启动 WSL。

该问题似乎实际上是从Microsoft Store 中的“Ubuntu 20.04”应用程序的早期版本开始的。安装的发行版的名称应该是(历史上), Ubuntu-20.04。以前的版本似乎有一个错误,它被重命名了Ubuntu2004.LTS(感谢@Pat 在评论中指出了这一点)。

这会给所有更新的用户带来类似的问题。然而,Canonical 似乎很快就解决了这个问题。

不幸的是,如果您在商店中存在“错误版本”的窗口期间安装,那么修复会破坏您的功能,因为现在:

  • ubuntu2004.exe正在寻找名为 的发行版Ubuntu-20.04
  • 它找不到它(因为您的版本命名不正确Ubuntu20.04LTS),因此它尝试再次运行 rootfs/configuration 阶段。但 WSL 文件已经提取并配置,导致错误。

有几种选择:

  • 就我个人而言,我只是更改任何链接以使用该wsl.exe命令而不是ubuntu.exe(或ubuntu2004.exe)。假设 Ubuntu 是您的默认 WSL 发行版(通过 找到wsl -l -v),那么将具有相同的效果,只需启动它即可。-编辑 - 实际解决这个问题是值得的。

  • 从 Github 报告来看,您可以通过取消注册 Ubuntu 发行版来真正解决该问题。请注意,这是一个破坏性操作,会删除您现有的 Ubuntu 发行版。

    假设发行版仍在运行,通过wsl命令,可以在注销之前对其进行备份,然后在注销后恢复。

    我会分两步完成此操作:

    • 首先,通过命令创建发行版的备份wsl --export。退出发行版,然后转到 PowerShell 并:

      wsl -l -v
      # Change "Ubuntu-20.04" in the next line to match the distribution name in use
      wsl --export Ubuntu-20.04 ubuntu_backup.tar
      
      Run Code Online (Sandbox Code Playgroud)
      • 其次,找到您的 Ubuntu WSL 发行版的虚拟驱动器。在文件资源管理器中启动:

        %userprofile%\AppData\Local\Packages
        
        Run Code Online (Sandbox Code Playgroud)

        然后找到CanonicalGroupLimited...Ubuntu(名称可能有所不同。

        在里面,找到..\LocalState\ext4.vhdx. 将该文件复制到安全位置。

      • 准备好两个不同的备份后,就可以从 WSL 取消注册 Ubuntu。请记住,这是一个破坏性操作:

        wsl -l -v
            # Change "Ubuntu-20.04" in the next line to match the distribution name in use
        wsl --unregister Ubuntu-20.04
        
        Run Code Online (Sandbox Code Playgroud)
      • 重新运行ubuntu2004.exeubuntu.exe(从命令行或“开始”菜单)

        Ubuntu 将再次运行其安装和初始配置(它现在应该可以使用未注册的“坏”版本)。虽然您可以在此处输入用户名和密码,但我们无论如何都会丢弃此“安装”。

      • 退出 Ubuntu 发行版

      • 来自 PowerShell:

        wsl --terminate Ubuntu-20.04 # or Ubuntu
        
        Run Code Online (Sandbox Code Playgroud)
      • ext4.vhdx您上面保存的内容复制回%userprofile%\AppData\Local\CanonicalGroup...Ubuntu...\LocalState新创建的内容中。

此时,ubuntu.exeubuntu2004.exe命令应该再次起作用(以及从“开始”菜单)。

  • 安装前的名称是Ubuntu20.04LTS。按照以下步骤操作后,它会更改为 Ubuntu-20.04。不确定这是否与错误有关。 (2认同)
  • @帕特这是一个*伟大的*观察。由于人们确认我的第二个答案有效,看来你击中要害了。 (2认同)