我确信目录文件包含的信息远少于 4096 字节。我知道扇区大小为 4096 字节。但确实存在小于该大小的正常文件。
为什么 Unix 为每个文件夹保留 4096 字节?
答案1
这是存储该目录中包含的文件的元数据(包括名称)所需的初始大小。初始分配等于一个扇区的大小,但必要时可以超过该大小。一旦分配,如果文件被删除,空间就不会被释放,以减少碎片。
例如:
$ mkdir testdir
$ cd testdir
$ ls -ld .
drwxr-xr-x 2 matthew matthew 4096 2007-12-03 20:28 ./
$ for ((i=0; i<1000; i++)); do touch some_longish_file_name_$i; done
$ ls -ld .
drwxr-xr-x 2 matthew matthew 36864 2007-12-03 20:29 ./
$ rm some_longish_file_name_*
$ ls -ld .
drwxr-xr-x 2 matthew matthew 36864 2007-12-03 20:29 ./
$ cd ..
$ ls -ld testdir
drwxr-xr-x 2 matthew matthew 36864 2007-12-03 20:29 testdir/
$ rmdir testdir ; mkdir testdir
$ ls -ld testdir
drwxr-xr-x 2 matthew matthew 4096 2007-12-03 20:29 testdir/
答案2
有时 4096 字节是某些文件系统的最小分配单元。这就是目录有 4096 个字节的原因。
同样的事情也适用于文件。即使某些文件可能报告少于 4096,但它们实际上占用了至少 4096 个磁盘存储空间。
答案3
保留 4096 个字节是为了减少碎片,因为所包含元数据的实际大小通常会根据目录内容而波动。如果元数据随时间不断增大和缩小(例如,它包含日志文件或动态内容),则可能会损害性能。这种情况可能不会发生在一个文件夹中,但在整个文件系统中,它会迅速增加。
答案4
这取决于文件系统。在 ext2/3/4 上它“是” 4096。在 reiserfs 上它可以是 9608 (我的$HOME
) 1032 ( /tmp
) 或 48 ( 中的一些目录/tmp
)。
默认情况下,ext2/3/4 上的块为 4096 - 文件占用的空间不能小于此值。如果文件较小,则无论如何都会占用整个块。由于询问目录的逻辑大小毫无意义,而且这些信息可能根本不在磁盘上,并且必须报告某些内容,因此它会报告块大小乘以占用的块数,即已占用的物理空间。