这是关于通用 UFS。
据我了解,当给出绝对路径(例如/home/userU/file.txt
:)时,每个目录和文件都会访问磁盘。因此,在这种情况下,磁盘被访问 4 次
1 为/
, 1 为home/
, 1 为/userU
, 1 为file.txt
我的问题是
- 如果给出一个硬链接
/hL
,指向上面文件的inode,访问磁盘的顺序是什么? - 如果给出一个软链接
/sL
,指向上面的文件,访问磁盘的顺序是什么?
假设在所有三种情况下最初都没有缓存任何 inode 或任何其他数据。
背景
假设我们有以下目录设置:
现在让我们看看你的2个问题。
问题
对于硬链接,它们拥有与它们指向的原始文件/目录相同的 inode 引用。所以没有额外的硬盘访问来读取它们。
例如:
对比
这两个之间的唯一区别是名称。因此,任一路径都会产生相同数量的 HDD 访问。
然而,对于软链接,还有一个额外的 HDD 访问。这种额外的访问将针对文件
sL
所在目录的元数据。然后这将返回详细信息,说明该文件实际上是一个符号链接,并且它指向另一个文件/目录。例如:
在这里,我们可以看到它的类型为“符号链接”,并且指向
afile.txt
. 还要注意它有一个不同的 inode(681295 与 667668),进一步证明它需要额外读取。那么什么是读命令呢?
如果您使用
strace
针对这些文件/目录运行命令的 Bash shell 本身,您可以了解事情是如何工作的。这是命令的输出
more /tmp/adir/hL
。对于
/tmp/adir/hL
:对于
/tmp/adir/sL
:更多详细信息
符号链接上的维基百科页面也避开了所有这些:
参考
这两个问题其实都是一个问题:“How
path_resolution
works?”,所以从这个角度来看整个过程。从PATH_RESOLUTION(7)我们读到:
然后我们看到第一步对于硬链接和符号链接都是通用的(系统决定路径解析的起点是什么:根目录
/
、chrooted 目录或当前目录)。正如我们看到的硬链接和符号链接之间的起点没有区别。但是,当开始走这条路时,下一步确实会出现差异:
正如描述所示,文件和硬链接的路径解析没有区别 - 过程是相同的。那么符号链接呢?我们进一步阅读:
如上所述,符号链接解析需要额外的磁盘访问操作,所以回答这两个问题:
和
我们可以得出结论,硬链接访问与普通文件访问没有区别,但符号链接解析需要额外的磁盘访问操作,即符号链接解析。
补充阅读: