Linux df 与 du 命令排查磁盘空间不足

4次阅读

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

Linux df 与 du 命令排查磁盘空间不足

Linux 中磁盘空间“显示已满”但找不到大文件?很可能是 dfdu 输出不一致导致的误判。核心原因通常是:已删除但进程仍在占用的文件(即“已删未释放”),或挂载点覆盖、权限限制、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 未进入真实数据区。

  • mountfindmnt 确认目标路径是否被其他文件系统覆盖(例如 /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)。

text=ZqhQzanResources