为什么 /bin 中混合存在符号链接和硬链接?

为什么 /bin 中混合存在符号链接和硬链接?

我理解符号链接和硬链接之间的技术差异,这是关于它们在实践中使用的问题,特别是我很好奇为什么两者都在看似相似的条件下使用:目录/bin

这是我的系统上列出的一个片段:

~$ ls -lai /bin
total 10508
32770 drwxr-xr-x  2 root root    4096 Jun 14 11:47 .
    2 drwxr-xr-x 28 root root    4096 Sep  6 13:15 ..
  119 -rwxr-xr-x  1 root root  959120 Mar 28 22:02 bash
   2820 -rwxr-xr-x  3 root root   31112 Dec 15  2011 bunzip2
  127 -rwxr-xr-x  1 root root 1832016 Nov 16  2012 busybox
   2820 -rwxr-xr-x  3 root root   31112 Dec 15  2011 bzcat
 6191 lrwxrwxrwx  1 root root       6 Dec 15  2011 bzcmp -> bzdiff
 5640 -rwxr-xr-x  1 root root    2140 Dec 15  2011 bzdiff
 5872 lrwxrwxrwx  1 root root       6 Dec 15  2011 bzegrep -> bzgrep
 3520 -rwxr-xr-x  1 root root    4877 Dec 15  2011 bzexe
 6184 lrwxrwxrwx  1 root root       6 Dec 15  2011 bzfgrep -> bzgrep
 5397 -rwxr-xr-x  1 root root    3642 Dec 15  2011 bzgrep
   2820 -rwxr-xr-x  3 root root   31112 Dec 15  2011 bzip2
 2851 -rwxr-xr-x  1 root root   10336 Dec 15  2011 bzip2recover
 6189 lrwxrwxrwx  1 root root       6 Dec 15  2011 bzless -> bzmore
 5606 -rwxr-xr-x  1 root root    1297 Dec 15  2011 bzmore

我将硬链接缩进到同一索引节点以获得更好的可见性。那么,在bzcmp, ,的情况下使用符号链接,在bzegrep, ,的情况下使用硬链接吗?bzfgrepbzlessbzip2bzcatbunzip2

它们都是常规文件(不是目录),驻留在一个文件系统中,是系统实用程序,甚至是为处理同一件事而设计的:bzip 存档。在这种特殊情况下使用硬链接/符号链接的原因纯粹是历史原因还是我遗漏了什么?

澄清我的问题:

我是不是询问:

  • 符号链接和硬链接之间的技术差异
  • 理论上它们各自的优点和缺点

这些问题已在 SO 的其他线程中得到解决。我试图理解为什么在特定情况下做出不同的决定:对于一组相关的系统实用程序。从技术上讲,它们都可能是符号链接,也可能都是硬链接,这两种选项都可以工作(并且在这两种情况下,程序仍然可以弄清楚它是如何通过 调用的argv[0])。我想了解这里的意图(如果有的话)。

有关的:

答案1

为什么使用硬链接与符号链接

在这种情况下,使用硬链接相对于符号链接主要有 3 个优点。

硬链接

  1. 对于硬链接,链接直接指向 inode。
  2. 硬链接就像拥有可执行文件的多个副本,但仅使用其中一个的磁盘空间。
  3. 您可以重命名硬链接的任一分支,而不会破坏任何内容。

符号链接

  1. 该链接指向该对象(然后该对象又指向 inode)。
  2. 它们可以跨越文件系统,而硬链接则不能。

一般链接的优点

这些链接之所以存在,是因为许多可执行文件根据调用方式的不同而表现不同。例如,这 2 个命令bzlessbzmore实际上是一个可执行文件,bzmore.可执行文件的行为会有所不同,具体取决于调用它的名称。

这样做的原因有多种。以下是一些比较明显的:

  1. 开发单个可执行文件比开发多个可执行文件更容易
  2. 节省磁盘空间
  3. 更容易部署

为什么两者都被使用?

在这个特定的应用中,选择哪一个都是没有意义的。两者都可以促进充当别名的功能,以便可以重载单个可执行文件。这确实是这里各种程序的开发人员正在利用的关键功能。

在看着FHS(文件系统层次结构标准)甚至以这种方式指定它,它可以是其中之一。

摘抄

如果 /bin/sh 不是真正的 Bourne shell,则它必须是指向真实 shell 命令的硬链接或符号链接。

其背后的基本原理是因为 sh 和 bash 的行为方式可能不一定相同。使用符号链接还可以让用户轻松看出 /bin/sh 不是真正的 Bourne shell。

...

...

如果gunzip 和zcat 程序存在,它们必须是gzip 的符号链接或硬链接。 /bin/csh 可能是 /bin/tcsh 或 /usr/bin/tcsh 的符号链接。

参考

答案2

您似乎试图从现有实践中找出是否存在非技术规则来告诉您要使用哪种链接。 (我说非技术因为您已经知道使用其中一种而不是另一种的技术原因。)

答案是,没有其他规则。您从 Ubuntu 软件包中指出的这个例子bzip2只是表明许多开发人员在没有经过深思熟虑的情况下将它们混合在一起。这是因为除了技术差异之外,没有强有力的指导,而且这些差异很小。

就我个人而言,我总是更喜欢使用符号链接,因为我愿意为它们的微小开销付出代价,以换取它们的自记录性质。

其他开发人员会选择硬链接,因为它们提供的效率微乎其微。

这个问题很像空格与制表符或者动态类型与静态类型或者Emacs 与 vi,但它不够有趣,不足以引发圣战。就像更有趣的战斗一样,选择任一选项都有理由,但除非有人告诉你使用哪一个,否则你必须选择对你来说更有意义的一个。

相关内容