如何在Linux中有效跟踪硬链接?

如何在Linux中有效跟踪硬链接?

软链接很容易追踪到原始文件readlink等...但我很难追踪到原始文件的硬链接。

$ ll -i /usr/bin/bash /bin/bash  
1310813 -rwxr-xr-x 1 root root 1183448 Jun 18 21:14 /bin/bash*  
1310813 -rwxr-xr-x 1 root root 1183448 Jun 18 21:14 /usr/bin/bash*
                   ^

上面的内容符合预期 - 很酷 - >两个文件都指向相同的 inode 1310813
(但是由 表示的链接数量^显示为 1。从 Gilles 的回答中可以理解其原因)

$ find / -samefile /bin/bash 2>/dev/null
/usr/bin/bash

上面是预期的 - 所以没有问题。

$ find / -samefile /usr/bin/bash 2>/dev/null
/usr/bin/bash  

上面是不是凉爽的。如何追踪原始文件或每个硬链接使用该/usr/bin/bash文件作为参考?

奇怪 - 下面也没有帮助。

$ find / -inum 1310813 2>/dev/null
/usr/bin/bash

答案1

首先,硬链接的情况下没有原始文件;所有硬链接都是平等的。

ls -l但是,这里不涉及硬链接,如输出中的链接计数 1 所示:

$ ll -i /usr/bin/bash /bin/bash  
1310813 -rwxr-xr-x 1 root root 1183448 Jun 18 21:14 /bin/bash*  
1310813 -rwxr-xr-x 1 root root 1183448 Jun 18 21:14 /usr/bin/bash*

您的问题是由于符号链接而出现的,该bin符号链接指向usr/bin.寻找bash所有可用的路径,您需要find使用以下选项告诉遵循符号链接-L

$ find -L / -xdev -samefile /usr/bin/bash 2>/dev/null
/usr/bin/rbash
/usr/bin/bash
/bin/rbash
/bin/bash

我在这里使用是-xdev因为我知道您的系统安装在单个文件系统上;这可以避免陷入/dev/proc、等/run/sys

答案2

如何使用 /usr/bin/bash 文件作为参考来跟踪原始文件或每个硬链接

find使用 GNU find (或具有该选项的任何其他版本-samefile),并假设/usr/bin/bash位于/文件系统上,这是正确的:

find / -xdev -samefile /bin/bash

使用-xdev硬链接是因为硬链接不能跨越文件系统边界。不要重定向错误:如果您没有权限遍历目录,则该目录下可能存在硬链接,您会错过它。

您所犯的错误是您正在寻找另一个不存在的硬链接。您实际上拥有知道它不存在的信息:

1310813 -rwxr-xr-x 1 root root 1183448 Jun 18 21:14 /bin/bash*
                   ^

的硬链接计数为/bin/bash1。

有一个文件,/其中与/usr/bin/bash.该文件/bin/bash/usr/bin/bash由于不同的原因目录 /bin/usr/bin是同一个文件。由于find / -samefile /bin/bash指向/usr/bin/bash,因此/bin具有到 的符号链接/usr/bin。更准确地说,根据问题中的信息,并假设这/bin不是目录硬链接(支持不良、很少使用的功能),我们知道这/bin是一个解析为的符号链接/usr/bin;它可能是指向另一个符号链接的符号链接,依此类推,最终解析为/usr/bin某个等效路径,例如///////usr/bin/,但很可能它是一个目标为 的符号链接/usr/bin

查找整个系统上某个文件的所有符号链接并不是特别有效。例如,在 Linux 上,有一个文件是每个正在运行 bash 的进程的/proc/*/exe符号链接/usr/bin/bash(或)。/bin/bash如果您查找目录的符号链接,您最终将陷入无限递归,例如指向/proc/*/root/除了 chrooted 进程)。

如果您需要知道两个路径是否指向同一个文件,在 Linux 上,您可以使用以下任一方法

[ /bin/bash -ef /usr/bin/bash ]
test /bin/bash -ef /usr/bin/bash

-ef不是 POSIX,但它在 dash、bash、BusyBox 和 GNU coreutils 中)。如果您需要获取文件的规范路径,从某种意义上说,不同的文件始终具有不同的规范名称,您可以使用

readlink -f /bin/bash

(这可能会丢失通过挂载目录相等的文件,例如,如果以两种不同的方式挂载相同的网络位置。)

相关内容