我使用“设置 > 应用程序 > Ubuntu > 重置”在 WSL 上重置 Ubuntu。现在我在 WSL 文件系统中的所有文件都丢失了。我怎样才能恢复它?

Vis*_*333 4 filesystem data-recovery windows-subsystem-for-linux virtual-file-system

我在 Windows 上的 WSL2 上使用 Ubuntu(操作系统版本详细信息)。我通过以下命令重置了 Ubuntu 应用程序:

设置 > 应用程序 > 应用程序和功能 > Ubuntu > 重置

在“卸载”下提到卸载 WSL 发行版不会影响文件,那么“重置”WSL 发行版真的会删除 WSL 文件系统中的文件吗?我希望保留 /home 目录文件,但重置后我发现 /home 中没有任何内容。

是否可以恢复 /home 中的数据?

感谢您抽出时间回答这个问题。

Not*_*1ds 9

遗憾的是,我没有什么好消息要告诉你。也许只有重新安装时的建议才能避免再次发生。

首先,您发布的屏幕截图中的“重置”选项确实具体说明了:

如果此应用程序无法正常工作,请将其重置。该应用程序的数据将被删除。

所以是的,重置确实删除了整个 Ubuntu WSL 数据(文件系统和注册表数据)。

另一方面, Repair 可以保持 WSL Ubuntu 发行版完好无损

重要提示:这些选项以及设置中它们背后的措辞对于所有商店应用程序都是相同的。我知道卸载措辞是这样的:

您的文件不会受到影响。

但是,根据 WSL 安装的处理方式,卸载确实删除整个实例。这些文档是文件系统的一部分,在卸载时会被删除。

我见过一些情况,商店应用程序因其他原因被重置,导致 WSL 数据丢失。出于这个原因(以及更多),我建议以下......

防止卸载和重置删除 WSL 数据

我正在认真考虑尽快制作我的第一个 YouTube 视频。在 WSL 中安装 Ubuntu(或任何其他发行版)时,我做的第一件事是通过将实例“移动”到其自己的目录来“断开”实例与应用商店安装的连接。

默认情况下,WSL 发行版安装到:

%UserProfile%\AppData\Local\Packages\<DistributionPackage>\
Run Code Online (Sandbox Code Playgroud)

这包括虚拟文件系统:

  • WSL2:..\<DistributionPackage>\LocalState\ext4.vhdx
  • WSL1:..\<DistributionPackage>\LocalState\rootfs\

对于 Ubuntu,该<DistributionPackage>名称将以 开头Canonical并包含Ubuntu在名称中(以及其他标识符)。

值得检查一下该目录是否仍然存在。如果是这样,您的数据可能是可恢复的。不过,我不认为这有可能。ubuntu.exe如果您在重置后重新运行,则更有可能是安装。

无论如何,我建议这个过程“断开”商店安装,这样就不会再发生这种情况:

  • 安装 Ubuntu 并配置用户名和密码后。

  • 退出Ubuntu

  • 来自 PowerShell:

    # Confirm the distribution name
    wsl -l -v
    # Distribution name may be "Ubuntu" or "Ubuntu-20.04" - Adjust the following lines accordingly:
    wsl --shutdown
    cd ~\Documents
    mkdir WSL\images
    mkdir WSL\instances\MyUbuntu
    wsl --export Ubuntu WSL\images\ubuntu_clean.tar
    wsl --import MyUbuntu WSL\instances\MyUbuntu WSL\images\ubuntu_clean.tar --version 2
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,上面的大多数目录和文件名(以及实例名称)都由您决定。

  • 您现在应该已经安装了两个 Ubuntu,您可以使用 进行确认wsl -l -v

  • 启动新的wsl -d MyUbuntu

  • --imported 实例不会“记住”您的默认用户名(尽管该用户仍然存在)。/etc/wsl.conf根据此答案通过文件设置该实例中的默认用户名。具体来说:

    sudo -e /etc/wsl.conf
    
    Run Code Online (Sandbox Code Playgroud)

    并添加以下行:

    [user]
    default=<yourusername>
    
    Run Code Online (Sandbox Code Playgroud)
  • 退出实例

  • 再次,来自 PowerShell:

    wsl --terminate MyUbuntu
    wsl --set-default MyUbuntu
    
    Run Code Online (Sandbox Code Playgroud)
  • 现在,默认实例是MyUbuntu. 每当您使用该命令启动 WSL 时,都会启动它wsl

  • 卸载 Ubuntu 商店。您不必担心它会再次重置。

如果您确实需要在 Ubuntu 中尝试一些您认为可能会导致问题的操作,请在新的临时实例中执行此操作:

再次在 PowerShell 中:

cd ~\Documents\WSL
mkdir instances\UbuntuTest
wsl --export MyUbuntu images\current_ubuntu.tar
wsl --import UbuntuTest instances\UbuntuTest images\current_ubuntu.tar --version 2
wsl -d UbuntuTest
Run Code Online (Sandbox Code Playgroud)

这是一个单独的实例,您可以安装、更改配置、尽情发挥。当您使用它时,退出并:

wsl --unregister UbuntuTest
Run Code Online (Sandbox Code Playgroud)

这将删除该测试实例并保持MyUbuntu原样。

当然,请注意,整个UbuntuTest实例将会消失,因此请确保您不会创建任何长期需要的文档或数据。

  • @NotTheDr01ds 我幸运地运行了 Acronis true 映像,并且有备份。使用它和您来自 https://askubuntu.com/a/1350429/662944 的答案,我只需复制 %userprofile%\AppData\Local\Packages\CanonicalGroup...\LocalState\ext4.vhdx 文件即可,它起作用了! (3认同)