读:df 与 du——为什么两个磁盘用量命令数字对不上
内容提要
文章讨论了Linux系统中`df`和`du`命令显示的磁盘使用量不一致的原因,包括已删除但仍被进程占用的文件、文件系统保留块、隐藏挂载点和容器的overlay文件系统。`df`直接读取文件系统的超级块,而`du`遍历目录树,导致统计结果不同。提供了检测脚本和排查方法,帮助用户找出占用空间的文件。
关键要点
-
df 和 du 命令显示的磁盘使用量不一致,原因在于它们的工作机制不同。
-
df 直接读取文件系统的超级块,统计已分配的磁盘块,而 du 遍历目录树统计可见文件和目录的大小。
-
最常见的原因是已删除但仍被进程占用的文件,导致 df 统计的空间未被释放。
-
文件系统保留块会导致 df 和 du 的统计结果不同,ext 系列文件系统默认保留 5% 的空间给 root 用户。
-
隐藏挂载点会使得原有数据不可见,df 仍然能看到这些数据占用的空间。
-
容器的 overlay 文件系统可能导致空间统计不一致,尤其是在删除容器镜像层后。
-
提供了检测脚本和排查方法,帮助用户找出占用空间的文件,确保磁盘空间的准确统计。
延伸解读
理解 df 和 du 的工作机制
df 和 du 的统计方式截然不同,df 直接读取文件系统的超级块,统计已分配的磁盘块,而 du 则遍历目录树,统计可见文件的大小。这种机制差异导致了它们在磁盘使用量上的不一致,用户在排查磁盘空间问题时需注意这一点。
已删除文件的影响
在 Linux 中,删除文件并不会立即释放磁盘空间,尤其是当进程仍在使用这些文件时。此时,df 会显示这些空间仍被占用,而 du 则无法看到这些已删除但仍被占用的文件。因此,运维人员应定期检查并释放这些空间,以避免误判磁盘使用情况。
文件系统保留块的注意事项
ext 系列文件系统默认保留 5% 的磁盘空间给 root 用户,这部分空间在 du 的统计中是不可见的。用户在管理磁盘空间时,应考虑这一因素,尤其是在大容量磁盘上,5% 的空间可能是一个显著的数字。
容器与 overlay 文件系统的复杂性
在使用容器技术时,overlay 文件系统的层叠特性可能导致空间统计的不一致。用户在排查磁盘空间问题时,需特别关注容器的文件系统行为,确保已删除的镜像层不会影响到实际的磁盘使用情况。
延伸问答
为什么df和du命令显示的磁盘使用量不一致?
因为df直接读取文件系统的超级块,统计已分配的磁盘块,而du遍历目录树统计可见文件和目录的大小。
已删除但仍被进程占用的文件会影响磁盘使用量的统计吗?
会,已删除但仍被进程占用的文件会导致df统计的空间未被释放,而du无法看到这些文件。
如何检查是否存在已删除但仍占用磁盘空间的文件?
可以使用脚本检查,脚本会遍历lsof +L1的输出,找出已删除但仍被持有的文件。
文件系统保留块会对df和du的结果产生什么影响?
文件系统保留块会导致df和du的统计结果不同,du无法看到这部分空间,而df的可用空间已扣除这些保留块。
隐藏挂载点如何影响磁盘空间的统计?
隐藏挂载点会使得原有数据不可见,du无法看到这些数据,但df仍能看到它们占用的空间。
容器的overlay文件系统会导致空间统计不一致吗?
会,容器的overlay文件系统可能导致df和du的空间统计不一致,尤其是在删除容器镜像层后。