不同 inum 的文件可以硬链接吗?

不同 inum 的文件可以硬链接吗?

我是一名新的 Linux 用户,正在学习 Arch Linux 和最近的 Linux From Scratch (7.7)。我设置了新安装的 AL 作为我的 LFS 主机;我手动(也使用提供的bash脚本)检查了我的主机上的必备包。就我而言,我确信我解决了除了将 /usr/bin/yacc 链接到 /usr/bin/bison 之外的所有差异。

提供的脚本结果为yacc is bison (GNU Bison) 3.0.4,而不是/usr/bin/yacc -> /usr/bin/bison。因为后者是检查符号链接的输出格式,所以我认为脚本告诉我 yacc 已准备就绪,但使用了不同类型的链接。我研究了更多有关 Linux 文件系统的信息,并粗略地了解了实际数据是由索引节点(元数据)描述的,而索引节点又由我们与之交互的(抽象)文件所指向。简单地指向相同 inode 的文件被视为硬链接(尽管,我认为这些文件是彼此独立的)。我运行sudo ls -il /usr/bin | less并发现 yacc 和 bison 的 inode 编号略有不同(分别为 152077 和 152078)。这是否意味着它们没有硬链接,或者我是否误解了脚本输出并需要修复?

编辑:bash 脚本中的相关命令:

bison --version | head -n1

if [ -h /usr/bin/yacc ]; then
  echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
elif [ -x /usr/bin/yacc ]; then
  echo yacc is `/usr/bin/yacc --version | head -n1`
else
  echo "yacc not found" 
fi

答案1

当您执行此操作时ls -il /usr/bin,您列出了文件名和匹配的索引节点号。在这种情况下,最好将“文件名”与“索引节点”分开,并将索引节点视为文件。

“inode”通常是包含元数据(权限、所有权、创建时间、访问时间等)和包含文件数据的磁盘块的磁盘数据结构。根据文件系统的不同,索引节点可以策略性地位于磁盘周围,或者存在于某种数据库中。大多数时候,有一种快速算法可以从 inode 编号到 inode 所在的磁盘块,因此查找速度相当快。

从这个角度来看,每个文件名只是一个“硬链接”。目录只是匹配文件名和索引节点号。 “真实文件名”和“硬链接”之间没有区别。因此,您的文件名/usr/bin/yacc/usr/bin/bison与不同的索引节点号匹配意味着这两个名称引用不同的元数据和不同的文件数据。随意地说,这些文件并不是硬链接,因为只有一个文件名与两个 inode 中的每一个相匹配,但从技术意义上讲,两个文件名都是硬链接,它们每个都只是到 inode 的单个硬链接。

就您的脚本和“几乎相同的索引节点号”而言,yaccbison是相关的。在我的 Arch 笔记本电脑上:

1032 % ls -li /usr/bin/yacc /usr/bin/bison
1215098 -rwxr-xr-x 1 root root 394152 Jan 23  2015 /usr/bin/bison*
1215097 -rwxr-xr-x 1 root root     41 Jan 23  2015 /usr/bin/yacc*
1033 % file /usr/bin/yacc
/usr/bin/yacc: POSIX shell script, ASCII text executable
1034 % cat /usr/bin/yacc
#! /bin/sh
exec '/usr/bin/bison' -y "$@"

文件名yaccbison标识 inode 号只有一个分开,可能是因为它们是一个接一个创建的。文件名yacc不代表符号链接或硬链接。符号链接在输出中的显示方式不同ls -li,两个硬链接各自代表相同的索引节点号。

yacc与之相关的是bison,它是一个调用bison.这就是为什么你的脚本给出如下输出:

bison (GNU Bison) 3.0.4
yacc is bison (GNU Bison) 3.0.4

您的脚本调用/usr/bin/yacc实际上只是执行/usr/bin/bison.

答案2

如果两个文件具有不同的索引节点号,则它们不会被硬链接。这就是硬链接的定义 - 它是文件系统中不同位置(不同名称或不同目录)的相同文件(因此包括 inode 号的相同元数据)。

Bison 是 yacc 的一个实现。更准确地说,bison -y模拟 POSIX yacc。您可以将 yacc 的不同实现作为/usr/bin/yacc.就你而言,看起来你安装了 Bison 两次,一次是 as ,/usr/bin/yacc一次是 as /usr/bin/bison。它们可能是以相同的方式建造的,也可能不是。检查您的构建脚本。

在 dash、ksh 或 bash 中,您可以使用 来[ /usr/bin/yacc -ef /usr/bin/bison ]测试/usr/bin/yacc和是否/usr/bin/bison是同一个文件(即它们是通向同一文件的硬链接的符号链接链(可能长度为 0))。

相关内容