误删文件后应立即停止磁盘写入以提高恢复成功率;ext4下优先用debugfs通过inode恢复原始数据,或用extundelete按路径重建文件;photorec仅作兜底,适用于严重覆写或无日志文件系统。

误删文件后立即停写磁盘
Linux 下删了 rm -rf 的文件,恢复成功率和磁盘是否继续写入强相关。只要被删文件的 inode 还没被新数据覆盖,就有机会找回。
- 立刻停止向该文件所在分区的所有写操作:别开新终端、别装包、别记日志、别用编辑器保存任何东西
- 如果误删在
/home,但系统还在跑 GUI,建议切到 tty(Ctrl+Alt+F2)操作,避免桌面环境后台自动写缓存 - 不要运行
apt upgrade、journalctl --vacuum-size或任何可能触发磁盘写入的命令
用 debugfs 直接读取 ext4 未覆写 inode
适用于 ext2/ext3/ext4 文件系统,且知道被删文件大致路径或名称。它不依赖文件名,而是通过 inode 恢复原始数据块,是最快最稳的方案之一。
- 先用
dumpe2fs -h /dev/sda1确认文件系统类型和块大小(常见为 4096) - 用
debugfs /dev/sda1进入交互模式,执行lsdel列出所有已删除但未覆写的 inode - 对目标 inode(比如
123456),用icat /dev/sda1 123456 > recovered.txt提取内容 - 注意:
icat不还原文件名和权限,只恢复原始字节流;若文件是二进制(如图片、PDF),需确保输出后缀匹配,否则打不开
extundelete 恢复带路径的完整文件
比 debugfs 更友好,能按原路径重建目录结构,但要求文件系统没被 e2fsck 自动清理过,且必须在 unmounted 状态下运行(或至少 remount 为 ro)。
- 安装:Ubuntu/Debian 上
sudo apt install extundelete;CentOS 需先启用 EPEL 再yum install extundelete - 卸载分区(如
/dev/sdb1):先sudo umount /dev/sdb1;若提示 busy,用lsof +D /mount/point查占用进程 - 恢复单个文件:
extundelete /dev/sdb1 --restore-file "path/to/file.txt" - 恢复整个目录:
extundelete /dev/sdb1 --restore-directory "path/to/dir",结果默认放在RECOVERED_FILES/ - 警告:
extundelete对 XFS/Btrfs 无效;若执行时提示No undeleted inodes,说明 inode 已被回收,得换其他方法
别信“实时监控类恢复工具”
像 photorec、testdisk 这类基于文件签名的工具,确实能扫出大量碎片文件,但它们完全丢失路径、文件名、修改时间,且无法区分同类型文件(比如一堆 file_001.jpg 里哪个是你昨天改的稿子)。
-
photorec适合 SD 卡、U 盘等无日志文件系统,或 ext4 已严重覆写的情况 - 它会把所有识别出的 JPEG/PDF/DOCX 块全导出,不按逻辑顺序,也不保证完整性——一个 10MB 的 Word 文档可能被拆成三段,拼起来打不开
- 运行前务必指定输出到另一块盘(
-d /mnt/backup),否则扫描过程本身就在持续写入,越救越丢 - 真正关键的业务文件,优先走
debugfs或extundelete;photorec是兜底选项,不是首选
恢复这事,快慢之间差的是 inode 是否还活着;而 inode 活不活,取决于你删完之后那几分钟有没有手欠敲下一个命令。










