当然,符号链接确实占用空间,但只是存储名称和目标以及其他元数据的几个字节所需的空间
我的问题是,我们可以确定符号链接占用了多少字节吗?
$ touch alfa.txt
$ ln -s alfa.txt bravo.txt
du 和 ls 都报告 8,即“alfa.txt”:
$ du -b bravo.txt
8 bravo.txt
$ ls -l bravo.txt
lrwxrwxrwx 1 Steven None 8 Mar 8 18:17 bravo.txt -> alfa.txt
是否有一些命令可以打印符号链接的真实大小,其中包括“其他元数据的几个字节”?
答案1
有点像,但请注意,文件的大小在该精度级别上没有明确定义。
符号链接包含四个部分:
- 链接的名称,存储在其作为条目的目录中。
- 每个目录条目都存在其他元数据,用于查找其余元数据。这通常是索引节点的位置。此外,每个目录条目还要花费一些字节,例如填充文件名和维护平衡树或散列等数据结构。
- 符号链接本身的其他元数据,例如时间戳。其他文件类型(例如空的常规文件)也存在此元数据。
- 链接的目标。
如果文件系统允许符号链接具有多个硬链接,则前两个部分是每个目录条目,后两个部分每个符号链接仅出现一次。
在 ext2/ext3/ext4 中,如果符号链接的目标长度最多为 60 个字节,则将其存储在 inode 中。您可以通过询问来确认这一点du
:对于目标≤60字节的符号链接,它报告0,对于更大的目标,报告1块。
就像常规文件一样,报告的数字du
不包括目录项和索引节点的存储。如果您想确切地知道符号链接占用了多少空间,您还必须计算这些空间。大多数经典文件系统在文件系统创建时分配索引节点,因此成本是分开的:目录条目的大小根据数据块的数量计算,索引节点根据索引节点池的大小计算。
对于目录条目本身的大小,条目占用的确切字节数可以取决于目录中存在的其他条目。然而,一个目录通常会占用一整块的块,因此,如果您创建越来越多的条目,目录的大小将保持不变,直到条目不再适合一个块并分配第二个块,依此类推。要准确了解目录条目如何存储在块中,您需要一个文件系统调试器和对文件系统格式的基本了解,或者对文件系统格式有很好的理解以及对存在其他条目的了解在目录中,可能还有它们的创建顺序和其他条目被删除的顺序。
总之,“其他元数据的几个字节”是:
- 大小可变的目录条目。创建符号链接可能没有任何影响,也可能添加一个块。
- 索引节点。
除此之外,目标可能占据 0 到 1 个区块之间的任何位置。
答案2
该ls
命令显示符号链接的真实大小,不计算它使用的索引节点。说 8 是“alfa.txt”,你是完全正确的。这就是您创建的符号链接的“真实大小”。同样,大小不包括它使用的索引节点,就像所有其他文件的大小不包括它一样。如果您创建指向某个长路径的符号链接,则大小将反映该路径的长度。