快速和慢速符号链接

快速和慢速符号链接

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

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

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

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

    快速符号链接作为文件本身,实际上只有一个 inode 而没有文件内容吗?

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

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

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

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

  4. 当符号链接有文件内容时,显示符号链接内容的命令是什么? (这样,如果快速符号链接没有文件内容而慢速符号链接有,我们可以验证这一点。)

答案1

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

是的

快速符号链接作为文件本身,实际上只有一个 inode 而没有文件内容吗?

取决于你所说的“包含文件内容”是什么意思。没有符号链接包含文件内容,因为你无法open()read()它们获取文件内容。但是你引用的文本暗示了“该文件包含对链接目标的文本引用”。所以,是的,该文本引用可以被视为文件的“内容”。

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

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

从同样的角度来看,是的!

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

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

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

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

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

当符号链接有文件内容时,显示符号链接内容的命令是什么? (这样,如果快速符号链接没有文件内容而慢速符号链接有,我们可以验证这一点。)

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

答案2

从链接的索引节点维基页面:

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

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

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

如上所述,ls -i可以为您提供索引节点号 - 这可能是链接所在的位置。ls -l将为您提供到达链接目标的路径。后者将需要stat()系统调用,但是,因为文件的目录列表 - 它的目录项- 将包含其索引节点号和文件名,形式ls -i可能不会。至少,根据文件系统的不同,stat()除了包含的目录之外,它可能不需要任何文件对象。

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

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

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

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

链接怎么可能是快速地一?来自相同的链接维基页面:

内联

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

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

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

我相信这里的另一个优秀答案指的是上述方法同样的伎俩...

相关内容