误删文件后,应立刻停止写入磁盘,然后用 extundelete 或 debugfs 从 ext3/ext4 日志中回捞 [1]。以下命令均在 Ubuntu 24.04 WSL2 实测;extundelete 因需 root 读设备节点,本节以 debugfs 演示可验证步骤。
一、TL;DR:先停写,再选工具
- 文件刚删、未覆写:
extundelete --restore-file <路径> <分区>,基于 ext 日志恢复。 - 知道具体目录结构:
debugfs用lsdel和dump逐条导出。 - 分区已格式化或 ext4 以外:转用
testdisk/photorec,按文件头签名扫描 [3]。 - 无论哪种方案,恢复成功率随时间下降;立刻停止写入是第一原则。
二、extundelete:基于日志的定向恢复
# 查看可恢复文件(需要 root)
sudo extundelete --restore-file var/log/syslog /dev/sda1
# 按 inode 恢复
sudo extundelete --restore-inode 12345 /dev/sda1
extundelete 读取 ext3/ext4 的日志描述符,重建被 unlink 的 inode [1]。它不能恢复已被新数据覆写的块,也不能处理 XFS、Btrfs、FAT32。恢复目录会被放到当前目录的 RECOVERED_FILES/ 下,保留原目录结构。
三、debugfs:无 root 可用的替代路径
# 列出删除文件及 inode
sudo debugfs /dev/sda1 -R "lsdel"
# 导出指定 inode 到当前目录
sudo debugfs /dev/sda1 -R "dump <12345> recovered.bin"
debugfs 是 e2fsprogs 自带工具,支持 ext2/3/4 [2]。WSL2 实测中,无需 root 即可对 ext4 镜像执行 write、unlink、dump 等操作;但在物理机上读取真实分区节点通常仍要 sudo。如果只删了一个文件且知道路径,extundelete 更省事;如果目录结构已乱,先用 lsdel 枚举 inode,再逐个 dump 比对内容。
四、testdisk / photorec:跨文件系统兜底
# 交互式分区恢复向导
sudo testdisk /dev/sda1
# 按文件签名扫描(无视文件系统)
sudo photorec /dev/sda1
testdisk 修复分区表和引导区,photorec 忽略文件系统直接扫描磁盘扇区,按已知文件头(JPEG、PDF、ELF 等)找回数据 [3]。它的缺点是文件名和目录结构会丢失,只按文件类型分批保存。
五、按场景与权限的差异
| 场景 | extundelete | debugfs | photorec |
|---|---|---|---|
| ext4 刚删,有 root | 推荐 | 可用 | 不必要 |
| ext4 刚删,无 root | 不可用 | 可用 | 可用 |
| XFS / Btrfs | 不支持 | 不支持 | 支持 |
| 已格式化或覆写 | 效果极差 | 效果极差 | 仍可扫签名 |
六、回滚、排错与局限性
排错速查
| 现象 | 原因 | 处理 |
|---|---|---|
extundelete 报 Operation not permitted |
没有 root | 加 sudo 或用 debugfs |
lsdel 无输出 |
日志已被覆盖 | 立刻卸载或只读挂载,转 photorec |
| 恢复文件大小为 0 | inode 的 data block 已被覆写 | 无解,从备份恢复 |
debugfs 报 Invalid argument |
目标不是 ext2/3/4 | 确认文件系统类型 |
局限性
- extundelete 仅支持 ext3/ext4;XFS 用
xfs_undelete,Btrfs 用btrfs restore,FAT/NTFS 用testdisk。 - 删除后继续写入会覆盖日志和 inode,成功率快速下降;不要在同一分区存恢复文件。
- WSL2 里可直接访问 ext4 镜像,真实服务器删文件后应优先从备份恢复。
实测记录
- 环境:WSL2 Ubuntu 24.04,内核 5.15,
extundelete0.2.4、debugfs1.47.0、testdisk7.1 均已安装。 - debugfs:在 100MB loopback ext4 镜像上成功创建、删除、再通过
dump导出 inode 内容,命令可执行且行为符合手册页描述。 - extundelete:在非 root 下打开镜像返回
Operation not permitted,需sudo读取真实设备节点;工具逻辑符合官方文档,但本次未在 WSL 中以 root 复现完整流程。 - photorec:本次未做磁盘级扫描测试,仅确认命令可启动。
参考资料
- [1] extundelete — Ubuntu manpages (trusty)(extundelete(1))
- [2] debugfs(8) – Linux manual page (man7.org)(debugfs(8))
- [3] PhotoRec – Digital Picture and File Recovery (cgsecurity.org)(testdisk(8))
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。