df 显示磁盘 100%,du 却没占多少空间?真正原因就这三种情况!
今天分享一下df与du的本质区别,并列举几个相关的常见磁盘处理案例。
1 df 与 du 的本质区别
命令 | 工作原理 | 显示内容 |
---|---|---|
df | 读取 文件系统元数据 | 统计磁盘分区整体使用情况(包含“不可见”文件) |
du | 遍历 实际目录树 | 仅统计当前目录下用户可访问的文件大小 |
也就是说:du 是你能“看见”的,df 是磁盘系统“知道”的!
因为df与du都是为了查看磁盘使用情况,我画了个磁盘空间整体的排查流程图:
下面主要讲解du显示与df显示不一样可能潜在的三种常见原因
2 删除了文件但空间未释放
2.1 场景描述:
某个大日志文件被 rm 删除了;
但该文件仍被某个服务(如 Nginx、Java、Python 等)占用;
df 显示空间没释放,而 du 看不到这个文件了!
2.2 如何验证?
lsof | grep deleted
2.3 解决方案:
杀掉占用文件的进程
kill -9 进程ID
或者重启服务(推荐)
systemctl restart 服务名
3 挂载点覆盖了原数据
3.1 场景描述:
原本写入 /data 下的大文件;
后来你挂载了一个磁盘到 /data,把原来的内容“遮住”了;
du 只看到挂载后的目录内容,df 依然计算之前“被遮挡”的那部分。
3.2 如何验证?
检查当前挂载
mount | grep data
查看原始挂载点所在目录
umount /data
ls -lh /data # 你可能会看到消失的大文件
3.3 解决方案:
1、临时卸载该目录;
2、删除原本隐藏的大文件;
3、或者创建一个新目录挂载点(避免覆盖):
4、重新挂载新挂载点上。
5、更新 fstab,设置永久挂载
4 inode 耗尽
4.1 场景描述:
df 显示还剩几 G;
但无法创建新文件,提示 No space left on device;
原因其实是 inode 用完了!
4.2 检查 inode 使用情况
df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 655360 655360 0 100% /
4.3 排查哪个目录有大量小文件
find /var -type f | wc -l
4.4 解决方案:
清理缓存目录,如:
rm -rf /var/cache/*
优化程序避免大量小文件;
考虑用 xfs 等 inode 更宽裕的文件系统。
看到这里了,有用的话就留个关注和赞吧~~~