磁盘满了,但是没看见有什么大文件啊?系统提示“空间不足”,咋回事?弄清楚磁盘block和inode使用率的差别就能明白。运行df -h检查时,根目录只用了22%,可执行ls命令却显示“不能创建临时文件,设备上没有空间”。这说明Linux系统把磁盘空间分成了数据(block)和属性(inode)两个部分,每个部分的使用率不一样。 其实block用来存储文件的数据,而inode则存储文件的属性信息。运行df -h能看到block的使用率,而运行df -i能看到inode的使用率。前者用百分比表示,后者用“IUse%”来提示。 让我们看一个例子,假设你的根目录下有一些小文件: 这是df -i显示的根目录inode信息: ``` ~]# df -hi Filesystem Inodes IUsed IFree IUse% Mounted on /dev/mapper/centos-root 24M 33K 24M 1% / ``` 可以看到总共有24M个inode节点,已使用33K个,仅剩1%可用。 而这次df -h显示的是根目录block信息: ``` ~]# df -hl Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 7G 11G 37G 22% / ``` 这次显示的是占用了11G的空间,只有22%被占用。 所以说,虽然inode剩余空间还有很多,但因为block已经用完了,所以系统才会报错。 针对这种情况有两种可能:第一种是你的服务器主要处理大文件(比如视频转码、日志收集、数据库),这时候会先把block填满到100%。这种情况下即使inode还有很多也无法新建大文件,因为没有足够的空间存放数据。 第二种情况是你的服务器运行虚拟化、容器或者微服务等应用程序生成了大量小文件(比如配置、缓存、会话)。这时候会先把inode填满到100%,系统无法新建更多的文件。 解决问题的办法有:如果你遇到了第一种情况,可以通过du命令快速找到占用空间大的文件夹并清理掉;把旧日志归档到远程盘或扩容磁盘和增加镜像等。 如果遇到第二种情况,可以使用ls命令统计当前目录下所有子目录中包含的文件总数;把小文件合并成归档文件;考虑升级文件系统类型如ext4升级为xfs或btrfs等。 为了避免再次遇到这种问题,我们可以设置实时监控两套指标:每半小时运行一次df -hi命令并记录结果;设置告警阈值当block使用率超过80%时发送邮件警报,当inode使用率超过80%时发送短信警报;还可以使用AWS、Azure、阿里云等云服务提供商提供的监控工具来查看block和inode的使用曲线。 “no space left on device”并不是一句简单的“删除文件”就能解决的问题。你需要先判断是数据占满了还是属性信息不足?只有这样才能正确地清理掉占用空间的对象,让服务器重新恢复健康运行状态。