linux磁盘“显示已满”但找不到大文件,主因是df与du统计逻辑不同:df读superblock反映真实块使用,du统计可见文件。常见原因是已删未释放文件(lsof +l1排查)、挂载覆盖、权限限制、ext4预留空间等。

Linux 中磁盘空间“显示已满”但找不到大文件?很可能是 df 和 du 输出不一致导致的误判。核心原因通常是:已删除但进程仍在占用的文件(即“已删未释放”),或挂载点覆盖、权限限制、ext4 日志占用等。下面从排查逻辑到具体操作一步步说明。
先看 df 和 du 的本质区别
df 统计的是文件系统级可用空间,读取 superblock 信息,反映磁盘块的真实使用情况;du 统计的是目录下所有可见文件的实际磁盘占用(默认只统计当前用户有权限访问的文件)。两者结果不一致,说明有“df 看得见、du 找不到”的空间消耗源。
重点排查:已删除但仍在被进程打开的文件
这是最常见原因。文件被 rm 删除后,若仍有进程持有其文件描述符(fd),该文件所占空间不会立即释放,df 仍会计入已用空间,但 du 因目录中无对应路径而无法统计。
- 运行
lsof +L1(需 root 权限)查看所有链接数为 0 的打开文件(即已删未释放) - 或用
lsof | grep deleted快速筛选(注意输出可能很长,可加| head -20) - 找到对应进程 PID 后,可重启服务释放空间,或直接 kill 进程(谨慎评估业务影响)
检查挂载与权限干扰项
某些情况下,du 因权限不足跳过子目录,导致统计偏小;或子挂载覆盖了父目录,使 du 未进入真实数据区。
- 用
mount或findmnt确认目标路径是否被其他文件系统覆盖(例如 /var/log 下挂了独立分区) - 用
sudo du -shx /path 2>/dev/null | sort -h(-x表示不跨文件系统,2>/dev/null屏蔽权限错误)重新统计,对比结果变化 - 特别留意
/proc、/sys等虚拟文件系统,它们不占物理磁盘,但若误统计会影响判断
别忽略 ext4 日志和保留块
默认 ext4 会预留 5% 空间给 root 用户(防止系统完全写满),且 journal 日志本身也占用少量空间,这些在 df 中体现,但 du 不会统计。
- 查看预留比例:
tune2fs -l /dev/xxx | grep "Reserved block count" - 计算预留空间大小:
sudo dumpe2fs -h /dev/xxx | grep -E "(Block count|Reserved block count)" - 如确认是预留导致,可通过
tune2fs -m 1 /dev/xxx调低至 1%(仅建议非系统盘且明确需要)
实际排查时,建议按“df → du → lsof → mount → tune2fs”顺序推进,多数空间异常能在前两步定位。关键不是背命令,而是理解空间归属的层次:文件系统层(df)、文件路径层(du)、进程句柄层(lsof)、硬件与配置层(tune2fs/mount)。










