为什么 Linux 的 df 与 du 磁盘占用不同
理解 Linux 上 df 与 du 为何不同,包括文件系统元数据、保留块、已删除但仍打开的文件、权限、硬链接、稀疏文件和挂载边界。
直接回答
df 报告文件系统层的分配情况,du 则遍历可达目录项并估算其磁盘占用。二者观察层级不同,不应期待完全一致;大差额可能来自已删除但仍打开的文件、无权路径、被挂载覆盖的内容、快照、保留块或文件系统元数据。
适用场景
- df 显示挂载点已满,但可见目录树小得多。
- 移除某条路径后,空闲空间没有恢复。
- 你需要解释可视化扫描为何无法对应每个已分配块。
分步骤复核
对齐范围
把目标挂载点的 df 与同一挂载点的 du 对照,并控制是否跨文件系统。
确认单位和语义
检查数值究竟是人类可读单位、字节、块、逻辑大小还是实际分配。
记录可见性缺口
权限失败和跳过的挂载意味着类似 du 的遍历并不完整。
调查仅文件系统可见的分配
使用合适的管理员工具检查已删除但仍打开的文件、快照、保留块、元数据和挂载点下被遮住的内容。
负责人操作后重新测量
再次核对同一文件系统和范围,不要只相信估算的可释放量。
相关技术原理
差异来自架构
GNU 把 df 定义为文件系统空间报告,把 du 定义为基于目录层级的估算;它们互补,而非可互换的计算器。
路径名删除后数据仍可能占用
如果进程仍持有文件,解除路径链接不一定立即释放数据块。
表观大小是另一条维度
du 可以把表观大小与实际分配分开报告;稀疏文件尤其能体现这种差异。
精确对账依赖具体文件系统
快照、写时复制、压缩、去重和保留空间,都需要结合实际文件系统的工具与知识。
df 与 du 回答不同问题
| 对比项 | df | 类似 du 的扫描 |
|---|---|---|
| 主要范围 | 已挂载文件系统 | 某目录下的可达路径 |
| 是否遍历目录树 | 否 | 是 |
| 已删除但仍打开的数据 | 仍计入分配 | 没有可遍历路径 |
| 无权目录 | 计入文件系统总量 | 无法完整计数 |
| 最适合 | 容量与剩余空间告警 | 定位可见目录占用 |
风险与不应执行的操作
不要强行让合计相等
不断调整选项直到数字相同,可能掩盖范围或语义不一致。
不要随意关闭进程
持有已删除文件的可能是关键服务;应协调有记录的重启或日志重开流程。
不要把差额叫作可释放空间
部分差异属于元数据、快照、保留区或不可访问数据,并非可丢弃文件。
Omuuz 产品能做什么、不能做什么
能够做到
SSH Disk Visualizer 可以把文件系统容量与基于元数据的目录合计并列展示,并显示扫描缺口,避免混淆两种测量。
不能做到
它不能通过路径列出已解除链接的文件、对账每种文件系统特性,也不能声称差额都可释放。