使用lsof命令恢复Linux被删除文件

使用lsof命令恢复Linux被删除文件

lsof命令

简介

lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。

在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

语法

lsof (选项)

选项

1
2
3
4
5
6
7
8
9
10
11
12
-a:列出打开文件存在的进程;
-c<进程名>:列出指定进程所打开的文件;
-g:列出GID号进程详情;
-d<文件号>:列出占用该文件号的进程;
+d<目录>:列出目录下被打开的文件;
+D<目录>:递归列出目录下被打开的文件;
-n<目录>:列出使用NFS的文件;
-i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号>:列出指定进程号所打开的文件;
-u:列出UID号进程详情;
-h:显示帮助信息;
-v:显示版本信息。

实例

1
2
3
4
5
6
7
lsof
command PID USER FD type DEVICE SIZE NODE NAME
init 1 root cwd DIR 8,2 4096 2 /
init 1 root rtd DIR 8,2 4096 2 /
init 1 root txt REG 8,2 43496 6121706 /sbin/init
init 1 root mem REG 8,2 143600 7823908 /lib64/ld-2.5.so
init 1 root mem REG 8,2 1722304 7823915 /lib64/libc-2.5.so

lsof各列输出信息:

  • COMMAND:进程名
  • PID:进程标识符
  • PPID:父进程标识符(需要制定-R参数)
  • USER:进程所有者
  • PGID:进程所属组
  • FD:文件描述符,应用程序通过文件描述符识别该文件

文件描述符列表:

  1. cwd:current work dirctory,即应用程序启动的目录,除非它本身对这个目录进行更改
  2. txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的/sbin/init程序
  3. lnn:libraryreferences(AIX)
  4. er:FD information error(see NAME column)
  5. jld:jail directory(FreeBSD)
  6. ltx:shared library text(code and data)
  7. mxx:hex memory-mapped type number xx
  8. m86:DOS Merge mapped file
  9. mem:memory-mapped file
  10. mmap:memory-mapped device
  11. pd:parent directory
  12. rtd:root directory
  13. rt:kernel trace file(OpenBSD)
  14. v86 VP/ix mapped file
  15. 0:表示标准输出
  16. 1:表示标准输入
  17. 2:表示标准错误

文件类型:

  1. DIR:目录
  2. CHR:字符类型
  3. BLK:块设备类型
  4. UNIX:UNIX域套接字
  5. FIFO:先进先出(FIFO)队列
  6. IPv4:网际协议(IP)套接字
  7. DEVICE:制定磁盘的名称
  8. SIZE:文件的大小
  9. NODE:索引节点(文件在磁盘上的标识)
  10. NAME:打开文件的确切名称

恢复文件

利用lsof可以恢复一些系统日志,前提是这个进程必须存在。这里就拿最常用的/var/log/messages来举例说明

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@dp_data4 ~]# cp /var/log/messages /var/log/messages.bak  #备份
[root@dp_data4 ~]# lsof | grep /var/log/messages
rsyslogd 898 root 6w REG 253,0 303001 269094886 /var/log/messages
in:imjour 898 905 root 6w REG 253,0 303001 269094886 /var/log/messages
rs:main 898 906 root 6w REG 253,0 303001 269094886 /var/log/messages
abrt-watc 913 root 4r REG 253,0 303001 269094886 /var/log/messages
[root@dp_data4 ~]# rm /var/log/messages #删除
rm:是否删除普通文件 "/var/log/messages"?y
[root@dp_data4 ~]# lsof | grep /var/log/messages #多了(deleted)标志
rsyslogd 898 root 6w REG 253,0 303144 269094886 /var/log/messages (deleted)
in:imjour 898 905 root 6w REG 253,0 303144 269094886 /var/log/messages (deleted)
rs:main 898 906 root 6w REG 253,0 303144 269094886 /var/log/messages (deleted)
abrt-watc 913 root 4r REG 253,0 303144 269094886 /var/log/messages (deleted)

PID:898 FD:6,进入/proc/898/fd/6ll查看

1
2
3
[root@dp_data4 fd]# ll /proc/898/fd/6
l-wx------ 1 root root 64 7月 30 14:07 /proc/898/fd/6 -> /var/log/messages (deleted)
[root@dp_data4 fd]# cat 6 > /var/log/messages #恢复文件


参考资料:

  1. lsof命令
  2. Linux 利用lsof命令恢复删除的文件
如果文章对您有帮助,感谢您的赞助支持!