Tim*_*Tim 11 filesystems directory ext4 ntfs
$ 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
Run Code Online (Sandbox Code Playgroud)
为什么目录的大小是 0 或 4096?
目录的大小是否为 0,因为其中的条目可以放入其 inode 中?
目录的大小是否不是 0,因为其中的条目无法放入其 inode 中,因此需要一些数据块?
为什么目录的非零大小总是 4096?
谢谢。
请注意,我的观察在 ext4 文件系统和 NTFS 文件系统中是相同的。这是否意味着两种文件系统类型都以类似的方式实现目录?
某些文件系统在 inode 中有一些空间可用于保存非常小的目录。但是,一旦目录大到无法放入该区域,操作系统将分配整个文件分配单元,在您的情况下显然是 4096 字节。
在 ext4 上,这是通过 inline_data ext4 选项启用的。
https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Inline_Directories
目录只是一个特殊文件,其中包含文件名和索引节点号的数组。当目录被创建时,文件系统为该目录分配了1个inode,并带有“文件名”(实际上是目录名)。inode 指向单个数据块(最小开销),大小为 4096 字节。
目录可以增长到大于 4096,而ext4 文件系统的一个特有“bug”(尚未获得太多优先级)是,在目录信息增长到超过 4096 字节之后,如果删除文件,该数字不会减少。也许最重要的消息是,如何为目录分配信息取决于文件系统,甚至取决于启用/禁用的选项(源),因此在这种情况下,特殊数字 4096 特定于 ext4,但也可能是其他数字例如在其他文件系统(例如 UFS)上。
但请注意,Terry 谈论的是代表目录的 inode,目录本身是父目录中的 dirent。初始目录内容是 dients 或 links.以及..
ext4 文件系统默认创建分配 4096 字节的目录(即使是空的)。这就是关键。根据ServerFault和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
Run Code Online (Sandbox Code Playgroud)