我知道什么是硬链接但我为什么要使用它们呢?硬链接有什么用处?
答案1
硬链接的主要优点是,与软链接相比,没有大小或速度损失。软链接是正常文件访问之上的额外间接层;当您打开文件时,内核必须取消引用链接,这需要少量时间。该链接还占用磁盘上的少量空间来保存链接的文本。硬链接不存在这些惩罚,因为它们内置于文件系统的结构中。
据我所知,看到这一点的最好方法是:
$ ls -id .
1069765 ./
$ mkdir tmp ; cd tmp
$ ls -id ..
1069765 ../
该-i
选项使其ls
为您提供索引节点号文件的。在我准备上面示例的系统上,我碰巧位于 inode 编号为 1069765 的目录中,但具体值并不重要。它只是标识特定文件/目录的唯一值。
这说明的是,当我们进入子目录并查看不同的文件系统条目称为..
,它具有与我们之前获得的相同的索引节点号。这种情况不会发生,因为 shell 正在..
为您进行解释,就像 MS-DOS 和 Windows 中发生的情况一样。在 Unix 文件系统上..
是一个真实的目录条目;它是一个指向上一个目录的硬链接。
硬链接是将文件系统的目录连接在一起的筋。曾几何时,Unix 没有硬链接。添加它们是为了改变 Unix 的原始版本平面文件系统进入分层文件系统。
(有关这方面的更多信息,请参阅为什么“/”有一个“..”条目?.)
在 Unix 系统上,由同一个可执行文件实现多个不同的命令也很常见。在 Linux 上似乎不再是这种情况,但在我过去使用的系统上,cp
、mv
和rm
都是相同的可执行文件。如果您考虑一下,这是有道理的:当您在卷之间移动文件时,它实际上是一个副本,然后是删除,因此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
您可以看到bunzip2
,bzcat
并且bzip
都使用相同的 inode。本质上,它是一个具有三个名称的文件。你可以有该文件的三份副本,但为什么呢?它只会不必要地消耗磁盘空间。