用心打造
VPS知识分享网站

VPS磁盘还有空间,为什么提示No space left on device?

服务器明明还有几GB甚至几十GB空间,上传文件、写日志或更新程序时却提示 No space left on device。这类故障很容易让人误判,第一反应往往是继续清理大文件,结果删完依然无法写入。

我自己排查这类问题时,不会只看 df -h。Linux 文件系统除了存放数据,还要为文件和目录分配 inode;磁盘容量没满,不代表 inode、配额或临时文件系统还有余量。

VPS磁盘空间与inode耗尽示意图

今天就来讲清楚 VPS 有剩余空间却提示空间不足的常见原因,以及怎样按顺序定位和处理。

一、先别急着扩容,确认到底是哪种空间不足

先执行 df -h 查看各挂载点的容量使用率,再执行 df -i 查看 inode 使用率。两条命令关注的不是同一件事:前者看数据块,后者看还能创建多少文件。

某个分区的 Use% 达到 100%,就是普通的磁盘容量耗尽;容量还有很多,但 IUse% 达到 100%,则是 inode 已经用完。这时文件内容哪怕只有一个字节,系统也无法再创建新文件。

还要留意报错对应的挂载点。//var/tmp 可能位于不同分区,只看整台机器的总容量没有意义。

二、inode 为什么会在磁盘没满时先耗尽

inode 用来记录文件类型、权限、所有者、时间和数据位置等元信息。一个文件或目录通常会占用一个 inode,因此 海量小文件比少量大文件更容易耗尽 inode

网站缓存、PHP Session、邮件队列、爬虫临时文件、缩略图和某些程序日志,都是常见来源。比如几百万个几KB的小缓存文件,占用的数据空间并不夸张,却可能把 inode 全部吃完。

ext4 的 inode 数量多在创建文件系统时确定,不能像普通容量那样随手增加。处理重点不是盲目扩盘,而是找出异常增长的目录,并建立清理或过期策略。

三、怎样找到小文件最多的目录

先从出现问题的分区开始,不要直接对整台服务器执行重型扫描。可以逐层查看目录数量,常用思路如下:

  1. df -i 确认 inode 耗尽的挂载点。
  2. sudo du --inodes -x -d 1 /var 2>/dev/null | sort -n 查看 /var 下各目录的 inode 数量。
  3. 对数量异常的目录继续向下检查,例如把 /var 换成 /var/lib 或具体站点目录。
  4. 确认文件用途和生成程序后,再决定删除、归档或调整缓存策略。

-x 可以避免扫描到其他挂载点。线上服务器文件量很大时,统计本身会增加磁盘 I/O,建议在低峰期逐层执行。

四、哪些文件可以清理,哪些不能直接删

缓存和临时文件可以清理,但必须先确认对应程序是否仍在使用。WordPress 缓存插件、面板缓存、应用 Session 都可能有自己的清理按钮或命令,优先使用程序提供的方法。

不要看到 /var/lib 文件多就直接整目录删除。这里常有 Docker、数据库和软件包管理器的数据,误删可能导致容器、MySQL 或系统组件损坏。先定位生成者,再按应用规则处理,比一条 rm 命令安全得多。

日志也不建议直接删掉正在写入的文件。可先用 logrotate 做轮转,或对确认无保留价值的当前日志进行安全截断,同时检查为什么它会异常增长。

五、容量和inode都没满,还要查什么

报错不一定来自 inode。用户磁盘配额达到上限、只读文件系统、Docker 容器自身存储限制,以及 /tmp 使用的 tmpfs 满了,都可能表现为空间不足。

检查项 常用命令 重点观察
数据容量 df -h 对应挂载点是否100%
inode df -i IUse%是否100%
目录占用 du -xhd1 路径 哪一级目录增长异常
只读状态 findmnt -no OPTIONS 挂载点 是否出现ro
临时内存盘 df -h /tmp /run /dev/shm tmpfs是否已满

有些进程删除日志后仍保持文件句柄,df 显示空间没释放,而 du 又找不到文件。这时可用 sudo lsof +L1 查找已删除但仍被占用的文件,确认服务后再平滑重启对应进程。

六、处理之后怎样避免再次发生

给缓存设置过期时间,启用日志轮转,定期检查邮件队列和临时目录。容器环境还要限制日志大小,避免某个服务持续制造小文件。

长期业务建议同时监控磁盘容量和 inode 使用率,70%或80%时就预警,不要等到100%才处理。新项目选择服务器时,也要保留磁盘余量和快照能力;需要灵活升级时,可以比较 萤光云LightNode 的磁盘、快照和扩容规则,再按业务实际增长选择。

七、我的排查顺序

我会先确定报错发生在哪个挂载点,再对照 df -hdf -i。inode 满了就逐层找小文件,容量满了就查大目录;两者都正常,再看配额、tmpfs、只读状态和被删除但仍占用的文件。

这个顺序的好处是每一步都在缩小范围,不会一上来就删除重要数据。空间故障最怕的不是清理得慢,而是还没找出原因就开始批量删除。

常见问题

问:删除小文件后,inode会立即释放吗?
答:正常情况下会,但仍被进程占用的已删除文件需要关闭对应文件句柄。

问:扩容磁盘一定能增加inode吗?
答:不一定,取决于文件系统和扩容方式,不能把扩容当成inode耗尽的通用解法。

问:df -hdu -sh结果为什么不同?
答:常见原因是已删除文件仍被进程占用、挂载点覆盖或统计范围不同。

问:可以直接删除/var/log吗?
答:不建议,应确认日志用途并使用日志轮转或安全截断。

问:inode使用率多少需要关注?
答:持续超过70%就应观察增长速度,接近80%时建议设置预警并定位来源。

温馨提示

遇到 No space left on device,先保留现场并确认挂载点,依次检查 磁盘容量、inode、配额、tmpfs和文件句柄。不要因为页面打不开就直接重装或批量删除目录。

真正稳妥的处理,是找出哪个程序在持续生成文件,再从缓存期限、日志轮转和监控告警上解决根因。

赞(0)
未经允许不得转载;国外VPS测评网 » VPS磁盘还有空间,为什么提示No space left on device?
分享到