快速和慢速符号链接


4

来自http://en.wikipedia.org/wiki/Symbolic_link#Storage_of_symbolic_links

符号链接的早期实现将符号链接信息作为数据存储在常规文件中。该文件包含对链接目标的文本引用,以及一个指示符,该指示符将其表示为符号链接。

这种方法速度慢,在小型系统上磁盘空间的利用效率低下。的改进,称为快速符号链接允许用于在磁盘上存储(i节点)文件信息的数据结构内的目标路径的存储。该空间通常存储分配给文件的磁盘块地址列表。因此,可以快速访问目标路径较短的符号链接。如果目标路径超出可用的inode空间,则具有快速符号链接的系统通常会退回到使用原始方法的位置。原始样式被追溯称为 慢速符号链接。它还用于与其他版本或更旧版本的操作系统进行磁盘兼容性。

  1. “允许在用于在磁盘上存储文件信息的数据结构中存储目标路径(节点)”是否表示快速符号链接将链接文件的路径存储在快速符号链接的inode内

    作为文件本身的快速符号链接是否实际上仅具有一个inode却没有文件内容?

    慢速符号链接(作为文件本身)是否具有索引节点和某些文件内容(目标路径)?

  2. “如果目标路径超出可用的inode空间”是什么意思?

    如果并且仅当符号链接和文件位于同一文件系统上时,如果指向文件的符号链接是快速符号链接,是否正确?

  3. 是否有任何命令可以检查符号链接是快速链接还是慢速链接?

  4. 当符号链接具有文件内容时,显示符号链接内容的命令是什么?(因此,如果快速符号链接不包含文件内容,而较慢的符号链接则包含文件内容,我们可以对此进行验证。)

Answers:


5

“允许在用于在磁盘上存储文件信息的数据结构中存储目标路径(节点)”是否表示快速符号链接将链接文件的路径存储在快速符号链接的inode内

作为文件本身的快速符号链接是否实际上仅具有一个inode却没有文件内容?

取决于您所说的“具有文件内容”。无符号链接有在这个意义上文件的内容,你不能open()他们,read()从他们身上。但是在您引用的文本所隐含的含义中,“文件包含对链接目标的文本引用”。因此,是的,可以将文本引用视为文件的“内容”。

无论符号链接是快速符号链接还是慢速符号链接,此内容都是相同的。文件系统选择如何以及在何处将其信息存储在其磁盘数据结构中是实现的详细信息,并且不会对此产生影响。

慢速符号链接(作为文件本身)是否具有索引节点和某些文件内容(目标路径)?

从同一角度来看,是的!

“如果目标路径超出可用的inode空间”是什么意思?

取决于文件系统及其用于存储inode的数据结构的类型以及这些数据结构中有多少可用空间,以及它们是可变大小还是固定大小。符号链接的目标路径的最大长度,在必须退回以慢速符号链接存储之前,是文件系统实现的详细信息。

顺便说一句,没有什么可以阻止特定文件系统使用相同的技巧来存储简短的常规文件的内容,从而节省空间和磁盘访问权限。

是否有任何命令可以检查符号链接是快速链接还是慢速链接?

充其量是文件系统调试或转储工具。这将完全取决于您感兴趣的文件系统的类型(xfs,ext *,btrfs等)。

当符号链接具有文件内容时,显示符号链接内容的命令是什么?(因此,如果快速符号链接不包含文件内容,而较慢的符号链接则包含文件内容,我们可以对此进行验证。)

您可以使用来获得符号链接的目标路径(内容)readlink,但ls -l也可以使用。


通过符号链接的“文件内容”,我的意思是,将符号链接视为文件本身,它具有自己的索引节点,索引节点将指向某个数据块。该数据块的内容就是符号链接的“文件内容”。就像任何普通文件的i节点将指向该文件的内容
蒂姆·

2
除了inode可能会或可能不会指向“某些数据块”。如果内容足够短,则可以将内容直接嵌入其内部。或不。或者我们可能首先讨论的是像jffs2tmpfs这样的文件系统类型,它们首先没有“数据块”的概念,因为文件系统结构不是基于块的。所有这些都是实现细节,完全取决于每个文件系统实现者的想法,并且只要呈现给内核的接口遵循POSIX,就没有任何区别。
Celada 2014年

3
对于ext [234]这样的文件系统,您可以lstat()检查是否stat.st_blocks为0。对于短目标(<60字节),它将为0,表示快速符号链接。对于更长的目标,它将为非零(通常为4)。ls -s将显示该st_blocks字段。
Mark Plotnick

3

从链接的inode Wiki页面:

文件系统除了文件内容之外还依赖于有关文件的数据结构。前者称为元数据-描述数据的数据。每个文件都与一个索引节点关联,该索引节点由整数(通常称为i编号或索引节点号)标识。

索引节点存储有关文件和目录(文件夹)的信息,例如文件所有权,访问模式(读取,写入,执行权限)和文件类型。在许多类型的文件系统实现中,在创建文件系统时固定了最大索引节点数,从而限制了文件系统可以容纳的最大文件数。文件系统中inode的典型分配试探法是总大小的百分之一。

索引节点号索引设备上已知位置的索引节点表;根据inode编号,内核的文件系统驱动程序部分可以访问inode的内容,包括允许访问文件的文件位置。可以使用以下ls -i命令找到文件的inode编号。该ls -i命令在报告的第一列中打印索引节点号。

如上所述,ls -i可以为您提供inode编号-可能在链接所在的位置。ls -l将为您提供链接目标的路径。后者将需要stat()syscall,但是由于文件的目录列表(其dentry)将包含其inode号和文件名,因此该ls -i格式可能不会。至少,取决于文件系统,stat()除了包含目录之外的任何文件对象都可能不需要。

您可以ls使用POSIX指定的以下选项修改链接的报告方式:

-F-除非指定了-H或-L选项,否则不要跟随名为操作数的符号链接。在作为目录的每个路径名后立即写一个斜杠('/'),在每个可执行文件后都写一个星号('*'),在每个作为FIFO后面写一个竖线('|'),并在一个符号( '@')之后的每个符号链接。对于其他文件类型,可以写入其他符号。

-H-如果在命令行上指定了引用目录类型文件的符号链接,则ls应将文件信息和文件类型评估为链接所引用文件的信息和文件类型,而不是链接本身;但是,ls应该写出链接本身的名称,而不是链接所引用的文件。

-L-将所有符号链接(无论是在命令行上命名还是在文件层次结构中遇到)的文件信息和文件类型评估为该链接引用的文件的信息和文件类型,而不是链接本身;但是,ls应该写出链接本身的名称,而不是链接所引用的文件。当-L与-l一起使用时,以长格式写入符号链接的内容(请参见STDOUT部分)。

链接如何成为快速链接?在相同的链接维基页面上

内联

在inode本身中存储非常小的文件可以节省空间(不需要数据块)和查找时间(不需要进一步的磁盘访问),这很有意义。此文件系统功能称为内联。因此,在使用现代文件系统时,不再可以假定将索引节点和文件数据严格分开。

如果文件的数据适合分配给指向数据指针的空间,则可以方便地使用该空间。例如,如果ext2不超过60个字节(“快速符号链接”),则ext2以这种方式存储符号链接的数据(通常是文件名

Ext4有一个名为inline_data的文件系统选项,当在文件系统创建期间启用该选项时,它允许ext4执行内联。由于索引节点的大小有限,因此仅适用于非常小的文件。

我相信上面的方法是这里的另一个很好的答案是相同的技巧...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.