同一个文件可以用不同名字被提及,而一个指向文件的名字又可能根本没有对应目标。Linux的symlink(7)手册先介绍硬链接,再解释符号链接,把这两种看似矛盾的情况放回各自的引用关系中。[1] 阅读文件系统资料时,不能只看到“链接”二字,就假定它们保存了相同内容。

硬链接引用的是原文件名背后的对象。手册更精确地说明,每个硬链接都引用同一个inode编号;inode编号是索引,指向保存文件元数据的inode表。因此,对同一文件的改变,并不取决于这次用了哪一个硬链接名称。多个名称没有因此成为多份各自独立的文件内容。

符号链接自身则是一种特殊类型的文件,其内容是另一个文件的路径字符串。原文将它概括为指向另一个名字,而非指向底层对象。这样一来,理解某个符号链接时,既要分清这个链接自身,又要分清它写下的目标路径;两者在文件系统的名字空间中同时存在,名称相近也不会使它们成为同一对象。

可以用一个没有实际创建的纸面例子理解:甲、乙两个硬链接名都引用对象丙,所讨论的是同一对象的两个入口;另一份符号链接丁保存路径文字“某目录中的乙”,所讨论的则是丁内记录的另一个名字。这个示意只解释引用层次,没有给出命令或验证任何机器上的文件状态。

手册据此说明了文件系统边界。硬链接不能引用不同文件系统上的文件,因为inode编号并不在各个文件系统之间保持唯一;文档也说明硬链接不指向目录,以避免文件系统树中的循环。普通符号链接可以指向目录,也可以跨越文件系统边界。这里谈的是该Linux文档的对象关系,不能把一套名称直接扩成所有平台的实现保证。

符号链接还有一个重要条件:它所指的路径无需存在。目标路径不存在时,手册称其为dangling link,即悬空链接。于是,“链接文件存在”与“它写下的目标路径存在”需要分别描述。前者并不会自动替后者作答,看到一个链接名称也不足以证明当前已经能够到达目标。

本文采用Linux man-pages 6.19的普通链接定义及邻接说明。条目日期和HTML生成日期都不作为首次发布日期;特殊magic links、权限与命令行为不在采用范围。对于技术文档交接,明确是inode对象引用还是路径名字指针,能让跨文件系统、目录与悬空状态的解释保留同一个清楚起点。

信息来源

本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。