文件系统容量至少受到两类资源限制:数据块,以及 inode 等元数据对象。df 从文件系统角度报告分配情况,du 则遍历可达路径名并汇总归属于它们的用量。两者回答的问题不同,结果不必一致。
文件系统 · 第 9 课
磁盘用量
了解 `df` 和 `du` 如何从不同角度衡量文件系统数据块与 inode 消耗。
使用 `df` 查看文件系统容量
以下命令显示已挂载文件系统类型和便于阅读的数据块数值:
$ df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda1 ext4 6.2G 2.3G 3.6G 40% /
Size、Used 和 Avail 来自文件系统统计。由于保留块、元数据、分配策略、配额或舍入,可用空间可能小于总量减去已用量。对某个路径运行 df,可以报告包含该路径的文件系统:
$ df -hT /var/log
df 主要报告什么?
Inode 容量
采用 inode 类对象的文件系统即使仍有数据块,也可能耗尽 inode:
$ df -i /var
大量小文件可能耗尽可用 inode。删除一个大文件可以释放许多数据块,但通常只释放一个 inode;删除大量不再需要的小文件则有助于缓解 inode 压力。某些文件系统动态分配元数据,并以不同方式报告这些概念。
文件系统仍有可用数据块、但没有可用 inode 时,可能发生什么?
使用 `du` 查看路径用量
汇总某个目录下可达内容分配的空间:
$ du -sh /var/log
在不跨越文件系统的情况下比较直接子项:
$ sudo du -xhd1 /var | sort -h
这里所示的 GNU 选项分别表示便于阅读的输出、最大深度一层,以及只遍历一个文件系统。权限可能隐藏子树,使总数不完整。默认情况下,du 也可能只统计一次硬链接文件;它还能区分表观大小与已分配数据块,并会根据选项以不同方式处理稀疏文件。
哪个命令汇总 /var/log 下已分配的用量?
`df` 与 `du` 不一致的原因
常见原因包括:
- 进程仍然打开已删除文件,因此数据块仍被分配,但
du找不到对应路径名 - 文件系统元数据、保留空间、日志、reflink、快照或压缩影响统计
- 遍历的目录树中挂载了另一个文件系统
- 权限阻止
du读取某些目录 - 稀疏文件的表观大小与已分配大小不同
对于已删除但仍打开的文件,可以使用 lsof +L1 等工具检查已获授权的进程。应通过常规流程重启相关服务或向其发送信号,而不要截断未知文件描述符。
为什么 df 可能显示仍有空间被占用,而基于路径名的 du 找不到它?
避免让事故变得更严重
从 df 报告已满的文件系统开始,用 findmnt 确定挂载目标,再把 du 搜索限定在同一文件系统中逐步缩小范围。还应考虑快照、容器层、日志、软件包缓存和应用保留策略。不要只因为文件很大就删除它;应先确定其所有者、备份、合规要求和服务行为。
发现大文件后,最安全的处理方式是什么?
课程已完成
你已完成 磁盘用量
现在,你可以协调文件系统统计与基于路径名的空间报告。
使用
df查看已挂载文件系统的数据块容量。在支持时使用
df -i检查 inode 压力。使用限定范围的
du遍历归属可达路径用量。调查已删除但仍打开的文件,以及文件系统特有的统计差异。
删除数据前,遵循所有权和保留策略。