返回

WSL文件误删恢复指南:两种实用方法详解

windows

WSL 中删除文件的恢复方法

在使用Windows文件资源管理器访问Windows子系统Linux(WSL)文件系统时,误删除文件的情况时有发生。本文将分析在WSL中删除文件并尝试使用Windows资源管理器找回文件的情景,并提供几种恢复删除文件的方法,帮助您尽可能恢复数据。

问题分析

通过 explorer.exe 从Windows文件资源管理器中对 WSL 文件进行操作,删除文件时并不会将文件移动到Windows回收站。 而是,文件通常会被直接删除。这是因为 WSL 使用单独的文件系统, Windows 回收站功能默认情况下不会与这个系统集成。常规Windows的备份工具,诸如“文件历史记录”,可能也不会包含对 WSL 文件系统的备份,因为它不在 Windows 文件系统的标准监控范围内。

解决方案一:使用 wsl --export--import 命令进行备份和还原

此方法的核心思想是在删除文件之前,或者说在重要更改发生前,定期创建整个 WSL 实例的备份。如果意外发生,可直接还原到之前的完整状态。

操作步骤:

  1. 导出 WSL 实例:
    打开 PowerShell 或 CMD, 使用 wsl --export <分发版名称> <备份文件名.tar> 命令。例如: wsl --export Ubuntu-22.04 ubuntu_backup.tar
    (Ubuntu-22.04为示例名称,备份文件名根据个人需要自定义)。 这个操作会生成一个.tar格式的压缩文件,它包含您 WSL 发行版的所有内容。这个过程可能耗时较久,这取决于 WSL 发行版大小。
wsl --export Ubuntu-22.04 ubuntu_backup.tar
  1. 还原 WSL 实例 (如果需要):
    在需要还原的时候,使用 wsl --unregister <分发版名称> 命令卸载当前的 WSL 实例 (卸载操作将删除所有的数据)。再使用 wsl --import <分发版名称> <安装目录> <备份文件名.tar> 进行导入操作。例如 wsl --unregister Ubuntu-22.04; wsl --import Ubuntu-22.04 C:\WSL\Ubuntu-22.04 ubuntu_backup.tar
    (C:\WSL\Ubuntu-22.04是期望安装路径,请务必自行替换为你的期望路径)。 这将使用备份文件创建一个新的 WSL 实例,您的数据将会被恢复到备份时的状态。

     wsl --unregister Ubuntu-22.04
    
  wsl --import Ubuntu-22.04 C:\WSL\Ubuntu-22.04  ubuntu_backup.tar 
  1. ** 额外安全建议** :

    建议定期执行导出操作,尤其是在进行系统配置或关键文件更改之前,将备份文件保存到其他磁盘,这样当系统发生灾难性问题的时候,还可以快速进行还原。同时避免将 WSL 备份与 Windows 系统盘放在一起。

解决方案二:使用 ext4fuse 访问 WSL 文件系统尝试文件恢复

ext4fuse 是一个 Linux 文件系统的挂载工具,可以挂载 ext4 文件系统格式的磁盘镜像。 由于WSL2 使用的虚拟磁盘本质是一个虚拟硬盘,你可以尝试使用 ext4fuse 访问这个虚拟磁盘文件,从而尝试查找被删除的文件。这个方法是假设文件虽然被删除了,但是数据本身可能没有立刻被覆写掉的情况。

操作步骤:

  1. 定位 WSL 虚拟硬盘文件:
    首先要找到 WSL2 使用的虚拟硬盘文件。路径一般为: %LocalAppData%\Packages\<WSL Distribution PackageName>\LocalState\ext4.vhdx。 您可以通过运行以下命令获取 <WSL Distribution PackageName> 的真实路径:
 Get-AppxPackage | Where-Object {$_.Name -like '*Ubuntu*'} 

命令会显示安装的 WSL 分发版的包名,例如 “CanonicalGroupLimited.UbuntuonWindows_xxxxxxxxxx”, CanonicalGroupLimited.UbuntuonWindows 这部分是我们需要提取的分发版路径, xxxxxxxxxx 是自动生成,不需要额外处理。

例如,完整路径为 C:\Users\<用户名>\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_xxxxxxxxxx\LocalState\ext4.vhdx ,请将用户名及包名部分替换为自己的值。

  1. ** 安装 ext4fuse:**

    安装ext4fuse , 你需要安装 libfuse 与 ext4fuse, 安装方法和流程根据具体情况查找。 对于Windows操作系统,一种可行的方法是使用第三方工具将 ext4fuse编译或转译为Windows版本。你需要具备一定的计算机知识。 比如你可以从 GitHub 项目(搜索ext4fuse) 上找到类似实现并自行构建。

  2. 挂载虚拟硬盘文件:
    安装完成 ext4fuse 后,可以通过它挂载上述的 ext4.vhdx 文件到 Windows 环境下的一个文件夹。 假定 ext4fuse 命令名为 ext4fuse, 命令可能类似于:
    ext4fuse "<虚拟硬盘文件路径>" <Windows下要挂载到的目录>
    举例:

ext4fuse "C:\Users<用户名>\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_xxxxxxxxxx\LocalState\ext4.vhdx" "C:\wsl_mount"

 (注意: 真实情况下你需要自己找到你编译好的 ext4fuse 或者 Windows 版的 ext4fuse ,使用前需要你检查安全性并理解运行原理)。 成功运行后,您的 WSL 虚拟磁盘会在 C:\wsl_mount (或其他指定的目录) 显示出来。

4. **寻找并恢复文件:** 

  在挂载的目录中寻找丢失的文件。 可以使用Windows 的搜索工具查找,也通过 Windows cmd 命令查找。 此时,删除的文件理论上可以被找到,拷贝到其他位置以完成恢复操作。 一旦恢复操作完成,务必从 C:\wsl_mount 卸载硬盘, 你可以使用 fusermount 类似命令取消挂载, 或重启系统即可。

5. **安全提示** :
 
这种方式不保证一定能够成功找回数据。 当文件删除后, 数据很有可能被覆写,成功恢复的几率会随着时间减少, 因此发现误删之后,要及时处理,避免对虚拟硬盘产生写入操作,避免再次格式化磁盘等操作,增加文件被彻底擦除的风险。 同时也建议备份 WSL 虚拟硬盘到其他介质。

###   结语
文件误删后恢复并非总能成功。 养成定期备份习惯,避免使用 `explorer.exe` 直接修改 WSL  文件,而是通过  `wsl shell`  进行操作才是降低数据丢失的可靠方式。