什么时候创建硬链接有用?


11

硬链接基本上有两个主要限制:

  1. 硬链接通常要求链接和文件位于同一文件系统中。
  2. 只有超级用户才能创建到目录的硬链接。

因此,引入了符号链接来绕开硬链接的限制。因此,问题是,仍然需要硬链接吗?可能在某些情况下它们更有用吗?


3
1)一些HTTP服务器没有跟随符号链接2)硬链接可用于备份3)您可以在chroot之间共享unix套接字4)您可以删除任何版本的硬链接而不会影响其他版本
Dietrich Epp

那些HTTP服务器可以使用指向符号链接的硬链接吗?,还是我在胡说八道?
arana

Answers:


11

硬链接可以帮助我们以更加灵活的方式组织文件系统。基本上,硬链接使我们可以获取一个文件,并一次将其放置在文件系统中的多个位置。考虑一下您是摄影师并且有很多照片的情况(这是我一生的例子!)。您可能会按照出现在其中的人来组织它们,因为有时人们会要求您提供它们的照片。但是您可能还想按位置和日期来组织它们。没有嵌套这三件事的真正方法,它们是完全独立的组织机构。因此,您可以为这三种不同的事物创建三个不同的层次结构,并将每张照片都呈现在这三个之中,而无需每张照片必须存储三遍。这就是硬链接的魔力。取消符号链接的链接,我们不必担心“真实文件”在哪里,因为它们都是真实文件。我们可以随意删除和移动,因为文件将一直保留到不再有对其的引用为止,并且在删除最后一个硬链接时将其删除。它很简单,不需要您经常跟踪。


1
或者,一个可能有一个程序,一个想通过三个名字来调用gzipgunzipzcat
JdeBP

8

直到所有硬链接(是的,所有文件名都是硬链接,甚至是第一个硬链接)都被删除并且文件关闭后,才会清除文件的内容。这样,当在多个位置需要一个文件但在任何时候都可以将它们从任何位置删除时,例如在~/Downloads/coolsong.mp3和之间,它可能会很有用~/Music/Cool Song.mp3


3
没错 当我在干净的Movie文件夹中拥有正确命名的文件时,我用它来继续播种torrent。这比移动和重命名要播种的文件要容易得多,完成播种后,我可以简单地删除torrent文件夹。这也是Couch Potato的做法。
Nicolas Bouliane 2014年

1

硬链接相对于符号链接的一个不是很重要的优势是,当硬链接到达硬链接的索引节点时,内核无需进行任何进一步的处理即可访问文件。遇到符号链接时,内核必须读取链接值并继续遍历目录结构,然后再到达文件的索引节点。尽管并不一定很容易测量出差异,但是这花费了更长的时间。当symlink值上的元素之一本身是symlink时,它将变得非常有趣。


优点。在Solaris中,可以使用符号链接创建循环,其处理更加有趣:-)

1

硬链接有几个原因

  1. 保留对文件的引用,直到最后一个引用消失(如Ignacio指出)
  2. 硬链接文件时,它们仅占用文件系统中一个文件的空间(两个文件引用共享相同的i节点)。因此,硬链接必须位于同一文件系统上。

因此,使用硬链接的一个原因是可能节省大量空间...

您可以附加到任何一个引用,数据就会进入共享文件。您还可以在读取另一个文件描述符时追加到另一个文件描述符(例如,使用tail -f)


0

此处给出的许多示例都是有效的,但与软链接(例如“在多个位置需要一个文件”问题)同样可以很好地工作。

备份软件Dirvish可以很好地说明硬链接的实际帮助:

Dirvish是一种快速的,基于磁盘的旋转网络备份系统。

借助Dirvish,您可以维护一组完整的文件系统映像,并且无人参与的创建和到期。分散的备份保险库就像是一台用于数据的时间机器。

Dirvish通过将文件复制到单独的(备份)文件系统(例如USB硬盘)来在文件系统级别创建备份(即,它复制文件,不创建映像)。每次进行备份时,Dirvish都会创建要保存的目录树的单独完整副本。

诀窍是,如果Dirvish检测到您要保存的树已经存在较旧的备份副本,则它将通过在新树中创建到旧树中文件的硬链接来自动重用未更改的文件。

这样,每个备份副本都是目录树的完整,独立的副本,但是同时,只有更改过的文件实际上会占用文件系统中的空间。换句话说,您可以同时享受增量备份(节省空间)和完整备份(轻松检索)的好处。

这仅是可能的,因为硬链接对用户空间工具是完全透明的。

这可能也适用于符号链接(尽管在备份使用符号链接本身的数据时会遇到问题),但是硬链接唯一可能的优点是:

如果要丢弃旧的备份,只需删除相应的备份目录树即可。仅从该树链接的文件会被文件系统自动删除(因为它们的最后一个硬链接已删除),但是也出现在其他副本中的文件仍保留在磁盘上。


听起来像rsnapshot。
伊格纳西奥·巴斯克斯

0

一个有用的情况是,例如,当您有一个程序(或脚本)需要下载大的临时tarball时,解压缩后,您的程序会立即将其删除。

如果出于某种原因想要保留该tarball以供将来使用,则最好的方式ln /tmp/tarball.tgz ~是在仍然下载tarball的同时。然后,您无需执行任何操作。

下载完成后,甚至在程序删除了“原始”文件之后,确切的副本仍应位于主目录中。


0

我使用“硬链接”来备份一些“ HowTos”和代码段

我的用户/根目录中有一个名为“共享文档”的目录。在该目录中,我有“硬链接”指向我的技巧,窍门,代码片段,howto,这些都存在于相应的目录中。php,mysql,css,regex,公式,linux等,将它们放在“一个地方”可以轻松使用,更新它们,而不必在我的Documents /目录中四处寻找经常使用的这些文件。

很久以前,我使用了符号链接。我会如实地将这个通用的“共享文档”目录备份到我的服务器上。问题是符号链接或“软链接”,如果被复制(cp -auv)或tar和被复制掉,则仅备份或复制“链接”而不是文档内容。因此,我必须遍历目录并从其实际位置复制2打文件中的每一个。

使用HARD LINKS,我可以复制,tar,rsync'Shared Docs'目录,然后放心地备份那些分散的文档,实际上是在备份内容。当我意识到我一直在备份0 bit'link files'而不是信息时,这真的让我很吃力。

使用“硬链接”的缺点是,在目录上执行ls并不能指示您文件已与另一个文件“链接”或该文件可能共存。有很多方法可以找到它们,但我说的不是简单的ls -l->指向...。因此,我通常在文档的开头添加一个注释,指明该文件的目录/文件与“共享”

兰迪斯。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.