在Linux文件系统中,文件名实际是指向索引节点"inode"的链接。Linux创建文件系统后,就会生成inode表,inode索引节点会包含文件的属性、block块的指针等信息关于inode介绍看我这篇博文。
当使用"rm"命令删除某文件时,只是删除了指向inode索引节点的链接,但是没有删除inode索引节点,也就是说inode所指向的block块中所存放的数据并没有被删除。其它进程仍然可以使用此inode索引节点所指向的数据。若是一个inode索引节点没有任何进程调用,也没有任何文件名链接时,就会定时被系统回收这部分存储空间。
"lsof"命令用于查看系统中进程打开的文件、打开文件的进程、进程打开的端口(TCP、UDP)。所以当我们使用"rm"命令删除某个文件时,可以通过"lsof"命令来查看是否还有进程调用此文件的inode索引节点。若是有,就可以恢复;若是没有,哭吧。因为"lsof"命令需要访问核心内存和各种文件,所以需要root用户执行。
语法:
lsof(选项)
参数:
-a:列出打开文件存在的进程;
-c<进程名>:列出指定进程所打开的文件;
-g:列出GID号进程详情;
-d<文件号>:列出占用该文件号的进程;
+d<目录>:列出目录下被打开的文件;
+D<目录>:递归列出目录下被打开的文件;
-n<目录>:列出使用NFS的文件;
-i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号>:列出指定进程号所打开的文件;
-u:列出UID号进程详情;
-h:显示帮助信息;
-v:显示版本信息。
比如要查看22端口有哪些进程在访问:
losf输出各列信息的意义如下:
- COMMAND:进程名称
- PID:进程标识符
- USER:进程所有者
- FD:文件描述符,应用程序通过文件描述符识别该文件
- TYPE:文件类型;常见的有"DIR"表示目录、"CHR"表示字符类型、"IPV4"表示网际协议套接字
- DEVICE:指定磁盘的名称
- SIZE./OFF:文件的大小
- NODE:索引节点
- NAME:打开文件的确切名称
恢复文件
下面和大家分享一下如何恢复文件,我拿"/var/log/messages"日志文件来举例;大家自己在做测试的时候做好现备份一下。
第一步:备份文件
第二步:在进程调用"/var/log/messages"时,就把"/var/log/messages"这个文件删掉
第三步:删除"/var/log/messages"文件之后,再来看看进程的变化
大家可以看到原来调用"/var/log/messages"文件的进程发生了变化,提示信息后面多了"deleted"。要找到"/var/log/messages"现在在哪里,还要看看这个"PID:900 FD:4 “,于是我们就进入”/proc/900/fd"这个目录中查看有哪些文件:
我们看到了有一个名称为"4"的文件是指向"/var/log/messages"的链接,于是我们可以通过文件名为"4"的内容恢复"/var/log/messages"的文件内容: