磁盘空间被占满最直接表现是df -h显示某分区Use%达100%且报“No space left on device”;需三步排查:一、用df -h锁定异常分区,对比du总和与df Used值识别缺口;二、优先检查/var/log、/var/lib/docker等高频目录;三、用lsof +L1揪出已删未释文件,或用df -i排查inode耗尽。

磁盘空间被占满,最直接的表现是 df -h 显示某个分区使用率接近或达到 100%,同时系统可能报 No space left on device。排查不能只看“哪里大”,更要搞清“为什么大”和“为什么看不见”。关键在三步:确认异常分区、定位真实占用源、识别隐藏空间消耗。
第一步:快速锁定问题分区与空间缺口
先执行 df -h,重点关注 Use% 列。若某挂载点(如 / 或 /var)超过 90%,就把它作为主战场。
接着对比空间“账面值”和“实际值”:
- 运行
du -sh /* 2>/dev/null | sort -hr | head -10,查看根下前十大目录 - 把结果总和与
df -h中对应分区的 Used 值比对 - 如果
du总和明显小于df的 Used,说明存在“看不见”的空间占用——大概率是已删除但未释放的文件,或预留空间
第二步:重点扫描高频“肇事”目录
70%以上的磁盘爆满问题集中在以下四个路径,建议优先检查:
-
/var/log:未轮转的日志(
catalina.out、journal、nginx/access.log)可单个达数十GB -
/var/lib/docker/overlay2(或
/var/lib/containerd):残留镜像层、已停止容器的可写层、构建缓存 - /tmp 和 /var/tmp:长期未清理的大体积临时文件、中断的备份转储包
-
应用数据目录:如
/home/www/backup、/var/lib/mysql下未清理的 binlog、慢日志、旧备份
推荐用 ncdu /(需先 apt install ncdu 或 yum install ncdu)交互式浏览,支持键盘导航和实时排序,比层层 du 高效得多。
第三步:揪出“幽灵文件”和系统保留空间
当 du 和 df 对不上,常见原因有两个:
-
已删除但进程仍在写入的文件:执行
lsof +L1,列出所有被删除但句柄未关闭的文件。典型如 Tomcat 日志被rm后,Java 进程还在往它写。解决办法是重启对应服务,或用echo "" > /proc/PID/fd/FD_NUM清空(慎用) -
ext4 默认保留 5% 空间给 root:这会导致
df中 Size 减去 Used 和 Avail 后有差额。可用tune2fs -l /dev/vda1 | grep "Reserved block count"查看,必要时调低:tune2fs -m 1 /dev/vda1(将保留比例设为 1%)
额外注意:别漏掉 inode 耗尽
有时 df -h 显示空间充足,却仍报 No space left on device。这时运行 df -i,检查 IUse% 是否 100%。inode 耗尽多由海量小文件引起(如邮件队列、session 文件、未清理的 /proc 快照)。定位方法:find / -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n,看哪个一级目录下文件最多。

















