df与du差异主因是统计逻辑不同:df统计文件系统已分配块,du统计可见文件实际大小;常见原因包括已删除但被进程占用的文件、挂载点覆盖、inode耗尽、稀疏文件及保留空间。

这通常不是磁盘真满了,而是 df 和 du 统计逻辑不同 导致的表象。df 看的是文件系统级的已分配块,du 看的是当前目录下“可见文件”的实际大小。两者不一致,说明有空间被占着但 du 找不到——得顺着这个思路查。
检查是否有已删除但仍在被进程占用的文件
这是最常见原因:大日志文件(如 app.log、hive.log)被 rm 删除了,但 Java、Nginx、cat 等进程还开着它的文件描述符,空间不会释放。
- 运行
lsof +L1或lsof | grep deleted,看输出里有没有带(deleted)标记的大文件 - 重点关注
SIZE/OFF列,如果显示几百 MB 或几 GB,就和 df - du 的差值对得上 -
解决方法:重启对应服务(
systemctl restart nginx),或杀掉进程(kill -9 PID),不建议直接清空 /proc/PID/fd/ 下的句柄
确认是否存在挂载点覆盖原数据
比如你原来在 /data 目录下存了大量文件,后来又把一块新磁盘挂到了 /data。此时 du 只看到新磁盘里的内容,而 df 仍把旧数据算在总用量里。
- 执行
mount | grep data查看是否在常用路径(如 /var、/data、/home)上有非根挂载 - 临时卸载:
umount /data,再ls -lh /data—— 如果能看到一堆大文件,就是它了 - 处理方式:卸载后清理旧数据,或改用空目录做挂载点(如新建
/mnt/data_disk)
排查 inode 是否耗尽
磁盘块还有剩,但提示 “No space left on device”,创建文件失败,大概率是 inode 用光了。尤其常见于日志目录、缓存目录生成海量小文件时。
- 运行
df -i,看IUse%是否接近 100% - 定位问题目录:
find /var/log -type f | wc -l,或用for i in /*; do echo $i; find $i -xdev -type f 2>/dev/null | wc -l; done | sort -nk2 - 清理方向:删过期日志(
journalctl --vacuum-time=7d)、清空 /tmp、/var/cache,避免程序持续写小文件
留意稀疏文件和文件系统保留空间
稀疏文件(如用 dd seek 创建的)逻辑体积很大,但实际只占少量块;ext4 默认为 root 预留 5% 空间,普通用户看不到这部分可用容量。
- 查稀疏文件:
find /path -type f -printf '%s %p\n' | awk '$1 > 1073741824 {print}'(找逻辑大于 1G 的),再用du -h对比 - 查保留空间:
tune2fs -l /dev/sda1 | grep "Reserved block count",可调低但别设为 0 - 云环境还要注意 thin-provisioning 延迟释放、配额限制等,需结合
lvs、厂商控制台确认










