Linux 文件恢复与误删处理技巧

4次阅读

误删文件后应立即停止磁盘写入以提高恢复成功率;可用lsof找回仍被进程占用的已删文件;extundelete仅适用于未启用extents/filetype特性的ext4;photorec按文件头扫描恢复,但无文件名和目录结构;推荐用trash-cli替代rm实现回收站功能。

Linux 文件恢复与误删处理技巧

误删文件后第一件事不是慌,而是立刻停写磁盘

linux 下删除文件只是解除 inode 链接,数据块本身通常还在,但只要磁盘继续写入(比如日志、缓存、新文件),就可能被覆盖。恢复成功率和「是否立即停止写入」强相关。

  • 立刻执行 sudo lsof +L1:如果文件刚被删但进程还在用,lsof 会显示 deleted 状态的条目,此时可直接从 /proc/<pid>/fd/<fd_num></fd_num></pid> 复制回来
  • 不要运行 apt upgradejournalctl --vacuum、甚至不要开新终端(bash 历史可能写入 ~/.bash_history)
  • 如果在系统盘操作,优先切到 Live USB 环境再恢复,避免原系统后台服务持续写盘

ext4 文件系统下用 extundelete 恢复已 unlink 的文件

extundelete 是目前对 ext3/ext4 最可靠的老牌工具,但它只支持未启用 extents 或禁用 filetype 特性的旧格式;现代 ubuntu/debian 默认开启所有特性,所以它常报 No undeletable inodes in Directory

  • 确认文件系统特性:sudo dumpe2fs -h /dev/sda1 | grep -i "features",若输出含 extentsfiletypeextundelete 很可能失效
  • 真正能用的前提是:文件删除前未被 chattr +e(启用 extent 存储),且没开启日志模式(data=journal
  • 基本命令:sudo extundelete /dev/sda1 --restore-file home/user/report.txt,恢复结果默认放在 RECOVERED_FILES/ 目录

通用方案:用 photorec 按文件头恢复,不依赖文件系统结构

photorec 不读取目录或 inode,而是扫描整个块设备,靠识别常见文件魔数(如 PDF 的 %PDF、PNG 的 x89PNG)重建文件。适合 ext4/xfs/btrfs 甚至损坏分区,但无法恢复原始文件名和目录结构。

  • 必须指定原始设备路径,不能挂载后操作:sudo photorec /dev/sda1,否则会跳过已挂载分区
  • 恢复出的文件按类型编号命名(如 f0000001.png),需后续用 filexxd 手动筛查
  • 速度慢、结果杂,但对大文件(数据库、视频、压缩包)找回率明显高于基于 inode 的工具
  • 别指望它恢复小文本文件——.txt 几乎无魔数,容易漏掉或拼错

预防比恢复重要:用 trash-cli 替代 rm

Linux 默认没有回收站机制,rm 是硬删除。装 trash-cli 后,trash 命令把文件移到 ~/.local/share/Trash,保留路径信息和删除时间,还能用 trash-list 查看、trash-restore 交互式还原。

  • 安装:sudo apt install trash-cli(Debian/Ubuntu)或 pip install trash-cli
  • 建议 alias:alias rm='trash',但注意脚本里慎用——某些自动化流程依赖 rm 的退出码语义
  • trash 不处理 root 权限下的文件,sudo trash /etc/config.bak 会失败,得手动 mv 到 /root/.local/share/Trash

恢复这事,永远卡在「删完才发现没备份」和「以为能恢复结果只捞出碎片」之间。最常被忽略的是:哪怕用了 photorec,也得先用 dd 对磁盘做镜像再扫,否则边扫边写,越救越少。

text=ZqhQzanResources