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