服务器明明还有几GB甚至几十GB空间,上传文件、写日志或更新程序时却提示 No space left on device。这类故障很容易让人误判,第一反应往往是继续清理大文件,结果删完依然无法写入。
我自己排查这类问题时,不会只看 df -h。Linux 文件系统除了存放数据,还要为文件和目录分配 inode;磁盘容量没满,不代表 inode、配额或临时文件系统还有余量。

今天就来讲清楚 VPS 有剩余空间却提示空间不足的常见原因,以及怎样按顺序定位和处理。
一、先别急着扩容,确认到底是哪种空间不足
先执行 df -h 查看各挂载点的容量使用率,再执行 df -i 查看 inode 使用率。两条命令关注的不是同一件事:前者看数据块,后者看还能创建多少文件。
某个分区的 Use% 达到 100%,就是普通的磁盘容量耗尽;容量还有很多,但 IUse% 达到 100%,则是 inode 已经用完。这时文件内容哪怕只有一个字节,系统也无法再创建新文件。
还要留意报错对应的挂载点。/、/var、/tmp 可能位于不同分区,只看整台机器的总容量没有意义。
二、inode 为什么会在磁盘没满时先耗尽
inode 用来记录文件类型、权限、所有者、时间和数据位置等元信息。一个文件或目录通常会占用一个 inode,因此 海量小文件比少量大文件更容易耗尽 inode。
网站缓存、PHP Session、邮件队列、爬虫临时文件、缩略图和某些程序日志,都是常见来源。比如几百万个几KB的小缓存文件,占用的数据空间并不夸张,却可能把 inode 全部吃完。
ext4 的 inode 数量多在创建文件系统时确定,不能像普通容量那样随手增加。处理重点不是盲目扩盘,而是找出异常增长的目录,并建立清理或过期策略。
三、怎样找到小文件最多的目录
先从出现问题的分区开始,不要直接对整台服务器执行重型扫描。可以逐层查看目录数量,常用思路如下:
- 用
df -i确认 inode 耗尽的挂载点。 - 用
sudo du --inodes -x -d 1 /var 2>/dev/null | sort -n查看/var下各目录的 inode 数量。 - 对数量异常的目录继续向下检查,例如把
/var换成/var/lib或具体站点目录。 - 确认文件用途和生成程序后,再决定删除、归档或调整缓存策略。
-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 -h 和 df -i。inode 满了就逐层找小文件,容量满了就查大目录;两者都正常,再看配额、tmpfs、只读状态和被删除但仍占用的文件。
这个顺序的好处是每一步都在缩小范围,不会一上来就删除重要数据。空间故障最怕的不是清理得慢,而是还没找出原因就开始批量删除。
常见问题
问:删除小文件后,inode会立即释放吗?
答:正常情况下会,但仍被进程占用的已删除文件需要关闭对应文件句柄。
问:扩容磁盘一定能增加inode吗?
答:不一定,取决于文件系统和扩容方式,不能把扩容当成inode耗尽的通用解法。
问:df -h和du -sh结果为什么不同?
答:常见原因是已删除文件仍被进程占用、挂载点覆盖或统计范围不同。
问:可以直接删除/var/log吗?
答:不建议,应确认日志用途并使用日志轮转或安全截断。
问:inode使用率多少需要关注?
答:持续超过70%就应观察增长速度,接近80%时建议设置预警并定位来源。
温馨提示
遇到 No space left on device,先保留现场并确认挂载点,依次检查 磁盘容量、inode、配额、tmpfs和文件句柄。不要因为页面打不开就直接重装或批量删除目录。
真正稳妥的处理,是找出哪个程序在持续生成文件,再从缓存期限、日志轮转和监控告警上解决根因。


