问题描述

在云服务器ECS Linux系统内创建文件时,出现类似如下空间不足提示:

  1. Nospace left on device…

    问题原因

    导致该问题的可能原因包括:
  • 磁盘分区空间使用率达到百分之百。
  • 磁盘分区inode使用率达到百分之百。
  • 僵尸文件:已删除文件因句柄被占用未释放导致相应空间未释放。
  • 挂载点覆盖:在原有文件系统的相应目录下已经存在大量文件。挂载了新磁盘后,导致使用 df 命令能统计到相关空间使用,而使用 su 命令统计不到。

    处理办法

    不同的原因需要通过不同的方法解决:

  • 分区容量满

  • inode容量满
  • 修改inode数量
  • 僵尸文件分析删除
  • 挂载点覆盖

    分区容量满

    如果是分区容量满导致磁盘空间满,按以下步骤操作:
  1. 运行 df -h 查看磁盘使用率。返回结果如下图所示。注意:返回结果里 Mounted on 下显示的是挂载目录。

Linux 磁盘空间满(含inode满)问题排查方法 - 图1

  1. 循环执行如下指令,找到容量比较大的目录并进入目录,直到找到最精确的文件或目录,再结合业务情况等判断,删除相关文件或目录。您也可以购买更大的数据盘来分担处理。Linux 磁盘空间满(含inode满)问题排查方法 - 图2
    1. cd/
    2. du-sh*

      扩展:文件删除后,空间不变

      问题描述:
      1.新上线的项目产生的日志导致磁盘空间被占满,确认为无用日志,rm -rf直接删掉,但df -h查看磁盘空间未被释放 ```shell

[root@qz_lan03 ~]# df -h /member-sh Filesystem Size Used Avail Use% Mounted on /dev/sda2 96G 95G 0 100% / tmpfs 1.9G 0 1.9G 0% /dev/shm /dev/sda1 969M 99M 820M 11% /boot /dev/sda5 818G 2.4G 774G 1% /data

2.查看项目一级目录的文件大小,日志已经被删除 [root@qz_lan03 ~]# du -h —max-depth=1 /root/member-sh/ 224K /root/member-sh/log 32K /root/member-sh/config 137M /root/member-sh/D: 8.0K /root/member-sh/disconf 137M /root/member-sh/

3.查看 一个已经被删除但是仍然被应用程序占用的文件列表,发现删除的文件正在被使用 [root@qz_lan03 member-sh]# lsof |grep deleted java 19464 root 1w REG 8,2 70949862040 3292909 /root/member-sh/log/member-service-rd_20170411135530.log (deleted) java 19464 root 2w REG 8,2 70949862040 3292909 /root/member-sh/log/member-service-rd_20170411135530.log (deleted) java 19464 root 100w REG 8,2 25014294067 3292954 /root/member-sh/D:/logs/member_service.log (deleted) java 20098 root 1w REG 8,2 55711 3292912 /root/member-sh/log/member-h5-web-rd_20170411140310.log (deleted) java 20098 root 2w REG 8,2 55711 3292912 /root/member-sh/log/member-h5-web-rd_20170411140310.log (deleted) java 20178 root 1w REG 8,2 72947 3292917 /root/member-sh/log/member-web-rd_20170411140333.log (deleted) java 20178 root 2w REG 8,2 72947 3292917 /root/member-sh/log/member-web-rd_20170411140333.log (deleted) java 20178 root 96w REG 8,2 15827 3292930 /root/member-sh/D:/logs/member_web.log (deleted)

问题原因:
 如果有一个进程在打开一个大文件的时候,这个大文件直接被rm 或者mv掉,则du会更新统计数值,df不会更新统计数值,还是认为空间没有释放。直到这个打开大文件的进程被Kill掉。

解决方法:
<br />kill对应的进程,或重启对应的服务
<br />总结:清理日志文件,需要重启对象的服务

<a name="LnaEC"></a>
### inode容量满

1、问题:<br />在创建新目录和文件是提示“no space left on device”!按照以前的情况,很有可能是服务器空间又被塞满了,通过命令查看,发现还有剩余。<br />再用df -i查看了一下/分区的索引节点(inode),发现已经用满(已用=100%),导致系统无法创建新目录和文件。<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/281003/1620444496662-20b8d1af-f96e-40b7-8418-fbb12ce00b2a.png#clientId=u19edb422-9f81-4&from=paste&height=233&id=udcb88fee&margin=%5Bobject%20Object%5D&name=image.png&originHeight=301&originWidth=945&originalType=binary&size=46760&status=done&style=none&taskId=ubeea12b3-c49a-4cf2-9440-555e4f70d84&width=732.5)<br />2、问题原因分析:

Inode译成中文就是索引节点,每个存储设备(例如硬盘)或存储设备的分区被格式化为文件系统后,应该有两部份,一部份是inode,另一部份是 Block,Block是用来存储数据用的。而inode呢,就是用来存储这些数据的信息,这些信息包括文件大小、属主、归属的用户组、读写权限等。 inode为每个文件进行信息索引,所以就有了inode的数值。操作系统根据指令,能通过inode值最快的找到相对应的文件。<br />而这台服务器的Block虽然还有剩余,但inode已经用满,因此在创建新目录或文件时,系统提示磁盘空间不足。<br />Inode的数量是有限制的,每个文件对应一个Inode,那么如何查看inode的最大数量呢?

可以看到Inode的总量,已经使用的Inode数量,和剩余数量。

3、解决:<br />1)查找满的目录:
```shell
[root@abc sbin]# for i in /*; do echo $i; find $i | wc -l; done
/bin
121
...
/sys
8145
/tmp
7
/usr
56840
/var
8019

然后找到inode占用最多额目录下,再用上面命令查看。

2)删除文件占用多的目录:
进入目录直接rm -rf 可能会卡死,可以使用下面方式:

find dir -type f -name '*'  | xargs rm
或者
cd dir
ls | xargs rm -f

4、拓展:
系统中有用户开启了cron,而cron中执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动所以就产生了这些文件;
解决办法:
将crontab里面的命令后面加上 > /dev/null 2>&1 或者crontab里面的命令后面加上 > /dev/null

僵尸文件分析删除

如果磁盘和inode都没有问题,则需要查看是否存在未被清除句柄的僵死文件。这些文件实际上已经被删除,但是有服务程序在使用这些文件,导致这些文件一直被占用,无法释放磁盘空间。如果这些文件过多,会占用很大的磁盘空间。
按以下步骤查看并删除僵尸文件:

  1. 远程连接Linux实例
  2. 运行以下命令安装lsof。
    1. yum install lsof-y
  3. 运行以下命令查看僵尸文件占用情况。返回结果示例如下图所示。Linux 磁盘空间满(含inode满)问题排查方法 - 图3
    1. lsof|grep delete|more
  4. 采用以下方法释放句柄,以清除僵尸文件:
    • 重启服务器。
    • 正常停止或杀掉占用这些文件的服务进程。

      挂载点覆盖

      先取消磁盘挂载,再检查原挂载目录下的空间占用情况。