运行 sudo do-release-upgrade 后,我的终端/VS code/wsl.exe Ubuntu 版本 (18.04) 与 /etc/lsb-release (22.04.01) 不匹配?

con*_*ous 5 upgrade do-release-upgrade windows-subsystem-for-linux

我使用 WSL2 并安装了 Ubuntu 18.04。我完成了几个步骤来升级版本(启用 systemd、为 apt-pkg 创建符号链接等)。我终于能够sudo do-release-upgrade成功运行并cat /etc/lsb-release目前返回22.04.1 LTS

但是,我的终端、VS Code 和 wsl.exe 仍然显示版本 18.04。如何解决此问题,以便我只使用 22.04.1?

$ cat /etc/lsb-release
DISTRIB_DESCRIPTION="Ubuntu 22.04.1 LTS"

$ wsl.exe -l --all
Windows Subsystem for Linux Distributions:
Ubuntu-18.04 (Default)
docker-desktop
docker-desktop-data

$ wsl --status
Default Distribution: Ubuntu-18.04
Default Version: 2
Run Code Online (Sandbox Code Playgroud)

我按照此处的说明运行这些命令或其变体:

  • $ sudo apt update
  • $ sudo apt upgrade -y
  • > wsl --shutdown
  • $ sudo apt --purge autoremove
  • $ sudo apt install update-manager-core -y
  • $ sudo do-release-upgrade

当我无法运行时,我还从这里运行了以下命令reboot(在意识到我应该只wsl --shutdown在 Powershell 中使用之前): cd /mnt/c/ && cmd.exe /c start "rebooting WSL" cmd /c "timeout 5 && wsl -d $WSL_DISTRO_NAME" && wsl.exe --terminate $WSL_DISTRO_NAME

我收到一条错误消息“未找到名为‘apt-pkg’的模块”,因此我按照此处的说明进行操作。然后给了我command not found错误do-release-upgrade,但我用这个信息修复了这个问题。

我最终通过创建此处描述的符号链接修复了 apt-pkg 错误,以便 Ubuntu 面向 python 3.6 而不是更新的版本。

然后我在尝试运行时收到此错误消息sudo do-release-upgrade

A problem occurred during the update. This is usually some sort of network problem, please check your network connection and retry.
Err https://packages.cloud.google.com/apt cloud-sdk InRelease
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY B53DC80D13EDEF05
Run Code Online (Sandbox Code Playgroud)

我通过运行修复了该错误curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -

然后我终于能够运行了sudo do-upgrade-release,但最后它提示重新启动,所以我无法在同一个会话中执行此操作,最终只是重新启动我的计算机,希望这能解决问题。它没有(至少看起来)——我仍然看到 Ubuntu 18.04。我还没有运行cat /etc/lsb-release,所以我不知道它是否已更新。因为我在终端和 VSCode 中仍然看到 18.04,所以我基本上只是开始运行 和 的变体apt update/upgradedo-release-upgrade所以很可能我在没有意识到的情况下升级了两次。

如果需要任何其他信息,请告诉我。

Not*_*1ds 2

好吧,我想我知道更新后发生了什么。

Ubuntu-18.04发行版名称。这个名字不会改变;它与最初用于安装它的商店安装程序相关联。

目前 Microsoft Store 中有 4 个版本的 Ubuntu:

  • “Ubuntu”(没有版本名称)。通常这与最新的 LTS 版本 (Ubuntu 22.04) 相同,但目前在 Ubuntu 20.04 上仍然受到阻碍。造成这种情况的原因可能有多种,但对于这个答案来说并不重要。

  • “Ubuntu-18.04”:仍然受支持的最旧版本。当您最初安装时,显然您选择了“Ubuntu 18.04”而不仅仅是“Ubuntu”。

  • “Ubuntu 20.04”:安装此软件包将安装 Ubuntu 20.04,即使“Ubuntu”已更改为 22.04 后也是如此。

  • Ubuntu 22.04”:安装此软件包当然会安装 22.04。

然而,这些版本中的任何一个都可以升级到另一个 Ubuntu 版本,无论是否是 LTS。但是,如上所述,升级不会更改为其创建的名称。WSL 本身不知道发行版内部有什么。您实际上可以安装 Arch Linux(或其他)发行版并将其命名为“Ubuntu”。WSL 本身不会知道其中的差异(尽管它可能会在将来导致Ubuntu安装程序出现问题)。

那么...如何更改发行版的名称?通常情况下,你不会。但还是有办法的...

我通常建议基于默认安装创建您自己的命名发行版:

  1. 首先,确保您使用的是从 Microsoft Store 安装的最新 WSL 版本。在完全更新的Windows 10 或 11 系统上,从此处安装。

  2. 退出Ubuntu。

  3. 从 PowerShell 中,wsl --shutdown.

  4. 创建一个您希望发行版所在目录。例如,从 PowerShell:

    mkdir "$env:USERPROFILE\wsl\coniferous_ubuntu"
    cd "$env:USERPROFILE\wsl\coniferous_ubuntu"
    
    Run Code Online (Sandbox Code Playgroud)
  5. 仍然在 PowerShell 中,找到现有 18.04 发行版的位置:

    Get-ChildItem HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss\ |
        ForEach-Object {
            (Get-ItemProperty $_.PSPATH) | Where-Object { $_.DistributionName -eq "Ubuntu-18.04" }
    } | Tee-Object -Variable ubuntuDist
    
    Run Code Online (Sandbox Code Playgroud)
  6. 最后一条命令的信息将保存在$ubuntuDist. 跑步:

    wsl --import --vhd coniferous_ubuntu "$env:USERPROFILE\wsl\coniferous_ubuntu" "$ubuntuDist.BasePath"
    
    wsl --set-default coniferous_ubuntu
    
    wsl ~
    
    Run Code Online (Sandbox Code Playgroud)
  7. 启动此发行版后,您会发现您是 root 用户,因为需要告知 WSL 每个发行版的默认用户。通过创建一个/etc/wsl.conf文件来完成此操作,如我的回答所示

您现在应该拥有一个由您命名的发行版,而不是在任何特定版本号(可以更改)之后命名。

彻底测试新的发行版,一旦确信不再需要旧的发行版:

# WARNING:  Destructive operation.  All files in the distribution will be removed
wsl --unregister Ubuntu-18.04
Run Code Online (Sandbox Code Playgroud)

您还可以从“添加或删除程序”卸载“Ubuntu 18.04” ,这将释放一些额外的空间。

此时,VSCode 应该显示您的发行版名称,并且版本升级不应导致不必要的混乱。


归档时间:

查看次数:

841 次

最近记录:

2 年,9 月 前