Linux服务器在长时间运行后,经常会遇到磁盘空间被占满的情况。这种问题如果不及时处理,轻则应用无法写入新数据,重则系统服务集体异常。要解决它,不能只靠盲目删除文件,而需要一套从观察到处理的完整方法。

一、先确认是不是真的空间不足
很多初学者一看到“No space left on device”就跑去删文件,但其实有可能只是inode用光了,而不是容量。Linux中每个文件对应一个inode,大量小文件会耗尽inode,即便磁盘还有空间也写不进新文件。因此排查时要同时看容量和inode。
使用df命令可以分别查看块设备和inode的使用情况。参数-h表示人类可读单位,参数-i专门看inode。这两个数据结合起来,才能判断问题本质。如果df -h显示使用率百分之百,那是空间问题;如果df -i显示百分之百,则是小文件过多。
# 查看磁盘空间使用率 df -h # 查看inode使用率 df -i
二、用du定位占用空间的大目录
确认是空间不足后,下一步是找到“罪魁祸首”。df只能看到分区层面,看不到目录。这时候要用du命令逐级分析。du的-s参数表示只显示总和,-h表示易读单位。通常从根目录或可疑挂载点开始,一层层往下找。
为了效率,可以配合sort找出前几名。比如下面这条命令会列出根目录下各一级目录的大小,并按数值倒序排列,方便快速锁定异常目录。要注意的是,du会实际遍历文件,在特别大的文件系统上可能稍慢,此时可限定目录范围。
# 查看根目录下各子目录占用 du -sh /* 2>/dev/null | sort -rh | head -n 10
找到大目录后,常见情况是日志目录、缓存目录或临时上传目录。对于日志,应优先用轮转工具处理,而非手动rm;对于缓存,可确认无业务依赖后清理。
三、警惕已删除但被进程占用的文件
有时你明明删了一个几GB的日志,df却显示空间没释放。这是因为Linux里,文件被进程打开时,删除只去掉了目录项,句柄还在,磁盘块就不会回收。这种现象在运行中的服务上很常见。
可以用lsof查出哪些已删除文件仍被占用。下面命令会列出标记为deleted但大小不为零的文件。重启对应进程或让其重新打开日志,空间就会真正释放。这也是为什么很多清理教程强调“删了不生效先看lsof”。
# 查找已删除但仍被占用的文件 lsof +L1 2>/dev/null | grep deleted
对于长期运行的服务,建议接入logrotate,避免手工删文件引发句柄问题。同时发布流程中,应避免直接删除正在写入的文件。
四、清理系统缓存与无用包
在Debian或Ubuntu系发行版中,apt会缓存大量deb包;在CentOS或Rocky中,yum或dnf也有缓存。这些包往往占据数百MB到数GB。确认系统稳定后,可安全清理。
另外,系统里的旧内核、依赖孤儿包也值得处理。下面的示例分别展示了apt和yum的清理方式。注意清理内核时不要删掉当前正在用的版本,否则系统可能无法启动。
# Ubuntu/Debian 清理 apt-get clean apt-get autoremove --purge # CentOS/Rocky 清理 dnf clean all dnf autoremove
除了包管理,/tmp目录和用户的缓存目录(如~/.cache)也常堆积垃圾。可设置定时任务定期清理,但需避开业务高峰,并排除正在使用的临时文件。
五、从架构上减少磁盘压力
单次清理只是救火,长远看要做隔离和监控。建议将日志、数据、系统分区拆开挂载,这样某一目录爆了不会影响整体。同时部署磁盘监控告警,在使用率达到百分之八十时就通知人处理。
应用层面,可把大文件上传、日志输出改为异步或外送对象存储。对日志使用logrotate并设置压缩与保留天数,能显著降低本地压力。当这些机制就位后,磁盘空间不足将从“突发故障”变成“可预期维护”。
| 问题类型 | 排查命令 | 处理方式 |
|---|---|---|
| 空间占满 | df -h | du定位并清理大目录 |
| inode占满 | df -i | 删除大量小文件 |
| 删文件不释放 | lsof +L1 | 重启占用进程 |
通过上述方法,大多数Linux磁盘空间不足场景都能被快速定位与解决。关键是先弄清是容量、inode还是句柄问题,再对症下药,而不是盲目执行rm -rf。