如何在进行 Windows 10 系统“重置”时保留 WSL linux 环境?

aba*_*ter 11 backup windows-backup windows-10 windows-subsystem-for-linux

这篇文章提到了简单地恢复 WSL 目录,部分恢复了 WSL,但存在一些功能问题。这篇文章提供了有关如何备份和恢复 linux 安装的一般信息。这篇文章说 %appdata% 实际上移动到您的 Windows.old 文件夹中,该文件夹在重置后创建并包含您的“旧”文件。) 第一个海报实验中可能丢失了哪些信息?是否有一些注册表设置或配置文件可以让简单地恢复 Linux 根目录 ( %USERPROFILE%/AppData/Local/lxss) 工作?

编辑

在系统重置或重新安装之前,我的问题被标记为如何备份 (WSL) Linux 子系统 for Windows 10?.

然而,这个问题只是关于如何备份安装——基本上是 tar 并将其保存在某个地方。我明确询问如何恢复它。

Not*_*1ds 3

这是一个很老的问题,今天被提出来了,自问题提出以来的 4 年里,情况发生了很大变化。实际上,几年前我对我的日常驾驶员进行了“重置”,并遇到了类似的情况。

那时,您真正能做的最好的事情就是从旧文件系统中复制所有数据。当提出这个问题时,该文件系统通常(正如您在问题中提到的)位于%USERPROFILE%\AppData\Local\lxss. 我会相信你的话,因为我记不太清了,而且我也不再有任何旧的装置了。

在某些时候,可能当 WSL 开始支持多个发行版时,WSL1 文件夹更改为%USERPROFILE%\AppData\Local\Packages\<PackageName>\LocalState\rootfs. 几年前,当我在 PC 上进行重置时,我修复了tar该目录,然后在重置和 WSL 重新安装后恢复了各个文件(但不是整个文件系统,如您所要求的)。我没有考虑Windows.old,但这也是获取这些文件的有效方法。

如今,是的,在进行重置之前wsl --export,可以按照此处另一个答案中提到的方式执行 a 。

但如果用户不想这样做,在重置后仍然可以使用Windows.old. 有两种情况:

  • WSL2 使这变得相当容易,因为整个文件系统都存储在%USERPROFILE%\AppData\Local\Packages\<PackageName>\LocalState\rootfs\ext4.vhdx. 有关详细信息,请参阅此答案,但您基本上可以将其复制ext4.vhdxWindows.old新安装中。

  • 借助 WSL1,我有90% 的信心可以Windows.old使用以下方法恢复 WSL 安装。

    1. 首先,从商店安装发行版。我知道,您想恢复安装,但我们将使用这个新安装来做到这一点。当我们完成后,您可以随时卸载商店发行版。

    2. 启动该发行版。

    3. /etc/wsl.conf使用以下内容创建:

      [automount]
      options = "metadata"
      
      Run Code Online (Sandbox Code Playgroud)
    4. 下一个,

      cd /mnt/C/Windows.old/Users/<yourusername>/AppData/Local/Packages/<PackageName>/LocalState/rootfs
      
      Run Code Online (Sandbox Code Playgroud)

      <PackageName>取决于您的发行版,但将从Canonical...Ubuntu 发行版开始。如果您的 WSL 安装足够旧,它可能是/mnt/C/Windows.old/Users/<yourusername>/AppData/Local/lxss. 当您执行ls此操作时,您想要查看/该安装的目录。

    5. 从该目录中,tar cvf recovery.tar .. WSL1 安装需要一段时间。

    6. sudo mv recovery.tar <somewhere>其他在C:驱动器上;类似的东西/mnt/c/Users/<youruser>/Documents/wsl(它接近我用于此目的的东西)。当我们完成后,这将是分发的新位置。

    7. 退出 WSL

    8. 从 PowerShell 中,导航到您放置recovery.tar.

    9. mkdir OldUbuntu(或者你想怎么称呼它)

    10. wsl --import OldUbuntu .\OldUbuntu .\recovery.tar。该命令还可以选择使用 a --version 1/2(在末尾)来强制使用 WSL 版本。

    11. 如果需要,请将此设置为默认的 WSL 安装wsl --set-default OldUbuntu

    12. 使用 启动发行版wsl ~ -d OldUbuntu-d/--distribution仅当您未将其设置为上面的默认值时,才需要该参数。

    13. 创建一个/etc/wsl.conf包含以下内容的文件:

      [user]
      default=username
      
      Run Code Online (Sandbox Code Playgroud)

      在重置 Windows 之前,将其编辑username为您在发行版中的用户名。

    14. (可选)卸载我们安装并用于创建 tarball 的发行版。

    应该是这样。我实际上已经用稍微不同的场景对此进行了测试。我安装了一个 WSL1 实例,然后从另一个实例对其执行了上述过程。--import经过上述步骤后,我成功了。文件/目录所有权和权限看起来是正确的,符号链接也是如此。我唯一关心的是真正旧的 WSL 发行版是否可能使用不同的元数据。

    警告:如果您没有其他方法来恢复,请仅在 WSL1 文件系统上尝试此操作。%AppData%已知通过(或等效方式)访问 WSL1 文件系统中的文件会导致损坏。这就是为什么我自己创建了一个一次性实例来尝试这一点。

    旁注:您可能会考虑从 Windows 内部tar导入文件Windows.old,而不是经历安装另一个 WSL 实例的麻烦。我担心的是,这不会捕获Linux所有权和权限,这可能会导致安装时损坏wsl --import