命令

工作原理

显示内容

df

读取 文件系统元数据

统计磁盘分区整体使用情况(包含“不可见”文件)

du

遍历实际目录树

仅统计当前目录下用户可访问的文件大小

也就是说: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 更宽裕的文件系统。