Linux 磁盘满了怎么办:df/du 排查实战
服务器跑着跑着,某天部署突然失败,日志里写着 “No space left on device”。磁盘满了是运维里最常见也最容易手忙脚乱的问题之一。本文记录一套我常用的排查流程:先定位,再清理,最后防复发,全程只用系统自带工具。
第一步:确认是哪个分区满了
先用 df -h 看整体情况。-h 是人类可读格式,重点看 Use% 接近 100% 的那一行。根分区 / 满和 /var 满,处理思路完全不同,所以先分清再动手。
如果看到某个分区 100%,但你刚删了大文件空间却没释放,别急着重启:很可能是某个进程还握着已删除文件的句柄。用 lsof | grep deleted 可以找到它们,重启对应服务或杀掉进程,空间才会真正释放。这是新手最容易踩的坑。
第二步:用 du 逐层往下找
确认分区后,用 du -sh /* 看根目录下一级各自占了多少,再对最大的那个目录继续深入,比如 du -sh /var/*。这样一层层钻下去,几分钟就能定位到罪魁祸首。
嫌一层层敲命令麻烦,可以用 du -h --max-depth=2 /var 2>/dev/null | sort -rh | head -20,直接列出 /var 下占用前 20 的目录。2>/dev/null 是把无权限目录的报错丢掉,输出干净很多。
第三步:常见的大户及处理方法
根据经验,磁盘空间最常被这几类东西吃掉:
日志文件。 /var/log 下的日志如果没配 logrotate,会无限膨胀。先看一眼 ls -lh /var/log,对超大日志可以先用 : > 文件名 截断(比直接删更安全,正在写的进程不会丢句柄),然后检查 logrotate 配置,避免下次再爆。
包管理缓存。 Debian/Ubuntu 用 apt clean 清理下载过的安装包缓存;长期运行的机器上,这一项经常能腾出几个 GB。
Docker 相关。 如果装了 Docker,docker system df 看看镜像、容器和构建缓存各占多少,docker system prune -a 可以回收未使用的部分。注意 -a 会删掉所有未使用的镜像,生产环境操作前先确认。
临时文件和旧内核。 /tmp 下的残留文件可以定期清理;dpkg --list | grep linux-image 看看是不是攒了一堆旧内核,apt autoremove 能顺手清掉。
第四步:清理之后做两件事防复发
第一,给关键目录加监控。最简单的办法是写个定时任务,每天跑一次 df,使用率超过 80% 就发告警。云厂商一般也提供磁盘告警,直接配一个阈值告警更省事。
第二,给日志配好轮转。确认 /etc/logrotate.d/ 里应用的日志都有合理的保留策略,比如保留 7 天、单个文件超过 100MB 就轮转。很多磁盘爆满事故,本质上都是轮转没配好。
小结
磁盘满了不用慌,按 df 定位分区、du 逐层定位目录、针对性清理、最后补监控和轮转这四步走,大部分情况半小时内就能恢复。平时多留意磁盘使用率曲线,比事后救火轻松得多。
- 点赞
- 收藏
- 关注作者
评论(0)