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

11 linux

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

cd /tmp
mkdir foo
Run Code Online (Sandbox Code Playgroud)

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

ls -ldh foo
Run Code Online (Sandbox Code Playgroud)

结果显示目录的大小是4KB,虽然里面没有任何内容!

然后我创建了一个带触摸的空文件:

touch empty
Run Code Online (Sandbox Code Playgroud)

然后我检查了它的大小:

ls -l empty
Run Code Online (Sandbox Code Playgroud)

结果显示空文件为0B,与空目录不同.

我读过有关Q&A的说法,说4KB是目录的元数据.但如果它是元数据,内部存储什么样的信息,为什么它如此巨大,以及为什么空文件没有这种元数据?如果它不是元数据,4KB是什么意思?

小智 24

我打算将这个问题分解为3个部分,其中2部分我可以回答......

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

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

第2部分:为什么4K最小?

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

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

第3部分:当您ls -l使用常规文件时,您将获得实际使用的字节数,但是当您ls -ld获得目录时,您将获得分配的字节数.为什么?

这部分我不知道.对于常规文件,您可以查看分配大小ls -s,这两种大小实际上会告诉您不同的内容.但是在目录上,-l大小就像是大小的冗余副本-s.据推测,内核可以报告一个大小,该大小指示4K块实际使用了多少,但事实并非如此.我不知道为什么.