如何在 WSL 中移动 ubuntu

如何在 WSL 中移动 ubuntu

当我开始开发时,WSL我不知道为什么,但我Ubuntu-20.04从 Microsoft Store 安装了应用程序,而不是仅仅从Ubuntu。我知道唯一的区别是,当新版本发布Ubuntu-20.04时,不会自动更新。我想要做的就是让它就像 一样,而不重新配置它。我想过把所有文件从 移动到,但我不知道这样做是否安全。有人知道我该怎么做吗?我也应该这样做吗?UbuntuUbuntuUbuntu-20.04Ubuntu-20.04Ubuntu

编辑:两个版本的 ubuntu 都在运行,WSL-2我已经使用wsl -l -v@NotTheDr01ds 所说的方法进行了检查。

编辑 2:我希望我的所有配置都Ubuntu-20.04包括Ubuntu所有文件和已安装的软件包

答案1

为什么你可能根本不需要这样做

好的,首先要说的是。这可能没什么必要。

商店中的“Ubuntu”(没有版本号)会自动更新……这是真的,但实际上有点误导。

这有点难以解释,但是当你从商店安装“Ubuntu”(无版本)时,你实际上会得到事物:

  • 中的rootfs 包(install.tar.gzC:\Program Files\WindowsApps\CanonicalGroup...。您可以通过启动管理 PowerShell 并运行来查看它Get-ChildItem -Recurse 'C:\Program Files\WindowsApps\Canonical*' | Where-Object {$_.Name -eq 'install.tar.gz' } | % { $_.DirectoryName }

  • 首次运行时(通过ubuntu.exe),安装程序会在您的 中创建您的实际 WSL 实例%UserProfile%\AppData\Local\Packages\CanonicalGroup...

当商店发布新版本时,唯一需要更新的是 rootfs 软件包。不是更改已安装的实例(感谢 Reddit 上的 u/zoredache 继续让我想起了这一点

对于大多数用户来说,这是毫无用处的,除非你:

  1. 取消注册该实例(删除所有配置)并通过重新运行命令来重新配置它ubuntu.exe
  2. 想要使用它install.tar.gz来创建第二个 WSL/Ubuntu 实例(使用wsl --import)。然后,新创建的实例将使用 Store-updated rootfs。

这两种情况都不太常见。即使未版本化的 StoreUbuntu更新到(大概)22.04,也不会改变你的已安装20.04 的实例,只有 rootfs包裹

sudo do-release-upgrade -d当您最终想要升级到 22.04(或临时版本)时,您仍然需要运行。

所以,鉴于...由于您已经按照自己想要的方式进行了配置,所以除了为 WSL 实例Ubuntu-20.04获取一个更短、更清晰的名称之外,更改它对您没有什么好处。Ubuntu

无论如何,该怎么做

也就是说,由于 WSL2 存储数据的方式,移动配置并不那么困难。WSL2 实例的整个文件系统存储在名为 的虚拟 HDD 中ext4.vhdx

由于您有两个 Ubuntu 安装(Ubuntu和),您会在下Ubuntu-20.04找到其中两个文件。要获取确切位置,请从 PowerShell 运行以下命令:ext4.vhdx%userprofile%\AppData\Local\Packages\

Get-ChildItem "$env:USERPROFILE\AppData\Local\Packages\CanonicalGroupLimited*\LocalState\*"

对于我的安装,那是:

...\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\ext4.vhdx
...\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx

此时解决方案可能相当明显,但当然要小心:

  • 退出所有正在运行的 WSL 实例。

  • 然后wsl --shutdown确保当前没有任何运行。

  • 备份现有配置是个不错的主意wsl --export Ubuntu-20.04 2021-09-26_Ubuntu-20.04_backup.tar(无论你想如何称呼备份文件)。这基本上会创建当前 rootfs 的 tarball,包括所有文件、所有权和权限。

  • 此时,只需将您想要的(Ubuntu-20.04)复制ext4.vhdx到新安装的(Ubuntu)上即可。真正的技巧只是确保您复制了正确的版本。您可能希望运行您的Ubuntu-20.04发行版并进行快速更改,以便您可以轻松地在“正确”的副本上看到后者的时间戳。

唯一真正的要求是两个实例的默认用户应该相同。


另一种可能性--既然您已经使用 备份了所需的配置wsl --export,那么您可以随时将wsl --import其放入名为 的新实例中Ubuntu

  • 首先,您需要卸载商店Ubuntu
  • 然后为新实例选择一个目录。它可以位于任何地方,而不必位于您的AppData目录下。
  • wsl --import Ubuntu <directory> path\to\2021-09-26_Ubuntu-20.04_backup.tar --version 2

我把我的%userprofile%\Documents\WSL\instances和我的tar备份保存在 中%userprofile%\Documents\WSL\images。这样我就可以通过 来快速启动新实例wsl --import。能够在不影响我的日常环境的情况下测试一些东西真是太好了。


请注意,任何阅读本文的 WSL1 用户。WSL1 的 rootfs 不是存储在虚拟 HDD 文件中,而是存储在 下的实际文件和目录中...\LocalState\rootfs\。请不要直接访问这些文件,因为这很容易导致 WSL 文件系统损坏(请参阅微软开发博客)。

如果您只需要从 Windows 访问文件,请使用\\wsl$\<distro>Microsoft 博客中所述的 Windows 路径。但如果您需要复制整个内容(如本问题中所述),最好的办法是先通过wsl --set-version <distro> 2(先备份wsl --export)将实例转换为 WSL2。转换后,文件系统将采用 WSL2ext4.vhdx格式。

相关内容