Skip to content

恢复文件

Linux 中 rm 只是删除文件名,只要有进程还打开着文件(fd 未关闭),文件数据就不会真正删除, 可通过 /proc/<pid>/fd/<fd> 读回文件内容

  • inode:文件真实身份
  • 目录项:文件名 → inode 的映射
  • fd(文件描述符):进程打开文件后的引用
  • /proc/<pid>/fd/ 下每个数字表示一个 fd 实际是指向文件的符号链接

删除文件 = 删除目录项
真正释放 = 目录项删除 + 所有 fd 关闭

示例:

text
3 -> /var/log/xxx.log (deleted)

Eg:恢复被 rm 掉的 log 文件

场景

  • 日志文件:/var/log/app.log
  • 程序仍在运行并写日志
  • 文件被误执行 rm /var/log/app.log

找到占用该文件的进程(pid)

bash
lsof | grep app.log

# 或只看被删除的文件:
lsof | grep deleted

# 示例输出:
java 12345 app 3w REG 8,1 10485760 /var/log/app.log (deleted)
    pid:12345
    fd:3

# 确认 fd 指向已删除文件
ls -l /proc/12345/fd/3

# 输出:
3 -> /var/log/app.log (deleted)

通过 fd 恢复文件内容

sh
cp /proc/12345/fd/3 /tmp/app.log.recover
cat /proc/12345/fd/3 > /tmp/app.log.recover

Last updated: