为什么存在硬链接?

为什么存在硬链接?

我知道什么是硬链接但我为什么要使用它们呢?硬链接有什么用处?

答案1

硬链接的主要优点是,与软链接相比,没有大小或速度损失。软链接是正常文件访问之上的额外间接层;当您打开文件时,内核必须取消引用链接,这需要少量时间。该链接还占用磁盘上的少量空间来保存链接的文本。硬链接不存在这些惩罚,因为它们内置于文件系统的结构中。

据我所知,看到这一点的最好方法是:

$ ls -id .
1069765 ./
$ mkdir tmp ; cd tmp
$ ls -id ..
1069765 ../

-i选项使其ls为您提供索引节点号文件的。在我准备上面示例的系统上,我碰巧位于 inode 编号为 1069765 的目录中,但具体值并不重要。它只是标识特定文件/目录的唯一值。

这说明的是,当我们进入子目录并查看不同的文件系统条目称为..,它具有与我们之前获得的相同的索引节点号。这种情况不会发生,因为 shell 正在..为您进行解释,就像 MS-DOS 和 Windows 中发生的情况一样。在 Unix 文件系统上..是一个真实的目录条目;它是一个指向上一个目录的硬链接。

硬链接是将文件系统的目录连接在一起的筋。曾几何时,Unix 没有硬链接。添加它们是为了改变 Unix 的原始版本平面文件系统进入分层文件系统。

(有关这方面的更多信息,请参阅为什么“/”有一个“..”条目?.)

在 Unix 系统上,由同一个可执行文件实现多个不同的命令也很常见。在 Linux 上似乎不再是这种情况,但在我过去使用的系统上,cpmvrm都是相同的可执行文件。如果您考虑一下,这是有道理的:当您在卷之间移动文件时,它实际上是一个副本,然后是删除,因此mv已经必须实现其他两个命令的功能。可执行文件可以确定要提供哪个操作,因为它传递了调用它的名称。

嵌入式 Linux 中常见的另一个例子是忙碌盒,单个可执行文件实现许多命令。

我应该指出,在大多数文件系统上,不允许用户建立目录的硬链接。.和条目..由文件系统代码自动管理,文件系统代码通常是内核的一部分。存在该限制是因为如果您不小心创建和使用目录硬链接,则可能会导致严重的文件系统问题。这是软链接存在的众多原因之一;他们不承担同样的风险。

答案2

硬链接的一种非常有用的用法是与 rsync 结合进行增量备份。它节省了大量空间,并使恢复过程非常简单。我使用这种方法在我的服务器中进行备份。

花一些时间阅读这个解释

答案3

有多种用途。我用它们来创建基于文件的锁。与大多数其他系统调用不同,link(2) 系统调用是原子的。

另一个用途是在 rsnapshot 中,其中使用硬链接随着时间的推移进行备份,以减少磁盘空间量。如果文件未更改,则该文件将硬链接到该文件的旧实例,已更改的文件将被重新复制。

我还使用它们来交换服务器上的配置文件:rm file.cfg && ln ~/tmp/file.cfg file.cfg,然后可以安全地删除 ~/tmp/* 文件。

答案4

如果在阅读该维基百科页面后您的问题是“我为什么要使用它们”那么您不明白什么是硬链接。

A关联是指向磁盘上块的目录项。换句话说,系统上的每个文件都至少有一个链接。当您rm创建文件时,实际的系统调用是unlink().它删除目录条目。磁盘上的块没有改变,但链接消失了,因此文件从目录列表中消失了。

您个人可能从未使用过硬链接,但它们遍布您的系统。例如:

$ ls -li /bin | grep 53119771
53119771 -rwxr-xr-x 3 root root  26292 2010-08-18 10:15 bunzip2
53119771 -rwxr-xr-x 3 root root  26292 2010-08-18 10:15 bzcat
53119771 -rwxr-xr-x 3 root root  26292 2010-08-18 10:15 bzip2

您可以看到bunzip2bzcat并且bzip都使用相同的 inode。本质上,它是一个具有三个名称的文件。你可以有该文件的三份副本,但为什么呢?它只会不必要地消耗磁盘空间。

相关内容