使用lsof恢复误删日志或数据库文件

此方法只对正在运行中的进程所对应的文件被误删有效,其他的那种常规删除还请参考我的数据恢复文章https://www.chen-hao.com.cn/posts/49799/ (可能不见得很有效,重要数据还请专业人士恢复)

原理


当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。

在Linux系统的/proc 分区下保存着进程的目录和名字,包含fd(文件描述符)和其下的子目录(进程打开文件的链接),那么如果删除了一个文件,还存在一个 inode的引用:/proc/进程号/fd/文件描述符。我们只要知道当前打开文件的进程pid和文件描述符fd就能利用lsof工具列出进程打开的文件。通过lsof我们就可以进行简单的文件恢复工作,只要是存在引用的文件被删除,理论上我们都能恢复。

恢复细节


1.首先随便一个正在运行的进程的日志文件,以tomcat为例
1
rm -rf catalina.out

2.找到进程相关pid和文件描述符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
lsof | grep catalina.out
进程名 PID 用户名 文件描述符
java 16247 root 1w REG 253,17 3677364 16384009 /data/tomcat_client/logs/catalina.out (deleted)
java 16247 root 2w REG 253,17 3677364 16384009 /data/tomcat_client/logs/catalina.out (deleted)
java 16247 6430 root 1w REG 253,17 3677364 16384009 /data/tomcat_client/logs/catalina.out (deleted)
java 16247 6430 root 2w REG 253,17 3677364 16384009 /data/tomcat_client/logs/catalina.out (deleted)
java 16247 16248 root 1w REG 253,17 3677364 16384009 /data/tomcat_client/logs/catalina.out (deleted)
java 16247 16248 root 2w REG 253,17 3677364 16384009 /data/tomcat_client/logs/catalina.out (deleted)
java 16247 16249 root 1w REG 253,17 3677364 16384009 /data/tomcat_client/logs/catalina.out (deleted)
java 16247 16249 root 2w REG 253,17 3677364 16384009 /data/tomcat_client/logs/catalina.out (deleted)
java 16247 16250 root 1w REG 253,17 3677364 16384009 /data/tomcat_client/logs/catalina.out (deleted)
java 16247 16250 root 2w REG 253,17 3677364 16384009 /data/tomcat_client/logs/catalina.out (deleted)
java 16247 16251 root 1w REG 253,17 3677364 16384009 /data/tomcat_client/logs/catalina.out (deleted)
java 16247 16251 root 2w REG 253,17 3677364 16384009 /data/tomcat_client/logs/catalina.out (deleted)
java 16247 16252 root 1w REG 253,17 3677364 16384009 /data/tomcat_client/logs/catalina.out (deleted)

3.找到被删除文件的文件描述符

1
2
ls /proc/16247/fd/1
/proc/16247/fd/1

4.找回日志

1
cat /proc/16247/fd/1 > catalina.out

所以误删文件不要慌,如何做出决定才是最重要的,将损失降到最低,一直都是我们解决故障的标准。

本文标题:使用lsof恢复误删日志或数据库文件

文章作者:火柴

发布时间:2017年07月25日 - 13:07

最后更新:2017年07月25日 - 14:07

原始链接:http://www.chen-hao.com.cn/posts/14205/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

火柴 wechat
扫描上方二维码关注我的博客!
0%