为什么Linux中空目录的大小为4KB?

20

我正在使用Ubuntu 14.04,在/tmp目录下使用mkdir命令创建了一个空目录:

cd /tmp
mkdir foo

然后我使用ls检查了它的大小:

ls -ldh foo

结果显示目录的大小为4KB,即使其中没有任何内容!

然后我用touch创建了一个空文件:

touch empty

然后我检查了它的大小:

ls -l empty

结果显示空文件大小为0B,不同于空目录。

我读过一些问答,说4KB是目录的元数据。但如果它是元数据,里面存储了什么信息以及为什么这么大,为什么一个空文件没有这种类型的元数据?如果它不是元数据,那4KB是什么意思?


3
更适合在http://unix.stackexchange.com/上。 - Yu Hao
3
4KB是磁盘和内存中最小可管理的单元大小。现代文件系统具有记录操作的日志,以便更轻松地从机器故障中恢复。 - feeling_lonely
很棒的问题(尽管可能放错了地方)。能够将其迁移到适当的网站上会很好。 - Nitin Savant
2个回答

37

我将把这个问题分成三个部分,其中两个我可以回答...

第一部分:为什么空目录的大小不是0?

因为它包含 . .. ,所以它并不是真正的空。

第二部分:为什么4K是最小值?

因为这是文件系统的块大小。您可以在创建文件系统时将其设置得更小,但会有开销。文件系统必须为每个块记住一个自由或已使用的标志,因此较小的块=更多的块=更多的开销。(在ext2的早期,默认块大小为1K。磁盘足够小,以至于为每个文件分配不是4K的倍数而节省的空间比用于空闲块映射的空间更重要。)

超过4K的块大小是不可能的,因为4K是大多数处理器上的页面大小(虚拟内存的最小单位),而Linux没有设计用于处理大于内存页面的文件系统块。

第三部分:当您使用ls -l查看常规文件时,您会得到实际使用的字节数,但是当您使用ls -ld查看目录时,您会得到分配的字节数。为什么?
这一部分我不知道。对于常规文件,您可以使用ls -s查看分配大小,而且这两个大小实际上告诉您不同的信息。但是对于目录,-l大小就像是-s大小的冗余副本。可能内核可以报告一个大小,指示实际使用了多少4K块,但它没有这样做。我不知道为什么。

1
第三部分是因为除了完整的块之外,分配任何其他空间都没有任何意义;其余的空间不能被其他任何东西使用,并且已经可以知道dirents的结束位置。 - Ignacio Vazquez-Abrams
谢谢!这真的帮了我很多! - user3905370

2

一个目录包含的元数据是一系列目录条目。它在创建时不是空的,因为会立即创建两个dirent:一个是该目录自身的,称为“.”,另一个是其父目录的,称为“..”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接