• 【一般排查思路】针对银河麒麟高级服务器操作系统磁盘空间已满


    1. 本身磁盘空间已满

    有时候我们会看到服务器上有提示“设备上没有空间”,如图1。

    图 1

    如果是磁盘本身空间已满,我们可以借助du工具来排查,比如首先cd / 切换到根目录,然后 du -sh * | sort -rh | head -n 3查看空间占用最大的前3个文件或者目录,这里我们可以看到 /usr、/var、/run目录占用比较大,如图2。

    图 2

    然后同理,使用 du 工具一层一层看子目录下哪个文件比较大,这里我们可以看到 /var/img3、/var/img1、/var/img4文件比较大以及 /usr/local/src/下面的 img、img1比较大,如图3。

    图 3

    删除对应的文件后,发现磁盘空间占用正常,如图4。

    图 4

    如果需要查看当前目录下所有文件以及文件夹的大小,可以执行 du -sh * ,如需排序使用du -sh  * | sort  -rh,如果只要查看当前目录某个文件大小,可以执行 du -sh  文件名,如图5。

    图 5

    2.存在未释放的 inode

    在linux系统中,想要彻底的删除一个文件,取决于两个“计数器”,这两个计数器一个是磁盘引用的“计数器”(记录了这个文件有几个硬链接),另一个则是内存引用的“计数器”(纪录了这个文件正在被几个进程所调用),当这两个“计数器”全部为0,也就是这个文件没有硬链接,没有任何进程在调用的时候,这个文件才会真正的被删除。

    有时候我们看到一种情况,df -h看到磁盘空间满了,但是du -sh查看,并未发现有占用空间大的文件,此时有可能系统中有进程使用了某些文件,但是在有进程使用这些文件的情况下,删除这些文件,则会看到文件虽然删除了,但是空间却没释放。需要结束进程,空间才能释放,这也是很多时候系统空间被沾满,重启了一下系统后又恢复了的原因。

    可以使用lsof | grep deleted,最后有deleted标注的就是文件已经删了,但是句柄未释放,空间也未释放的进程,要释放空间,可以将对应的进程杀掉,如图6。

    图 6

    3.inode满了

    文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。

    文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。

    inode爆满情况就较为严重了,程序运维会有问题,会报磁盘无空间 No space left on device,就像下图,查看df发现磁盘空间使用还没到100%,如图7。

    图 7

    但是如果df -i 发现根分区的inode到达100%的时候,也会报错“No space left on device”,解决方案就是删除这么小文件,如图8。

    图 8

    4. tmpfs 内存空间已满

    /run 目录一般为 tmpfs文件系统,这些数据实际存储的是RAM和交换空间中,/run 目录的作用用于存储系统运行时候的重要的信息,如果他满了可能会导致系统无法启动新的进程,服务无法正常运行或者无法创建新的pid文件,下图,我们可以看到 /run目录使用为100%,此时如果有个人ssh到此服务器,如图9。

    图 9

    会看到日志里面有 No space left on device的提示,如图10。

    图 10

    同样,如果我们此时重启服务,比如auditd,会看到服务卡住无法重启,并且使用journalctl -xeu auditd日志里面同样有No space left on device的情况,说明即使根目录没满,/run目录满了后,会有类似磁盘空间已满的提示,如图11,如12。

    图 11

    图 12

    另外,内存整体不够,同样会导致类似的问题,下图为启动时候,内存不够,导致系统启动异常,提示 No space left on device,如图13。

    图 13

    5.重复挂载

    举个例子,假如我 /var/目录原来已经把空间占用满了,此时我们写入日志的时候,会报出来文件系统已满,但是如果我们此时用新的分区重新挂载到 /var/目录下,像下图,就会造成,df -h 看根分区占满了,已经用了48G了,但是通过 du -sh 看根分区下各个文件系统大小,加起来却只有17G,原因是,我用新的设备重新挂载 /var/目录,以至于我df -h算的是挂载之前的 /var/目录大小而不是挂载之后的 /var目录大小,如图14。

    图 14

  • 相关阅读:
    【BUG库】 记录自己学习工作中遇到的程序BUG
    渗透测试怎么入门?(超详细解读)
    Netty 如何高效接收网络数据?一文聊透 ByteBuffer 动态自适应扩缩容机制
    PAT 1140 Look-and-say Sequence
    java Python+Django的个人博客系统
    HttpServletResponse详解
    双功能RGD-TAT修饰DNA纳米胶束|聚苯胺纳米线修饰DNA(PAINW/DNA)
    打造店铺爆款的玩法方式解析
    results=DBHelper.exeUpdate(conn,cur,exesql)是什么意思
    痞子衡嵌入式:浅析IAR下调试信息输出机制之半主机(Semihosting)
  • 原文地址:https://blog.csdn.net/2301_77223451/article/details/138183118