$ ls -l
total 28
drwxrwxrwx 1 t t 4096 May 8 2018 dir1
drwxrwxrwx 1 t t 0 Mar 12 2015 dir2
drwxrwxrwx 1 t t 4096 Jan 17 2014 dir3
drwxrwxrwx 1 t t 4096 Jun 12 2017 dir4
drwxrwxrwx 1 t t 0 Aug 24 2012 dir5
为什么目录的大小是 0 或 4096?
目录的大小是否为 0,因为其中的条目可以放入其 inode 中?
目录的大小是否不为 0,因为目录中的条目无法放入其索引节点,因此需要一些数据块?
为什么目录的非零大小始终为 4096?
谢谢。
请注意,我的观察结果在 ext4 文件系统和 NTFS 文件系统中是相同的。这是否意味着两种文件系统类型都以类似的方式实现目录?
答案1
某些文件系统的索引节点中有一些空间可用于容纳非常小的目录。但是,一旦目录足够大而无法容纳该区域,操作系统将分配整个文件分配单元,在您的情况下显然是 4096 字节。
在 ext4 上,这是通过 inline_data ext4 选项启用的。
https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Inline_Directories
答案2
约4096
去引用王泰瑞的回答:
目录只是一个特殊文件,其中包含文件名和索引节点号的数组。当目录被创建时,文件系统为该目录分配了1个inode,并带有“文件名”(实际上是目录名)。 inode 指向单个数据块(最小开销),大小为 4096 字节。
目录可以增长到大于 4096,并且ext4 特有的“错误”之一文件系统尚未获得太多优先级的是,在目录信息超出 4096 字节后,如果删除文件,该数字不会减少。也许最重要的新闻是,如何为目录分配信息取决于文件系统,甚至取决于启用/禁用的选项(来源),因此在本例中,特殊数字 4096 是 ext4 特有的,但也可能是其他文件系统(例如 UFS)上的其他数字。
但请注意,Terry 谈论的是代表目录的 inode,目录本身是父目录中的 dirent。初始目录内容是 dients 或 links.
以及..
约0
ext4 文件系统默认创建分配 4096 字节的目录(即使是空的)。这就是关键。根据服务器故障和Arch Linux 论坛当目录大小显示为 0 时,表示该目录位于或托管非 ext4 的文件系统。
对于虚拟文件系统来说也是如此(它实际上不是物理磁盘上的文件系统,而是由内核公开并包含在内存中的接口):
$ ls -ld /proc /sys
dr-xr-xr-x 243 root root 0 Feb 24 13:57 /proc
dr-xr-xr-x 13 root root 0 Feb 26 14:42 /sys