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

loo*_*ver 8 linux inode vfs

在 Linux 上(可能是文件系统块大小的函数),当我创建一个目录stat时,它返回 4096 的大小。我可以在这个目录中创建文件,在一定程度上,不会增加感知的大小目录(由 报告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
Run Code Online (Sandbox Code Playgroud)

然后触摸一堆文件:

[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
Run Code Online (Sandbox Code Playgroud)

然后删除文件:

[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
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 为什么目录的大小/块数单调增加?
  • 这是底层文件系统或 Linux VFS 的功能吗?
  • 可以在不删除和重新创建目录的情况下减小目录大小吗?
  • 加分项:指出实现此行为的内核源代码。

mai*_*ilq 9

以下是适用于 ext2/ext3/ext4 的答案。如果它们适用于其他文件系统,则取决于它们的实现。

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

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


use*_*838 4

您看到的块增量是由于文件系统管理其文件存储和相关文件管理信息的方式造成的。在您描述的情况下,这似乎是 4K 的增量,因此文件系统中的每个“新”/“唯一”条目都将保留 4K,无论实际数据大小是否填满整个 4K。如果相关数据占用了整个4K,则根据需要保留并填充另一个4K块来存储整个相关数据流/序列。

根据文件系统管理的“硬”删除与“软”删除,删除可能不会(通常不适用于“取消删除”功能)立即释放保留的块。一些文件系统可以区分不同类型的“删除”并提供相应的存储块管理能力。

存储管理的处理和实现方式因文件系统而异,因此在支持多个/模块化文件系统的操作系统中,操作系统通常只提供“钩子”供文件系统集成。