也就是说:du 是你能“看见”的,df 是磁盘系统“知道”的!
下面主要讲解du
显示与df
显示不一样可能潜在的三种常见原因
1、删除文件空间未释放
1.1、场景描述
某个大日志文件被
rm
删除了;但该文件仍被某个服务(如 Nginx、Java、Python 等)占用;
df 显示空间没释放,而 du 看不到这个文件了!
1.2、解决方案
# 查看删掉的进程
lsof | grep deleted
# 杀掉占用文件的进程
kill -9 进程ID
# 或者重启服务(推荐)
systemctl restart 服务名
2、挂载点覆盖了原数据
2.1、场景描述
原本写入
/data
下的大文件;后来你挂载了一个磁盘到
/data
,把原来的内容“遮住”了;du 只看到挂载后的目录内容,df 依然计算之前“被遮挡”的那部分。
2.2、解决方案
# 检查当前挂载
mount | grep data
# 查看原始挂载点所在目录
umount /data
ls -lh /data # 你可能会看到消失的大文件
临时卸载该目录;
删除原本隐藏的大文件;
或者创建一个新目录挂载点(避免覆盖):
重新挂载新挂载点上。
更新 fstab,设置永久挂载
3、inode资源耗尽
3.1、场景描述
df 显示还剩几 G;
但无法创建新文件,提示
No space left on device
;原因其实是 inode 用完了!
3.2 检查 inode 使用情况
df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 655360 655360 0 100% /
3.3 排查哪个目录有大量小文件
find /var -type f | wc -l
3.4、解决方案
清理缓存目录,如:
rm -rf /var/cache/*
优化程序避免大量小文件;
考虑用
xfs
等 inode 更宽裕的文件系统。