问题描述

有台虚拟机的磁盘最近经常zabbix报警说是空间不足,通过ssh终端连接但因为一点空间都没有了,所以google-otp连接时也报错了,只能用vnc去连接,清理了一些久远的日志后终于可以用ssh终端去连接了,继续将能清理的日志,压缩包等等都清掉了,但是磁盘空间用df -h去查看时avail列仍然是0。

在linux系统中,如果使用rm删除某个大文件,但在删除之前如果有进程已经打开该文件,却没有关闭这个句柄,那么linux内核还是不会释放该文件的磁盘空间,最后造成磁盘空间占用100%,因为没有磁盘提供读写,使系统无法正常运行。

解决思路

1.df和du两条命令返回的结果不一致

df -hdu -sh /*去查看根目录下所有子目录加起来总数的值不一致,一般的情况都是df -h显示磁盘使用100%,而du -sh *显示根目录占用磁盘空间却很小。遇到这种情况基本断定,某些大文件被某些进程占用,导致内核不能释放空间,不能更新磁盘显示,但是磁盘目录又被占用,所以显示不一致。因为文件删除后,占用该文件的进程没有被关闭,造成内核无法回收这些文件占用的空间。

如何记忆这两个命令:

du -- Disk Usage
df -- Disk Free

du的工作原理:
du命令会对待统计文件逐个调用fstat这个系统调用,获取文件大小。它的数据是基于文件获取的,所以有很大的灵活性,不一定非要针对一个分区,可以跨越多个分区操作。如果针对的目录中文件很多,du速度就会很慢了。

df的工作原理:
df命令使用的事statfs这个系统调用,直接读取分区的超级块信息获取分区使用情况。它的数据是基于分区元数据的,所以只能针对整个分区。由于df直接读取超级块,所以运行速度不受文件多少影响。

以下为五种问题的原因:

  • 1.用户删除了大量的文件后,du命令就不会在文件系统目录中统计这些文件。如果此时还在运行中的进程持有这个已经被删除的文件句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改,df命令仍会统计这个被删除的文件。 通过lsof命令查询处于deleted状态的文件,被删除的文件在系统中被标记为deleted。如果系统有大量deleted状态的文件,会导致dudf命令统计结果不一致。 可在目录下执行如下命令查看。
lsof |grep deleted
  • 2.Linux系统磁盘分区有保留区的概念,会给root或指定用户预留5%或更大的空间,当使用到这块保留区的空间时,fdisk命令的计算将会是负数。ext文件系统(包括ext2、ext3、ext4)都会默认预留5%的磁盘空间,使用root用户维护系统或记录系统关键日志使用。

  • 3.当用du -sh *命令来统计目录总容量时,如果该路径下包含隐藏文件,是不会包含在统计结果里的。

  • 4.由于删除了大量小文件,导致inode释放出现问题。

  • 5.由于数据盘挂载前该路径下就存在文件,挂载后用du无法查询到原路径文件。

参考链接:
https://superuser.com/questions/94217/why-ls-and-du-show-different-size

2.找出大文件删除

使用下面命令可以查找根目录下各个子目录的大小:

du -lh / --max-depth=1
97M     /boot
0       /dev
du: cannot access ‘/proc/57701’: No such file or directory
du: cannot access ‘/proc/57712/task/57712/fd/3’: No such file or directory
du: cannot access ‘/proc/57712/task/57712/fdinfo/3’: No such file or directory
du: cannot access ‘/proc/57712/fd/4’: No such file or directory
du: cannot access ‘/proc/57712/fdinfo/4’: No such file or directory
0       /proc
77M     /run
0       /sys
36M     /etc
11G     /root
5.5G    /var
3.1M    /tmp
9.7G    /usr
1.2G    /home
0       /media
0       /mnt
98M     /opt
0       /srv
639M    /data
28K     /itcast
28G     /

或者用find命令,例如对30天前,超过50M的系统日志进行删除,可以这样写:

find /var/log/* -name "*log*" -mtime +30 -size +50M -exec rm -fr {} \; 

具体应用日志的删除同理。

3.根目录下实际占用空间并没有满,有可能只是删除了文件,但实际进程还在文件还是打开的空间没有释放

列出当前系统已打开文件,但是deleted的状态

lsof -n|grep deleted
4.可以kill掉相应进程的pid,或重启相应的服务

如果tomcat的catalina.out文件被不规范的删除掉了,可以试试重启对应的tomcat实例。

lsof命令详解

lsof命令常用于查找进程打开了哪些文件以及与打开文件相关联的内容,下面将介绍lsof常用的命令参数

1.基本概念

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

2.lsof输出含义
COMMAND     PID   TID    USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd       1          root  cwd       DIR              253,2      4096          2 /
systemd       1          root  rtd       DIR              253,2      4096          2 /
systemd       1          root  txt       REG              253,2   1632744    6955213 /usr/lib/systemd/systemd
systemd       1          root  mem       REG              253,2     20064    6958299 /usr/lib64/libuuid.so.1.3.0
systemd       1          root  mem       REG              253,2    265576    6958301 /usr/lib64/libblkid.so.1.1.0
systemd       1          root  mem       REG              253,2     90176    6950732 /usr/lib64/libz.so.1.2.7
systemd       1          root  mem       REG              253,2    157424    6951082 /usr/lib64/liblzma.so.5.2.2
systemd       1          root  mem       REG              253,2     23968    6951287 /usr/lib64/libcap-ng.so.0.0.0
systemd       1          root  mem       REG              253,2     19896    6950707 /usr/lib64/libattr.so.1.1.0
systemd       1          root  mem       REG              253,2     19248    6957950 /usr/lib64/libdl-2.17.so
systemd       1          root  mem       REG              253,2    402384    6950722 /usr/lib64/libpcre.so.1.2.0
systemd       1          root  mem       REG              253,2   2156352    6950563 /usr/lib64/libc-2.17.so
systemd       1          root  mem       REG              253,2    142144    6950589 /usr/lib64/libpthread-2.17.so
systemd       1          root  mem       REG              253,2     88720    6968919 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
systemd       1          root  mem       REG              253,2     43712    6958290 /usr/lib64/librt-2.17.so
systemd       1          root  mem       REG              253,2    277808    6953826 /usr/lib64/libmount.so.1.1.0
systemd       1          root  mem       REG              253,2     91800    6954357 /usr/lib64/libkmod.so.2.2.10
systemd       1          root  mem       REG              253,2    127184    6958946 /usr/lib64/libaudit.so.1.0.0
systemd       1          root  mem       REG              253,2     61680    6952830 /usr/lib64/libpam.so.0.83.1
systemd       1          root  mem       REG              253,2     20048    6950710 /usr/lib64/libcap.so.2.22
systemd       1          root  mem       REG              253,2    155744    6950605 /usr/lib64/libselinux.so.1
systemd       1          root  mem       REG              253,2    163312    6968926 /usr/lib64/ld-2.17.so
systemd       1          root    0u      CHR                1,3       0t0       1028 /dev/null
systemd       1          root    1u      CHR                1,3       0t0       1028 /dev/null
systemd       1          root    2u      CHR                1,3       0t0       1028 /dev/null
systemd       1          root    3r      CHR             10,235       0t0       1132 /dev/autofs
systemd       1          root    4u  a_inode               0,10         0       6415 [eventpoll]
systemd       1          root    5u  a_inode               0,10         0       6415 [signalfd]
systemd       1          root    6r      DIR               0,22         0      10252 /sys/fs/cgroup/systemd
systemd       1          root    7u  a_inode               0,10         0       6415 [timerfd]
systemd       1          root    8u  netlink                          0t0  168379935 KOBJECT_UEVENT
systemd       1          root    9r      REG                0,3         0      10472 /proc/1/mountinfo
systemd       1          root   10r  a_inode               0,10         0       6415 inotify
systemd       1          root   11r      REG                0,3         0 4026532019 /proc/swaps
systemd       1          root   12u     unix 0xffff93914268e400       0t0  168379937 socket
systemd       1          root   13u  a_inode               0,10         0       6415 [timerfd]
systemd       1          root   14u     unix 0xffff93916be71000       0t0  168379158 /run/systemd/private
systemd       1          root   15u     unix 0xffff939169237000       0t0 3890288228 socket
systemd       1          root   16r  a_inode               0,10         0       6415 inotify

每行显示一个已经打开的文件,若不指定条件默认将显示所有进程打开的所有文件。lsof输出各列信息的意义如下:

  • 1.COMMAND:命令的名称;

  • 2.PID:进程id;

  • 3.TID:线程id,如果为空代表列出的是进程;

  • 4.TASKCMD:任务名称,通常与COMMAND相同;

  • 5.USER:进程所有者,用户ID号或登录名;

  • 6.FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等

  • 7.TYPE:文件类型,如DIR、REG等

  • 8.DEVICE:设备号

  • 9.SIZE/OFF:文件的大小/偏移量,以字节为单位;

  • 10.NODE:索引节点(文件在磁盘上的标识);

  • 11.NAME:文件挂载点和文件所在的系统;

  • FD列中的文件描述符cwd值表示应用程序的当前工作目录,默认是该应用程序启动的目录,除非它本身对这个目录进行更改。

  • FD是txt的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的/sbin/init程序。
    其次数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。如上的最后一行文件/dev/null,其文件描述符为2u,u表示该文件被打开并处于读取/写入模式,而不是只读(r)或只写 (w) 模式。

同时还有大写的W表示该应用程序具有对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具有三个文件描述符,从 0 到 2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 FD 都是从 3 开始。

  • 与 FD 列相比,Type 列则比较直观。文件和目录分别为REG和DIR。而CHR和BLK,分别表示字符和块设备,或者UNIX、FIFO 和 IPv4,分别表示 UNIX 域套接字、先进先出 (FIFO) 队列和网际协议 (IP) 套接字。
3.常用参数
-p pid: 输出指定进程打开的文件;
-l: 输出中使用ID代替用户名;
-u userName: 输出指定用户打开的文件;
-c string: 输出 COMMAND 列中包含 string 的项;
-d fd: 输出包含指定描述符的项;
fileName: 输出打开文件 fileName 的所有项;

-i [46] [protocol][@hostname|hostaddr][:service|port]: 输出符合指定条件的项,其中:
    46:分别指 IPv4、IPv6;
    protocol:指 TCP 或 UDP;
    hostname:  网络主机名;
    hostaddr: IP 地址;
    service: 包含在 /etc/services 中的名称;
    port: 端口号,可以是多个;
4.实例

4.1 无参数
在终端中直接执行lsof命令,如下所示:

COMMAND     PID   TID    USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd       1          root  cwd       DIR              253,2      4096          2 /
systemd       1          root  rtd       DIR              253,2      4096          2 /
systemd       1          root  txt       REG              253,2   1632744    6955213 /usr/lib/systemd/systemd
systemd       1          root  mem       REG              253,2     20064    6958299 /usr/lib64/libuuid.so.1.3.0
systemd       1          root  mem       REG              253,2    265576    6958301 /usr/lib64/libblkid.so.1.1.0
systemd       1          root  mem       REG              253,2     90176    6950732 /usr/lib64/libz.so.1.2.7
systemd       1          root  mem       REG              253,2    157424    6951082 /usr/lib64/liblzma.so.5.2.2
systemd       1          root  mem       REG              253,2     23968    6951287 /usr/lib64/libcap-ng.so.0.0.0
systemd       1          root  mem       REG              253,2     19896    6950707 /usr/lib64/libattr.so.1.1.0
systemd       1          root  mem       REG              253,2     19248    6957950 /usr/lib64/libdl-2.17.so
systemd       1          root  mem       REG              253,2    402384    6950722 /usr/lib64/libpcre.so.1.2.0
systemd       1          root  mem       REG              253,2   2156352    6950563 /usr/lib64/libc-2.17.so
systemd       1          root  mem       REG              253,2    142144    6950589 /usr/lib64/libpthread-2.17.so
systemd       1          root  mem       REG              253,2     88720    6968919 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
systemd       1          root  mem       REG              253,2     43712    6958290 /usr/lib64/librt-2.17.so

4.2 -p参数
执行命令lsof -p 1,列出1号进程打开的文件,如下所示:

COMMAND PID USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
systemd   1 root  cwd       DIR              253,2     4096          2 /
systemd   1 root  rtd       DIR              253,2     4096          2 /
systemd   1 root  txt       REG              253,2  1632744    6955213 /usr/lib/systemd/systemd
systemd   1 root  mem       REG              253,2    20064    6958299 /usr/lib64/libuuid.so.1.3.0
systemd   1 root  mem       REG              253,2   265576    6958301 /usr/lib64/libblkid.so.1.1.0
systemd   1 root  mem       REG              253,2    90176    6950732 /usr/lib64/libz.so.1.2.7
systemd   1 root  mem       REG              253,2   157424    6951082 /usr/lib64/liblzma.so.5.2.2
systemd   1 root  mem       REG              253,2    23968    6951287 /usr/lib64/libcap-ng.so.0.0.0
systemd   1 root  mem       REG              253,2    19896    6950707 /usr/lib64/libattr.so.1.1.0
systemd   1 root  mem       REG              253,2    19248    6957950 /usr/lib64/libdl-2.17.so
systemd   1 root  mem       REG              253,2   402384    6950722 /usr/lib64/libpcre.so.1.2.0
systemd   1 root  mem       REG              253,2  2156352    6950563 /usr/lib64/libc-2.17.so
systemd   1 root  mem       REG              253,2   142144    6950589 /usr/lib64/libpthread-2.17.so
systemd   1 root  mem       REG              253,2    88720    6968919 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
systemd   1 root  mem       REG              253,2    43712    6958290 /usr/lib64/librt-2.17.so
systemd   1 root  mem       REG              253,2   277808    6953826 /usr/lib64/libmount.so.1.1.0
systemd   1 root  mem       REG              253,2    91800    6954357 /usr/lib64/libkmod.so.2.2.10
systemd   1 root  mem       REG              253,2   127184    6958946 /usr/lib64/libaudit.so.1.0.0
systemd   1 root  mem       REG              253,2    61680    6952830 /usr/lib64/libpam.so.0.83.1
systemd   1 root  mem       REG              253,2    20048    6950710 /usr/lib64/libcap.so.2.22
systemd   1 root  mem       REG              253,2   155744    6950605 /usr/lib64/libselinux.so.1
systemd   1 root  mem       REG              253,2   163312    6968926 /usr/lib64/ld-2.17.so
systemd   1 root    0u      CHR                1,3      0t0       1028 /dev/null
systemd   1 root    1u      CHR                1,3      0t0       1028 /dev/null
systemd   1 root    2u      CHR                1,3      0t0       1028 /dev/null

4.3 -l参数
执行命令lsof -l,输出中使用用户ID代替用户名,如下所示:

COMMAND      PID   TID     USER   FD      TYPE             DEVICE   SIZE/OFF       NODE NAME
systemd        1              0  cwd       DIR              253,0        250         64 /
systemd        1              0  rtd       DIR              253,0        250         64 /
systemd        1              0  txt       REG              253,0    1612152  201812960 /usr/lib/systemd/systemd
systemd        1              0  mem       REG              253,0      20064      36906 /usr/lib64/libuuid.so.1.3.0
systemd        1              0  mem       REG              253,0     265576    1946616 /usr/lib64/libblkid.so.1.1.0
systemd        1              0  mem       REG              253,0      90176    1946606 /usr/lib64/libz.so.1.2.7
systemd        1              0  mem       REG              253,0     157424      88392 /usr/lib64/liblzma.so.5.2.2
systemd        1              0  mem       REG              253,0      23968      88428 /usr/lib64/libcap-ng.so.0.0.0
systemd        1              0  mem       REG              253,0      19896      73620 /usr/lib64/libattr.so.1.1.0

例子中,USER列显示的是用户ID而不是用户名

4.4 -u参数
执行命令lsof -u elasticsearch,输出elasticsearch用户打开的文件:

COMMAND     PID          USER   FD      TYPE             DEVICE  SIZE/OFF      NODE NAME
java      61425 elasticsearch  cwd       DIR              253,0       168  67113067 /usr/local/elasticsearch
java      61425 elasticsearch  rtd       DIR              253,0       250        64 /
java      61425 elasticsearch  txt       REG              253,0      9024 201384215 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64/jre/bin/java
java      61425 elasticsearch  mem       REG              253,0   2474777   2631737 /usr/local/elasticsearch/data/nodes/0/indices/zrWs8KYJSza45auc3Rw2_w/0/index/_1z6_Lucene70_0.dvd
java      61425 elasticsearch  mem       REG              253,0   8782613   2631733 /usr/local/elasticsearch/data/nodes/0/indices/zrWs8KYJSza45auc3Rw2_w/0/index/_1z6.fdt
java      61425 elasticsearch  mem       REG              253,0   2782591   2631739 /usr/local/elasticsearch/data/nodes/0/indices/zrWs8KYJSza45auc3Rw2_w/0/index/_1z6.dim
java      61425 elasticsearch  mem       REG              253,0   2219170   2631709 /usr/local/elasticsearch/data/nodes/0/indices/zrWs8KYJSza45auc3Rw2_w/0/index/_xc_Lucene70_0.dvd
java      61425 elasticsearch  mem       REG              253,0   2458366   2631712 /usr/local/elasticsearch/data/nodes/0/indices/zrWs8KYJSza45auc3Rw2_w/0/index/_xc.dim
java      61425 elasticsearch  mem       REG              253,0   7855443   2631706 /usr/local/elasticsearch/data/nodes/0/indices/zrWs8KYJSza45auc3Rw2_w/0/index/_xc.fdt

4.5 -c参数
执行lsof -c sshd,输出COMMAND列包括sshd的项,如下所示:

COMMAND    PID USER   FD   TYPE             DEVICE SIZE/OFF      NODE NAME
sshd      1332 root  cwd    DIR              253,0      250        64 /
sshd      1332 root  rtd    DIR              253,0      250        64 /
sshd      1332 root  txt    REG              253,0   853040    416459 /usr/sbin/sshd
sshd      1332 root  mem    REG              253,0    61560   1946576 /usr/lib64/libnss_files-2.17.so
sshd      1332 root  mem    REG              253,0    68192     88405 /usr/lib64/libbz2.so.1.0.6
sshd      1332 root  mem    REG              253,0    99944     88410 /usr/lib64/libelf-0.170.so
sshd      1332 root  mem    REG              253,0    19896     73620 /usr/lib64/libattr.so.1.1.0
sshd      1332 root  mem    REG              253,0    15688     73670 /usr/lib64/libkeyutils.so.1.5
sshd      1332 root  mem    REG              253,0    67104     43373 /usr/lib64/libkrb5support.so.0.1
sshd      1332 root  mem    REG              253,0    11464      1231 /usr/lib64/libfreebl3.so
sshd      1332 root  mem    REG              253,0   251776     73571 /usr/lib64/libnspr4.so
sshd      1332 root  mem    REG              253,0    20040     73572 /usr/lib64/libplc4.so
sshd      1332 root  mem    REG              253,0    15744     43391 /usr/lib64/libplds4.so
sshd      1332 root  mem    REG              253,0   194944     73570 /usr/lib64/libnssutil3.so
sshd      1332 root  mem    REG              253,0  1249544     88656 /usr/lib64/libnss3.so
sshd      1332 root  mem    REG              253,0   164288     88657 /usr/lib64/libsmime3.so
sshd      1332 root  mem    REG              253,0   323664     88658 /usr/lib64/libssl3.so
sshd      1332 root  mem    REG              253,0   470328     36908 /usr/lib64/libssl.so.1.0.2k
sshd      1332 root  mem    REG              253,0   121320     88688 /usr/lib64/libsasl2.so.3.0.0

4.6 -d参数
执行命令lsof -d 12,输出打开文件描述符12的所有项,如下所示:

COMMAND      PID          USER   FD      TYPE             DEVICE SIZE/OFF      NODE NAME
systemd        1          root   12u     unix 0xffff9c2bf5ca8400      0t0     12889 /run/systemd/private
systemd-j    473          root   12u  a_inode               0,10        0      7239 [timerfd]
systemd-l    673          root   12u     unix 0xffff9c2c75b47400      0t0     24214 socket
dbus-daem    674          dbus   12u     unix 0xffff9c2c579f6400      0t0     28531 /run/dbus/system_bus_socket
superviso    791          root   12w     FIFO                0,9      0t0     25312 pipe
java         867        apache   12r      REG              253,0   139612 135477660 /usr/local/zookeeper/apache-zookeeper-3.5.10-bin/lib/netty-transport-classes-epoll-4.1.77.Final.jar
java         869          root   12r      REG              253,0     8764 135489756 /usr/local/logstash/logstash-core/lib/jars/j2objc-annotations-1.1.jar
java         871        apache   12r      REG              253,0    98658   2160256 /usr/local/kafka/kafka_2.12-2.8.0/libs/connect-api-2.8.0.jar
dockerd     1341          root   12u  netlink                         0t0     28366 XFRM
PM2         1482          root   12u  a_inode               0,10        0      7239 [eventfd]
node        5126          root   12u     IPv4            2799435      0t0       TCP elk1:39004->elk1:wap-wsp (ESTABLISHED)
java       61425 elasticsearch   12r      REG              253,0   100019 134323185 /usr/local/elasticsearch/lib/lucene-backward-codecs-7.5.0.jar
sshd       86209          root   12u      CHR                5,2      0t0      1115 /dev/ptmx
nginx      87830         nginx   12u  a_inode               0,10        0      7239 [eventfd]
nginx      87831         nginx   12u  a_inode               0,10        0      7239 [eventpoll]
node      100360          root   12w     FIFO                0,9      0t0   5337034 pipe
sshd      113462          root   12u      CHR                5,2      0t0      1115 /dev/ptmx

4.7 fileName
执行命令,查看打开文件的进程项,如下所示:

lsof /usr/lib64/libnss_files-2.17.so
COMMAND      PID          USER  FD   TYPE DEVICE SIZE/OFF    NODE NAME
systemd-u    505          root mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
auditd       635          root mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
VGAuthSer    663          root mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
rpcbind      666           rpc mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
vmtoolsd     669          root mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
polkitd      670       polkitd mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
systemd-l    673          root mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
dbus-daem    674          dbus mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
chronyd      676        chrony mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
crond        696          root mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
agetty       707          root mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
superviso    791          root mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
java         867        apache mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
java         869          root mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
java         871        apache mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
tuned       1330          root mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
sshd        1332          root mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
container   1339          root mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
dockerd     1341          root mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
node        5126          root mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
java       61425 elasticsearch mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
rsyslogd   62322          root mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
sshd       86209          root mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
bash       86222          root mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
nginx      87829          root mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
nginx      87830         nginx mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
nginx      87831         nginx mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
sshd      113462          root mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so
bash      113475          root mem    REG  253,0    61560 1946576 /usr/lib64/libnss_files-2.17.so

4.8 -i参数
(1).执行命令lsof -i 4,输出TYPE是IPv4的所有项,如下所示:

COMMAND    PID          USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
rpcbind    666           rpc    6u  IPv4   23206      0t0  UDP *:sunrpc 
rpcbind    666           rpc    7u  IPv4   23208      0t0  UDP *:837 
rpcbind    666           rpc    8u  IPv4   23209      0t0  TCP *:sunrpc (LISTEN)
chronyd    676        chrony    5u  IPv4   24242      0t0  UDP localhost:323 
java       867        apache   42u  IPv4   25599      0t0  TCP *:32975 (LISTEN)
java       867        apache   43u  IPv4   29956      0t0  TCP *:webcache (LISTEN)
java       867        apache   52u  IPv4   29666      0t0  TCP *:eforward (LISTEN)
java       867        apache   56u  IPv4   30354      0t0  TCP elk1:eforward->elk1:55062 (ESTABLISHED)
java       869          root   55u  IPv4   38991      0t0  TCP elk1:38794->elk1:wap-wsp (CLOSE_WAIT)
java       869          root   83u  IPv4   38703      0t0  TCP elk1:38796->elk1:wap-wsp (CLOSE_WAIT)
java       869          root   84u  IPv4   39027      0t0  TCP elk1:38798->elk1:wap-wsp (CLOSE_WAIT)
java       869          root   85u  IPv4   39029      0t0  TCP elk1:sruth->elk1:wap-wsp (CLOSE_WAIT)
java       869          root   98u  IPv4   39975      0t0  TCP *:lxi-evntsvc (LISTEN)
java       869          root  101u  IPv4   39213      0t0  TCP localhost:micromuse-ncpw (LISTEN)
java       871        apache  110u  IPv4   29992      0t0  TCP *:36256 (LISTEN)
java       871        apache  121u  IPv4   30846      0t0  TCP elk1:55062->elk1:eforward (ESTABLISHED)
java       871        apache  177u  IPv4   31320      0t0  TCP *:XmlIpcRegSvc (LISTEN)
sshd      1332          root    3u  IPv4   28899      0t0  TCP *:ssh (LISTEN)
node      5126          root   10u  IPv4   38130      0t0  TCP elk1:esmagent (LISTEN)
node      5126          root   11u  IPv4 2799427      0t0  TCP elk1:39002->elk1:wap-wsp (ESTABLISHED)
node      5126          root   12u  IPv4 2799435      0t0  TCP elk1:39004->elk1:wap-wsp (ESTABLISHED)
node      5126          root   13u  IPv4 3001582      0t0  TCP elk1:39034->elk1:wap-wsp (ESTABLISHED)
node      5126          root   14u  IPv4 2799462      0t0  TCP elk1:39008->elk1:wap-wsp (ESTABLISHED)
node      5126          root   15u  IPv4 2799474      0t0  TCP elk1:39010->elk1:wap-wsp (ESTABLISHED)
node      5126          root   16u  IPv4 2799475      0t0  TCP elk1:39012->elk1:wap-wsp (ESTABLISHED)
node      5126          root   17u  IPv4 2799476      0t0  TCP elk1:39014->elk1:wap-wsp (ESTABLISHED)
node      5126          root   18u  IPv4 2799477      0t0  TCP elk1:39016->elk1:wap-wsp (ESTABLISHED)
node      5126          root   19u  IPv4 3021283      0t0  TCP elk1:39036->elk1:wap-wsp (ESTABLISHED)
node      5126          root   20u  IPv4 2799479      0t0  TCP elk1:39020->elk1:wap-wsp (ESTABLISHED)
node      5126          root   22u  IPv4 2799481      0t0  TCP elk1:39024->elk1:wap-wsp (ESTABLISHED)
node      5126          root   23u  IPv4 2790049      0t0  TCP elk1:39026->elk1:wap-wsp (ESTABLISHED)
node      5126          root   24u  IPv4 2790051      0t0  TCP elk1:39028->elk1:wap-wsp (ESTABLISHED)
node      5126          root   25u  IPv4 2800378      0t0  TCP elk1:39030->elk1:wap-wsp (ESTABLISHED)

(2).执行命令lsof -i UDP,输出协议类型为UDP的所有项,如下所示:

COMMAND PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 666    rpc    6u  IPv4  23206      0t0  UDP *:sunrpc 
rpcbind 666    rpc    7u  IPv4  23208      0t0  UDP *:837 
rpcbind 666    rpc    9u  IPv6  23210      0t0  UDP *:sunrpc 
rpcbind 666    rpc   10u  IPv6  23211      0t0  UDP *:837 
chronyd 676 chrony    5u  IPv4  24242      0t0  UDP localhost:323 
chronyd 676 chrony    6u  IPv6  24243      0t0  UDP localhost:323 
5.总结

lsof 在查找关于打开文件的相关信息时经常用到,上面对常用命令参数进行了介绍,更详细的内容可以查看 man 手册。

https://man7.org/linux/man-pages/man8/lsof.8.html
https://www.cnblogs.com/sparkdev/p/10271351.html
https://blog.csdn.net/xifeijian/article/details/9088137

恢复删除的文件

当Linux系统受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。此外,管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志。有时可以通过lsof来恢复这些文件。当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。在/proc目录下,包含了反映内核和进程树的各种文件。/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。大多数与lsof相关的信息都存储于以进程的PID命名的目录中,即/proc/1234中包含的是PID为1234的进程的信息。每个进程目录中存在着各种文件,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。lsof程序使用该信息和其他关于内核内部状态的信息来产生其输出。所以lsof可以显示进程的文件描述符和相关的文件名等信息。也就是我们可以通过访问进程的文件描述符来找到该文件的相关信息。当系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,那么我们就可以通过lsof从/proc目录下恢复该文件的内容。 假如由于误操作将/var/log/messages文件删除掉了,那么这时要将/var/log/messages文件恢复的方法如下,首先使用lsof来查看当前是否有进程打开/var/log/messages文件,如下:

lsof|grep /var/log/messages
rsyslogd   62322                root    7w      REG              253,0   15908117  134327511 /var/log/messages (deleted)
in:imjour  62322 62328          root    7w      REG              253,0   15908117  134327511 /var/log/messages (deleted)
rs:main    62322 62329          root    7w      REG              253,0   15908117  134327511 /var/log/messages (deleted)

从上面的信息可以看到PID 62322(rsyslogd)打开文件的文件描述符是7。同时还可以看到/var/log/messages已经标记被删除了。因此我们可以在/proc/62322/fd/7(fd下的每个以数字命名的文件表示进程对应的文件描述符)中查看相应的信息,如下:

head -n 10 /proc/62322/fd/7
Aug 15 10:35:01 elk1 rsyslogd: [origin software="rsyslogd" swVersion="8.24.0" x-pid="1336" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
Aug 15 10:35:02 elk1 rhsmd: In order for Subscription Manager to provide your system with updates, your system must be registered with the Customer Portal. Please enter your Red Hat login to ensure your system is up-to-date.
Aug 15 10:35:04 elk1 systemd: kubelet.service holdoff time over, scheduling restart.
Aug 15 10:35:04 elk1 systemd: Started kubelet: The Kubernetes Node Agent.
Aug 15 10:35:04 elk1 systemd: Starting kubelet: The Kubernetes Node Agent...
Aug 15 10:35:04 elk1 kubelet: F0815 10:35:04.326327   80004 server.go:198] failed to load Kubelet config file /var/lib/kubelet/config.yaml, error failed to read kubelet config file "/var/lib/kubelet/config.yaml", error: open /var/lib/kubelet/config.yaml: no such file or directory
Aug 15 10:35:04 elk1 kubelet: goroutine 1 [running]:
Aug 15 10:35:04 elk1 kubelet: k8s.io/kubernetes/vendor/k8s.io/klog/v2.stacks(0xc000122001, 0xc000136840, 0xfb, 0x14d)
Aug 15 10:35:04 elk1 kubelet: /workspace/anago-v1.19.2-rc.0.12+19706d90d87784/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s.io/kubernetes/vendor/k8s.io/klog/v2/klog.go:996 +0xb9
Aug 15 10:35:04 elk1 kubelet: k8s.io/kubernetes/vendor/k8s.io/klog/v2.(*loggingT).output(0x6cf6140, 0xc000000003, 0x0, 0x0, 0xc000b200e0, 0x6b49c19, 0x9, 0xc6, 0xc00005ba00)

从上面的信息可以看出,查看/proc/62322/fd/7就可以得到所要恢复的数据。如果可以通过文件描述符查看相应的数据,那么就可以使用I/O重定向将其复制到文件中,如:cat /proc/62322/fd/7 > /var/log/messages对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用。

posted on 2022-08-15 18:25  jiayou111  阅读(2821)  评论(0编辑  收藏  举报