Linux磁盘空间“误报”实为其他资源耗尽:需用df -h与df -i交叉验证,排查inode耗尽、已删未释放文件、ext4预留空间、inotify限制、挂载覆盖、容器层残留及监控配置偏差。

Linux磁盘空间报警出现“误报”,通常不是监控系统真错了,而是它反映的确实是某种资源耗尽,只是你默认以为是“磁盘块(block)空间”——而实际可能是 inode 耗尽、已删未释放文件、预留空间机制或 inotify 监听数超限。排查关键在于:不只看 df -h,还要交叉验证多个维度。
先确认是不是真的“空间不足”
运行 df -h 和 df -i 对照看:
-
如果
Use%高但IUse%接近 100% → 是 inode 耗尽:大量小文件(如缓存、session、临时下载碎片、日志切片)占光了 inode,即使还有几十 GB 块空间,也无法新建任何文件或目录 -
如果
df -h显示 100%,但du -sh /总和远小于该值(比如差 20GB+) → 很可能有已删除但进程仍在写入的文件(lsof +L1可验证) -
如果
df -h中某分区Avail为 0,但Size - Used不等于Avail→ 是 ext4 默认 5% 预留空间在起作用(tune2fs -l /dev/xxx | grep "Reserved block count"可查)
检查被忽略的“隐形空间占用”
某些占用不会体现在常规目录扫描中:
- 执行
lsof +L1(需 root):列出所有已删除(DEL 状态)但仍被进程打开的文件。常见于滚动日志被rm后服务未重载,或 Java 应用持续写入已被删的日志文件 - 检查
/proc下的挂载覆盖:比如/var/log/journal下挂载了 tmpfs,或/tmp是独立 tmpfs 分区,此时根目录的du统计不含其内容,但监控可能按挂载点聚合告警 - 容器环境注意:Docker 的
/var/lib/docker/overlay2下未清理的层、悬空镜像、构建缓存,docker system df -v才能真实反映,du在宿主机上可能因权限或硬链接统计不准
验证监控采集逻辑是否合理
很多“误报”源于监控配置偏差:
- 确认监控项采集的是哪个挂载点 —— 比如脚本用
df -h | grep '/$'取根分区,但实际业务日志写在/data(独立挂载),而监控没覆盖该路径 - 检查阈值是否过激:例如对
/boot(通常只有几百 MB)设 85% 告警,但一次内核升级就触发;或对 tmpfs 类内存盘也套用磁盘空间规则 - 观察告警是否瞬时抖动:用
watch -n 1 'df -h | grep "/$"'连续观察,若几秒内自动回落,可能是应用短时刷盘(如批量导入、日志 flush),并非真满
排查 inotify 和其他非存储类限制
当 mkdir、touch 报 No space left on device,但 df -h 和 df -i 都正常时:
- 检查 inotify 限制:
cat /proc/sys/fs/inotify/max_user_watches,再查当前使用量:find /proc/*/fd -lname anon_inode:inotify 2>/dev/null | wc -l。Node.js、IDEA、rsync 等常触发此限制 - 检查用户配额(quota):
quota -u $USER或repquota -a,尤其在多租户或教学环境中,单用户块/文件数配额可能被占满 - 检查 SELinux 上下文异常(少见但存在):
ausearch -m avc -ts recent | grep denied,某些策略拒绝创建文件时也会伪装成空间错误


















