前言
某天做了一件错事,同步文件rsync 加了--delete,把目的目录内的文件给删除掉了,而这些文件还比较重要,还好程序在运行,暂时未造成影响,但是如果程序重启会出现故障。 没办法 需要恢复文件。一顿操作,记录下, 过程比较忐忑, 结果比较好, 方法也比较简单。
直接上恢复过程演示, 这种恢复文件的方法有一点局限性, 文件要被程序占用,程序仍在运行中。
恢复过程
恢复过程:
找到进程PID, 然后到/proc/$PID/fd/目录下找文件,然后将文件恢复至指定目录即可, 如果fd目录下没有该文件,无法恢复。
sudo cp $(sudo find /proc/$PID -type l 2>/dev/null | xargs ls -l 2>/dev/null | grep deleted | head -1 | awk '{print $9,$11}')
示例
例如:写一个测试的脚本:长时间运行
bash:
# cat /root/text/1.sh
#! /bin/bash
sleep 1000
然后在运行中删除该文件:
可以看到该文件已经被删除了, 然后就是恢复过程:
至此 恢复完成。
原理解析:
从/proc目录下的信息中恢复“文件已删除,但进程仍保持打开该文件的状态”的文件。/proc目录是挂载的是在内存中所映射的一块区域,当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。
因此,当我们对文件进行读取或写入时(即有进程正使用文件时),哪怕硬盘中的该文件已删除,还可以从内存中的信息恢复文件。
注意:必须以 root 用户的权限运行, 因为lsof 需要访问核心内存和各种文件。
只能恢复“文件已删除,但进程仍保持打开该文件的状态”的文件。
如果误删了目录,目录中的其他文件未被进程打开,没有进行使用的文件将无法使用此方法恢复。
lsof输出信息的意义:
COMMAND 进程的PID(进程标识符)
USER 进程所有者
FD 用来识别该文件(文件描述符)
DEVICE 指定磁盘的名称
SIZE 文件的大小
NODE 索引节点(文件在磁盘上的标识)
NAME 打开文件的确切名称
最常用参数:
-c 显示某进程现在打开的文件
-p 显示哪些文件被某pid进程打开
-g 显示归属某gid的进程情况
-d 显示目录下被进程开启的文件
-d 显示使用fd为4的进程
-i:80 显示打开80端口的进
总结:
线上操作需要谨慎,数据无价,误删莫慌张, 不要乱操作,及时补救, 补救不了及时进行升级处理避免出现更大的故障。