为什么 。和 .. 的文件大小分别为 4 kB 和 12 kB?

为什么 。和 .. 的文件大小分别为 4 kB 和 12 kB?

如图所示ls -al,例如:

drwxr-xr-x  9 jb jb 4.0K Mar  8 18:05 ./
drwx------ 49 jb jb 12K Mar 17 14:15 ../

我认为这是存储索引节点元数据(例如由 返回的元数据)所需的最小空间量stat,但我不完全确定。

答案1

.( dotfor d, dfor directory) 是指向其包含目录的硬链接。你会注意到:

ls -di . "$PWD"

返回相同的索引节点号。它的大小是它需要(或可能曾经需要)来存储其内容的字节数,即它引用的文件列表(链接到它,其中顺便包括...

..d目录的目录)是到父目录的硬链接,这是引用该目录的唯一目录(如果我们不考虑和d条目,目录只能有一个链接)。...

所以:

ls -di -- .. "$(dirname -- "$(pwd -P)")"

也将返回相同的索引节点号。

所以在你的情况..下大于..它可能包含更多条目(或者在那些分配给目录的空间永远不会被回收的文件系统上,..曾经有那么多条目需要 12kB 来存储它们,而从来.不需要超过 4kB)。

答案2

典型的类 Unix 文件系统上的目录只是一个特殊属性的文件。符号链接也是如此。一些类 Unix 文件系统能够在 inode 内存储一个小文件,例如符号闪烁。这意味着不必为文件分配任何块,并且由于文件大小计算不计算索引节点,因此文件大小为零。

其数据无法放入其索引节点的文件必须占用某种与索引节点分开分配的最小存储单元。 (然后索引节点的数据空间通常会转换为指向该存储块的指针数组。)

最简单的策略是,所有内容都被分成不可分割的块,这些块的大小都相同,并且没有两个文件可以在单个块内共享存储。然而,一些文件系统(例如 Berkeley FFS)可以将块分解为分配给不同文件的片段,以减少浪费。

块大小是在文件系统创建时决定的,作为寻址大磁盘和浪费小文件空间之间的折衷方案。典型的块大小是 2 的幂,从 512 左右开始(现在可能很少见)。

如您所知,每个(非根)目录至少包含两个条目,因为即使是空目录也包含 .和..链接。如果您看到非零值甚至是完全空目录的大小,则表明在给定的文件系统中,这两个基本目录条目太大,无法放入 inode 的微小数据区域。因此目录数据占用一个单独分配的块,或块片段。

看起来在您给定的文件系统上,块大小为 4096 并且没有更小的碎片。 (否则,您的块大小甚至更大,而 4096 是片段的大小。)目录开始占用 4096 块/片段,并且当向该目录添加足够的条目以耗尽该单元中的空间时,目录增长到 8192,然后增长到 12 KB,依此类推。

.. 的较大值表示父目录是一个相当大的目录,这与子目录的大小无关。

相关内容