快速和慢速符号链接

Tim*_*Tim 5 symlink

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

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

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

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

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

    慢速符号链接作为文件本身是否有一个 inode 和一些作为目标路径的文件内容?

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

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

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

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

Cel*_*ada 7

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

是的

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

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

无论符号链接是快速符号链接还是慢速符号链接,此内容都是相同的。文件系统选择在其磁盘数据结构中存储该信息的方式和位置是一个实现细节,不会对此产生影响。

慢速符号链接作为文件本身是否有一个 inode 和一些作为目标路径的文件内容?

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

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

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

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

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

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

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

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

  • 对于像 ext[234] 这样的文件系统,您可以执行 `lstat()` 并检查 `stat.st_blocks` 是否为 0。对于短目标(< 60 字节),它将为 0,表示快速符号链接。对于较长的目标,它将非零(通常为 4)。`ls -s` 将显示 `st_blocks` 字段。 (3认同)
  • 除了 inode 可能指向也可能不指向“某个数据块”。如果内容足够短,它可以将内容直接嵌入到自身内部。或不。或者我们可能在谈论像 [jffs2](http://en.wikipedia.org/wiki/JFFS2) 或 [tmpfs](http://en.wikipedia.org/wiki/Tmpfs) 这样没有概念的文件系统类型首先是“数据块”,因为文件系统结构不是基于块的。所有这些都是实现细节,完全取决于每个文件系统实现者的心血来潮,只要呈现给内核的接口遵循 POSIX,就没有区别。 (2认同)