为什么 df 命令可以 return 比 du 更快地使用磁盘

why df command can return fast that with disk usage than du

为什么df命令可以return快速计算每个分区的使用情况,而du需要较长时间才能计算出return的磁盘使用情况。

df 是如何工作的?

因为df可以使用statfs(2) syscall. But du is recursively traversing the file hierarchy, à la nftw(3)

一般来说,请记住大多数 Linux 程序和命令是 free software, so you can study their source code. df is in coreutils

而且您始终可以 strace(1) 一个命令来了解它是哪个系统调用 运行。

根据手册,df - report file system disk space usage

并且,du - estimate file space usage

df是显示文件系统使用情况,du是报告文件space使用情况。 du 从文件工作,而 df 在文件系统级别工作,报告内核所说的可用内容。从广义上讲,df 不关心文件,而是文件系统本身。

明智地工作,df直接在文件系统元数据中查看磁盘使用块。因此它 returns 比 du 快得多,但只能显示整个 disk/partition 的信息。其中,du 遍历目录树并计算其中所有文件的总大小。由于可能存在不可读文件、目录树中的硬链接等,它可能无法输出准确的信息。

编辑

既然你也问了这个问题,df是如何工作的,如果你同时使用dfdu,那真的很有趣您可能会发现,有时可用的免费 space 数量存在差异。现在您可能会惊讶地想,两个相似的命令(dfdu)怎么可能为同一个硬盘返回不同的空闲 space???

答案就在df的工作中, 由于 df 与文件系统元数据直接相关,因此它也连接到 打开文件描述符 。假设发生这样一种情况,当一个文件被删除时,可能有其他进程正在打开该文件,导致它不能被删除; (重新启动或终止该进程将释放文件)此外,如果您创建了硬链接,多个文件名将指向相同的数据,并且数据(实际内容)将被标记为 free/usable 直到所有对它的引用都已删除被删除。在这种情况下,df 将考虑这些文件/数据的大小,因此可用 space 会更低。

df 只是告诉您文件系统上的总空闲 space。文件系统可以通过简单的簿记立即知道这一点。

另一方面,

du 实际上遍历一个目录并计算其内容的总大小。这速度较慢,但​​也更强大:例如,它可以计算单个目录的大小而不是整个文件系统。

dfdu 是两个不同的实用程序。顾名思义,duMan page of du will estimate file usage whereas dfMan page of df 将报告磁盘使用情况。

df - report file system disk space usage

du - estimate file space usage

df 所做的是解析 /etc/mtab 文件并使用 statfs 报告磁盘使用情况。而 du 将解析每个文件的目录存储大小中的所有文件,然后计算最终总和,这与 df 所做的相比是乏味的。

因为解析文件需要内存访问,这反过来占用 CPU 直到操作完成。因此 df 比 du

更快