Appearance
df 和 du 到底有什么区别:磁盘满了时该先看谁
Linux 磁盘排查里,df 和 du 是最常见也最容易混用的两条命令。
很多时候不是不会用,而是不清楚它们看的根本不是同一个层面。
先说结论
可以直接这样记:
df看的是文件系统整体还剩多少空间du看的是目录或文件实际占了多少空间
所以当你发现“磁盘满了”时,通常不是二选一,而是:
- 先用
df判断哪个挂载点满了 - 再用
du去那个目录里继续定位大文件和大目录
一、df 看的是文件系统视角
最常用的命令:
bash
df -h如果想连文件系统类型一起看:
bash
df -hT它回答的是这类问题:
/分区还剩多少空间/data这个挂载点是不是快满了- 当前是哪块磁盘或哪个文件系统出问题
所以 df 适合做“全局定位”。
二、du 看的是目录视角
最常用的命令:
bash
du -sh /var/log如果想继续看下一层目录:
bash
du -h --max-depth=1 /var它回答的是:
- 哪个目录最占空间
- 是日志目录大,还是上传文件目录大
- 一个具体文件夹到底占了多少
所以 du 更适合做“精细排查”。
三、一个最实用的排查顺序
假设服务器告警说磁盘快满了,可以这样查:
1. 先确认哪个挂载点满了
bash
df -h2. 对问题挂载点做一级目录扫描
bash
du -h --max-depth=1 / | sort -hr | head如果问题在 /data:
bash
du -h --max-depth=1 /data | sort -hr | head3. 继续向下钻
哪一层目录大,就继续对那一层执行 du。
这比全盘乱翻快很多。
四、为什么 df 和 du 有时候对不上
这是排查里非常常见的现象。
典型场景是:
df显示磁盘几乎满了- 但
du加起来又没看到那么多文件
常见原因有几个:
1. 文件被删了,但进程还占着句柄
比如一个大日志文件已经被删除,但 Java 进程还没释放文件句柄。
这时:
du看不到,因为目录里已经没这个文件了df仍然显示空间被占着,因为文件系统还没真正回收
可以用下面这条命令排查:
bash
lsof | grep deleted2. 挂载点看错了
有时你以为在查 /data,实际大文件写到了根分区 /。
3. 容器、日志、临时文件残留
比如:
- Docker overlay 层
- 大量容器日志
- 临时导出文件
这些都可能把空间吃掉。
五、排查磁盘空间时常用的几条命令
查看 inode 使用率
bash
df -i有时候不是磁盘空间满,而是 inode 用完了。
看块设备和挂载关系
bash
lsblk适合确认磁盘、分区、挂载点之间的对应关系。
排序找大目录
bash
du -h --max-depth=1 /var | sort -hr六、工程里最常见的几个大户
如果你在服务器上排查磁盘问题,优先怀疑这些地方:
/var/log- 应用日志目录
- Docker 镜像和容器层
- 上传文件目录
- 备份和导出目录
- Heap Dump、GC 日志、临时压缩包
一句话总结
df 是先回答“哪块盘满了”,du 是继续回答“到底是谁占满了”。
真正高效的排查方式,不是背更多命令,而是先用 df 缩小范围,再用 du 逐层钻进去。