df 查文件系统整体空间,du 统计可见文件实际占用;df 反映块设备空闲,du 遍历目录累加大小;差异源于删除文件未释放、挂载点嵌套、稀疏文件等机制。

df 和 du 看起来都“查磁盘用了多少”,但它们查的根本不是一回事——df 看的是文件系统整体状态,du 看的是你当前能看见的文件加起来占了多大。理解这点,就能避开 90% 的空间困惑。
df:看分区还剩多少“地皮”
df 直接读取文件系统的元数据,告诉你每个挂载点(比如 /、/home)的总容量、已用、可用、使用率。它不关心具体是哪个文件占的,只管底层块设备有没有空闲空间。
- 默认单位是 KB,加 -h 更直观(如 2.3G、15T)
- -i 查 inode 使用情况——有时候磁盘还有几十 GB,却写不进新文件,就是因为 inode 耗尽了
- tmpfs、/dev/shm 这类内存文件系统也会列出来,但重启即清空,不占硬盘
- 删除大文件后,df 显示的“可用空间”可能没立刻变多——因为进程还在占用该文件句柄,空间实际未释放
du:看目录里“堆了多少东西”
du 是真的去翻文件:从指定路径开始,挨个读取文件大小,再累加。它反映的是当前目录树下所有可访问文件实际占用的磁盘块数。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- -sh /var/log 快速看一个目录总大小(s=summary, h=human-readable)
- -h --max-depth=1 /var 查 /var 下每个一级子目录分别占多少,方便定位大户
- 权限不足的子目录会被跳过,导致 du 结果偏小;隐藏文件(以 . 开头)默认包含在内
- 硬链接只算一次,软链接不计入目标文件大小(除非加 -L)
为什么 df 和 du 结果经常对不上?
这不是 bug,而是机制差异的自然结果:
- 文件已被 rm 删除,但仍有进程在读写(如 tail -f 日志、nginx 正在写 access.log)→ df 认为“空间还在占用”,du 找不到这个文件 → df 已用 > du 总和
- 挂载了其他文件系统(如 NFS、bind mount)到某个子目录 → du 会钻进去统计,df 只按挂载点划分 → du 总和可能 > df 某一分区已用
- 存在稀疏文件、快照(LVM/btrfs)、或容器层叠加 → du 统计的是逻辑大小,df 反映的是物理块占用
日常排查怎么配合用?
先 df 定位哪个分区爆了,再 du 找出谁在撑肚子:
- df -h → 发现 /var 使用率 98%
- du -sh /var/* 2>/dev/null | sort -hr | head -5 → 快速列出 /var 下前五大目录
- 如果 du 加总远小于 df 显示已用,就用 lsof + grep deleted 找被删但仍被占用的文件
- 加 --exclude 跳过 /var/cache 或 /var/lib/docker(若不用 Docker)可加快 du 扫描

















