前几天一个北京的朋友给我发信息,让我帮他们推荐一个DBA,我就把曾经的一个前同事给推荐过去了,前同事事后跟我说那边5个人同时面试他,问了很多问题,其中问了一个rm 删除文件如何恢复,他没回答好。我说我记得曾经看过一篇文章介绍如何恢复,但对这位前同事说的这个事也没太上心,也没多去查什么资料,就这么过去了。
促成我今天写这篇文章的原因是就在今天下午刚刚不久前也是一个北京的朋友问我rm -rf 删除文件了,该如何恢复,这朋友之前搞了好多年SqlServer,对于Linux这块也是接触时间不长,我想还是别直接把网上查询的东西就丢给这朋友,自己亲测一会才最好,所以才促成写下这篇文章。
我找来一台测试服务器,模拟删除一个文件。以下是测试过程。
1、模拟删除
[root@redis-3 home]# pwd
/home
[root@redis-3 home]# ls -lrt
total 12
drwx------ 2 zabbix zabbix 4096 Mar 31 2021 zabbix
drwx------ 2 root root 4096 Mar 31 2021 admin
drwx------ 3 elasticsearch elasticsearch 4096 Aug 10 2021 elasticsearch# 拷贝一文件至 /home目录
[root@redis-3 home]# cp -p /usr/local/redis_cluster/redis_6379/logs/redis_6379.log /home# 另打开一会话模拟查看该文件的进程操作
[root@redis-3 home]# tail -10f redis_6379.log
2467:M 13 May 2022 17:16:01.897 * 1 changes in 900 seconds. Saving...
2467:M 13 May 2022 17:16:01.898 * Background saving started by pid 27958
27958:C 13 May 2022 17:16:01.904 * DB saved on disk# 然后执行rm -rf 删除该文件
[root@redis-3 home]# rm -rf redis_6379.log
[root@redis-3 home]# ls -lrt redis_6379.log
ls: cannot access redis_6379.log: No such file or directory
2、模拟恢复
# 使用lsof 命令查看是否有进程打开redis_6379.log文件
[root@redis-3 home]# lsof |grep delete|grep redis
tail 31380 root 3r REG 253,0 10220 263710 /home/redis_6379.log (deleted)# 从上面可看到该文件状态为已删除(delete)状态# 查看/proc 下是否存在恢复数据
[root@redis-3 home]# cd /proc/31380/fd # /proc/31380/fd 为进程操作的文件描述目录
[root@redis-3 fd]# ll
total 0
lrwx------ 1 root root 64 May 25 14:32 0 -> /dev/pts/2
lrwx------ 1 root root 64 May 25 14:32 1 -> /dev/pts/2
lrwx------ 1 root root 64 May 25 14:32 2 -> /dev/pts/2
lr-x------ 1 root root 64 May 25 14:32 3 -> /home/redis_6379.log (deleted) # 此处的 3 代表文件描述符,使用ls 命令的时候可以看到后面的信息在不停的闪烁
lr-x------ 1 root root 64 May 25 14:32 4 -> anon_inode:inotify# 使用I/O文件重定向恢复文件
[root@redis-3 fd]# cat /proc/31380/fd/3 > /home/redis_6379.log# 查看恢复后的文件是否存在
[root@redis-3 fd]# ls -lrt /home/redis_6379.log
-rw-r--r-- 1 root root 10220 May 25 14:41 /home/redis_6379.log# 至此文件已恢复
此种场景的恢复适合有进程在rm -rf 时存在,若没有进程存在,直接执行rm -rf 后 通过lsof 查询不到相关信息,无法恢复。
后续如有更复杂场景,待继续测试。