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

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

版本
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。Windows Subsystem for Linux 已安装,因此它应该可以正常运行。

实际行为 您好,几天前我成功安装了 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...

诊断日志无响应

答案1

根据最新信息得出的第二个可能的答案。我无法亲自测试,因为我没有遇到这个问题。

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

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

理论上,通过将分发名称改回原来的名称可以解决问题。

答案2

更新:这个答案是我第一次尝试解决方案(确实有效),也是“安全”的做法。然而,我作为第二个答案似乎也适用于多个用户。 这个答案包含问题的背景和为什么这两种技术都可以纠正它。

通过阅读几个 Github 问题(包括你在那里发布的一个问题),这似乎是 Ubuntu 应用程序最近的 Store 更新存在的问题。ubuntu.exeubuntu2004.exe编辑:我现在相信这只发生在,但如果您在版本ubuntu2004.exe上遇到这种情况,请告诉我ubuntu.exe) 更新后损坏。

ubuntu.exe命令实际上做了两件事——它首先检查 Ubuntu 是否安装在 WSL 中。如果没有,它会提取 Ubuntu 根文件系统并要求您配置用户名和密码。如果已经安装,它会使用该发行版启动 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
      
      • 其次,找到你的 Ubuntu WSL 发行版的虚拟驱动器。在文件资源管理器中启动:

        %userprofile%\AppData\Local\Packages
        

        然后找到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
        
      • 重新运行ubuntu2004.exeubuntu.exe(从命令行或开始菜单)

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

      • 退出 Ubuntu 发行版

      • 从 PowerShell:

        wsl --terminate Ubuntu-20.04 # or Ubuntu
        
      • ext4.vhdx上面保存的文件复制回%userprofile%\AppData\Local\CanonicalGroup...Ubuntu...\LocalState新创建的文件中。

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

答案3

需要补充的是,如果您使用 Docker,您很可能还需要更新容器镜像。您可以运行 docker-compose pull 现在,您还需要运行以下命令来更新容器镜像。 docker-compose up --detach up命令会在镜像或配置更改时自动重新创建容器。

答案4

我尝试了所有这些方法,但仍然有问题。我最终通过从 c:\users\username\ 目录中删除 .wslconfig 解决了这个问题。然后运行 ​​wsl --install(在 Windows 功能中取消选中 Windows Subsystem for Linux 后),它运行正常。取消选中后,我可能不得不重新启动系统。

相关内容