我使用Ubuntu 14.04并使用mkdir命令在/ tmp上创建了一个空目录:
cd /tmp
mkdir foo
然后我用ls:
检查了它的大小ls -ldh foo
并且结果显示目录的大小是4KB,尽管里面没有任何内容!
然后我创建了一个带触摸的空文件:
touch empty
然后我检查了它的大小:
ls -l empty
结果显示空文件为0B,与空目录不同。
我已经读过一些Q& A的说法,说4KB是目录的元数据。但如果它是元数据,那里存储了什么样的信息,为什么它如此巨大,以及为什么空文件没有这种元数据呢?如果它不是元数据,4KB意味着什么?
答案 0 :(得分:21)
我打算将这个问题分解为3个部分,其中2部分我可以回答......
第1部分:为什么不是空目录大小0?
因为它包含.
和..
所以它并不是真的。
第2部分:为什么4K最小?
因为这是文件系统的块大小。您可以在创建文件系统时将其设置得更小,但是存在开销。文件系统必须记住每个块的空闲或使用标志,因此较小的块=更多的块=更多的开销。 (在ext2的早期阶段,默认块大小为1K。磁盘足够小,因为不为每个文件分配4K的倍数而节省的空间比用于空闲块映射的空间更重要。)
块大小超过4K是不可能的,因为4K是大多数处理器上的页面大小(虚拟内存的最小单位),而Linux并不是为处理文件系统而设计的块大于内存页面。
第3部分:当您ls -l
常规文件时,您将获得实际使用的字节数,但是当您ls -ld
目录时,您将获得分配的字节数。为什么呢?
这部分我不知道。对于常规文件,您可以使用ls -s
查看分配大小,这两种大小实际上会告诉您不同的内容。但是在目录上,-l
大小就像-s
大小的冗余副本。据推测,内核可以报告一个大小,该大小指示4K块实际使用了多少,但它并没有。我不知道为什么。
答案 1 :(得分:1)
目录包含的元数据是一系列directory entries。它在创建时不会为空,因为会立即创建两个目标:一个用于该目录,名为"。",一个用于其父目录,名为" .."