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

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

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

编辑

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

但是那个问题只是关于如何备份安装 - 基本上就是将其打包并保存在某处。我明确询问如何恢复它。

答案1

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

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

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

如今,是的,进行重置,wsl --export可以按照此处其他答案中提到的方式执行。

但如果用户没有想到这么做,可能重置后仍有可能使用 完全恢复文件系统Windows.old。有两种情况:

  • WSL2 使这变得相当容易,因为整个文件系统都存储在虚拟驱动器中%USERPROFILE%\AppData\Local\Packages\<PackageName>\LocalState\rootfs\ext4.vhdx。请参阅这个答案了解详细信息,但基本上您可以将其从新安装中复制ext4.vhdx出来Windows.old并放入新安装中。

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

    1. 首先,从商店安装发行版。我知道,你想恢复你的老的安装,但我们将使用此新安装来执行此操作。完成后,您可以随时卸载 Store 分发版。

    2. 启动该分发。

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

      [automount]
      options = "metadata"
      
    4. 下一个,

      cd /mnt/C/Windows.old/Users/<yourusername>/AppData/Local/Packages/<PackageName>/LocalState/rootfs
      

      <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。该命令还可以选择--version 1/2在末尾添加一个 ,以强制使用 WSL 版本。

    11. 如果需要,请使用 将其设为您的默认 WSL 安装wsl --set-default OldUbuntu

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

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

      [user]
      default=username
      

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

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

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

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

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

相关内容