当运维人员收到系统警报提示服务器显示存储空间不足时,这不仅仅是一个简单的容量预警,而是可能导致服务崩溃、数据库写入失败乃至业务中断的严重危机,面对这一紧急状况,必须立即采取系统化的诊断流程,精准定位占用源头,并执行清理或扩容操作,核心解决思路在于:先确认是普通磁盘空间耗尽还是Inode资源耗尽,随后通过层层递进的目录分析锁定大文件,最后结合日志清理、缓存释放或存储扩容来恢复系统健康。

快速诊断与定位问题源头
在处理存储危机时,盲目删除文件极易引发系统故障,专业的运维操作应遵循“先诊断,后动手”的原则,通过以下命令组合,可以在一分钟内明确问题性质。
- 检查磁盘整体使用率
使用df -h命令查看挂载点的使用情况,如果某个分区的Use%接近 100%,则说明该分区空间已满,这是最常见的存储耗尽场景。 - 检查Inode使用情况
有时磁盘空间尚有剩余,但无法创建新文件,此时应使用df -i命令,如果某个分组的IUse%达到 100%,说明Inode(索引节点)耗尽,这通常由大量小文件(如未清理的临时文件或邮件队列)引起。 - 定位当前目录下的占用大户
进入疑似占满的分区根目录(如 或/var),使用du -h --max-depth=1 | sort -hr,该命令会列出当前目录下各子文件夹的大小并按降序排列,帮助运维人员快速“顺藤摸瓜”找到占用空间最大的目录。
深入剖析常见的占用原因
根据实战经验,服务器显示存储空间不足的成因通常集中在以下几类高频场景,识别这些原因有助于制定针对性的清理策略。
- 应用程序日志暴涨
Nginx、Tomcat、PHP-FPM 等服务的access.log和error.log若未配置自动轮转,会无限增长,特别是遭遇恶意攻击或爬虫抓取时,日志文件能在数小时内吞噬数十GB空间。 - 系统临时文件堆积
/tmp目录下的临时文件,以及用户上传但未及时处理的文件,往往是隐形杀手,某些上传组件在传输中断后会留下残留文件,长期累积导致空间告急。 - 数据库二进制日志与备份
MySQL 的 binlog(二进制日志)若未设置过期时间,会记录所有数据变更操作,占用大量存储,定时备份任务若未覆盖旧文件,也会导致磁盘空间被历史备份占满。 - 已删除但被进程锁定的文件
这是运维中最容易被忽视的陷阱,使用rm命令删除了文件,但该文件仍被某个进程占用(句柄未释放),此时文件不会真正从磁盘消失,空间也无法回收,直到该进程重启。
专业且安全的解决方案

针对上述诊断结果,采取以下分级处理措施,既能快速释放空间,又能保障业务稳定性。
- 安全清理日志文件
- 直接清空:对于确认不需要的日志,不要直接
rm删除,应使用echo > /path/to/log.log或truncate -s 0 /path/to/log.log清空内容,这样保留了文件句柄,不会导致正在写入该文件的进程报错。 - 压缩归档:对于需要保留的历史日志,使用
gzip压缩后再删除原文件,能节省 70% 以上的空间。
- 直接清空:对于确认不需要的日志,不要直接
- 处理“僵尸”文件
使用lsof | grep deleted命令查找被标记为“deleted”但仍被进程占用的文件,找到对应的 PID 后,重启该服务(如systemctl restart nginx)即可彻底释放空间。 - 清理系统缓存与包管理器
- 清理 Yum/Apt 缓存:执行
yum clean all或apt-get clean移除下载的软件包缓存。 - 清理旧内核:在 CentOS 上使用
package-cleanup --oldkernels --count=2仅保留最近两个版本的内核。
- 清理 Yum/Apt 缓存:执行
- 数据库维护
登录数据库执行PURGE BINARY LOGS BEFORE '2026-10-01';(MySQL示例)清理指定日期前的 binlog,对于备份文件,建议编写脚本自动清理 7 天前的.sql或.tar.gz文件。 - 在线扩容存储
如果业务数据确实增长过快,清理只是权宜之计,此时应考虑云盘扩容或 LVM 逻辑卷扩容,在云环境中,通常只需在控制台扩容云盘,然后在服务器内执行resize2fs或xfs_growfs即可生效,无需重启。
长期预防与自动化运维
为了避免反复出现存储告警,建立自动化的监控与清理机制是治本之策。
- 配置 Logrotate 日志轮转
在/etc/logrotate.d/下为自定义应用配置轮转策略,设置daily(按日)、rotate 7(保留7份)、compress(压缩),确保日志文件自动按周期归档和清理。 - 部署监控告警
利用 Prometheus + Grafana 或 Zabbix,设置磁盘使用率阈值告警(如达到 85% 发送邮件/钉钉警告),提前介入处理,避免业务因 100% 占用而停摆。 - 定期巡检脚本
编写 Shell 脚本,定期扫描/tmp、/var/tmp等目录,清理超过 24 小时的临时文件,同时监控 Inode 使用率,防止小文件泛滥。
相关问答
问题 1:为什么执行了 rm 命令删除文件后,使用 df 查看磁盘空间并没有减少?
解答: 这是因为被删除的文件仍然被某个正在运行的进程占用(持有文件句柄),在 Linux 系统中,只要文件句柄未被关闭,磁盘空间就不会被真正回收,解决方法是使用 lsof | grep deleted 查找占用文件的进程 PID,然后重启该服务,或者通过 /proc/PID/fd/FD 手动清空该文件描述符的内容。

问题 2:磁盘空间还有很多,但系统提示“No space left on device”,这是什么原因?
解答: 这种情况通常是 Inode(索引节点)耗尽所致,Inode 用于存储文件元数据,每个文件或目录都需要占用一个 Inode,如果磁盘上存在大量极小的文件(例如数百万个 1KB 的文件),即便数据块(Block)未用完,Inode 资源也会先被耗尽,解决方法是使用 df -i 确认哪个分区 Inode 满了,再通过 find 命令查找并删除该分区下大量无用的小文件目录。
您在日常运维中是否遇到过因某个隐藏目录占满磁盘而导致的“惊魂时刻”?欢迎在评论区分享您的排查经历或独门技巧。
原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/46152.html