Linux目录大小/块数的单调增长

在Linux上(可能是作为文件系统块大小的函数),当我创build一个目录并对其进行stat时,它将返回4096的大小。我可以在这个目录中创build文件,直到一个点,而不增加感知的大小该目录(由stat报告)。

在某些时候,由于目录填满了许多文件,目录大小的气球(我不是在谈论目录的内容,我正在谈论代表目录本身消耗的块)。 如果文件被删除,目录大小保持不变。

这里有一个简单的例子:

 [root@uxlabtest:/]$ mkdir test [root@uxlabtest:/]$ stat test File: `test' Size: 4096 Blocks: 8 IO Block: 4096 directory Device: fd00h/64768d Inode: 1396685 Links: 2 Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2011-07-26 14:06:04.000000000 -0400 Modify: 2011-07-26 14:06:04.000000000 -0400 Change: 2011-07-26 14:06:04.000000000 -0400 

然后触摸一堆文件:

 [root@uxlabtest:/]$ for i in `seq 1 10000`; do touch /test/$i; done [root@uxlabtest:/]$ stat test File: `test' Size: 155648 Blocks: 312 IO Block: 4096 directory Device: fd00h/64768d Inode: 1396685 Links: 2 Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2011-07-26 14:06:04.000000000 -0400 Modify: 2011-07-26 14:06:56.000000000 -0400 Change: 2011-07-26 14:06:56.000000000 -0400 

然后删除这些文件:

 [root@uxlabtest:/]$ rm -rf /test/* [root@uxlabtest:/]$ stat test File: `test' Size: 155648 Blocks: 312 IO Block: 4096 directory Device: fd00h/64768d Inode: 1396685 Links: 2 Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2011-07-26 14:07:11.000000000 -0400 Modify: 2011-07-26 14:07:12.000000000 -0400 Change: 2011-07-26 14:07:12.000000000 -0400 

我的问题是:

  • 为什么一个目录的大小/块数增加单调?
  • 这是底层文件系统还是Linux VFS的function?
  • 可以减less目录的大小而不删除和重新创build目录?
  • 奖励要点:指向执行此行为的内核源代码。

这里是ext2 / ext3 / ext4的答案。 如果它们对于其他文件系统是正确的取决于它们的实现。

  1. user48838正确回答了这个问题。 更多的文件消耗更多的元数据。 它们以文件系统创build时定义的4k块或其他大小分配
  2. 是的,这是真正的文件系统的function/问题
  3. 在ext3文件系统中,这是不可能的。 只有通过重新创build(空)目录
  4. 源代码在这里和相关文件中

但是你有运气。 当您重新创build已删除的文件数量相同时,目录大小将保持不变。 只有当你添加更多的文件,它会增加。

您看到的块增量是由于文件系统如何pipe理其文件和相关文件pipe理信息的存储。 在你描述的情况下,这将会出现4K的增量,所以每个“新”/“唯一”进入文件系统将保留4K,不pipe实际数据大小是否填满整个4K。 如果相关数据占用整个4K,则另外的4K块被保留并根据需要填充以存储整个相关数据stream/序列。

根据由文件系统pipe理的“硬”删除和“软”删除,删除可能不(通常不用于“取消删除”function)立即释放被保留的块。 有些文件系统可能会区分不同types的“删除”,并提供相应的存储块pipe理function。

如何处理和实施存储pipe理因文件系统而异,所以在支持多个/模块化文件系统的操作系统中,操作系统通常只会提供文件系统的“挂钩”来集成。

给user48838添加一些散漫的评论的好答案:

一切都是一个文件,包括目录。 要存储所有的文件信息,你需要空间。

例如,对于一个小目录显示“64B used”,并且实际显示所使用的空间量也是有效的,但是我们会在磁盘上使用4K的倍数,所以这是一个devise决定,已用空间量。

从FSdevise的angular度来看,你为什么要经历计算所使用的麻烦? 不必要。 然后你必须移动项目,以避免漏洞… ick。

当删除发生和目录大小下降,以便您可以释放一个块,所有的pipe理将需要发生之前,你可以这样做。 为什么还要节省几个KB? 赔率是你将不得不在晚些时候扩大它。

作为练习留给读者:想想为什么你的/ lost + found目录被创build为空,但占用16K(至less在ext3上)。