在什么情况下人们会想要使用硬链接而不是软链接?我个人从未遇到过想要使用硬链接而不是软链接的情况,并且我在搜索网络时遇到的唯一用例是删除重复的相同文件。
答案1
除了另一条评论中提到的备份使用(我相信还包括 BTRFS 卷上的快照)之外,软链接上的硬链接的用例是按标签排序的文件集合。 (不一定是创建集合的最佳方法,数据库驱动的方法可能更好,但对于相当稳定的简单集合来说,这还不错。)
一种媒体集合,其中所有文件都存储在一个平面目录中,并根据各种标准(即年份、主题、艺术家、流派等)分类到其他目录中。这可以是个人电影集合,也可以是商业工作室的集体集合作品。基本上完成了,文件被保存,不太可能被修改,并被排序,可能通过链接存储到多个位置。
请记住,“原始”和“副本”的概念不适用于硬链接:指向文件的每个链接是原件,不存在通常意义上的“复制品”。然而,对于用例的描述,这些术语模仿了行为的逻辑。
“原始”保存在“目录”目录中,排序后的“副本”硬链接到这些文件。排序目录上的文件属性可以设置为 r/o,以防止对文件名和排序结构进行任何意外更改,而目录目录上的属性可以设置为 r/w,以便根据需要进行修改。 (这种情况是音乐文件,其中一些播放器尝试根据嵌入在媒体文件中的标签、用户输入或互联网检索来重命名和重新组织文件。)此外,由于“复制”目录的属性可能与在“原始”目录中,排序后的结构可以以受限的访问权限提供给组或世界,而主“目录”只能由具有完全访问权限的主要用户访问。然而,文件本身在指向该 inode 的所有链接上始终具有相同的属性。 (可以探索 ACL 来增强这一点,但不是我的知识领域。)
如果原始文件被重命名或移动(例如,单个“目录”目录变得太大而无法管理),则硬链接仍然有效,而软链接将被破坏。如果“副本”被移动并且软链接是相对的,那么软链接将再次被破坏,而硬链接则不会。
注意:当涉及软链接时,不同工具报告磁盘使用情况的方式似乎不一致。然而,对于硬链接,它似乎是一致的。因此,目录中的 100 个文件被分类为“标签”集合,很容易就有 500 个链接的“副本”。 (对于照片集,例如日期、摄影师和平均 3 个“主题”标签。)例如,Dolphin 会报告硬链接为 100 个文件,如果使用软链接则报告为 600 个文件。有趣的是,无论哪种方式,它都会报告相同的磁盘空间使用情况,因此它看起来像是软链接的小文件的大集合,以及硬链接的大文件的小集合。
这种类型的用例需要注意的是,在使用 COW 的文件系统中,修改“原始”可能会破坏硬链接,但不会破坏软链接。但是,如果目的是在编辑、保存和排序后获得主副本,COW 不会进入该场景。
答案2
当您不想绑定两个文件的存在时,硬链接非常有用。考虑一下:
touch a
ln -s a b
rm a
现在b
已经没用了。 (这些步骤可能相距很远,由不同的人完成,等等)
而使用硬链接时,
touch a
ln a b
rm a
b
仍然存在且正确。
在许多情况下这很有用。常见的一种是重复数据删除:
- 在文件系统内,例如在您的主目录中,重复数据删除工具可以用硬链接替换副本;这保留了两个文件的一些“独立性”,因为仍然可以删除一个文件而不影响另一个文件,但这确实意味着对一个文件的更改将在另一个文件中可见(除非进行更改的工具使用“保存”到新文件并重命名”策略)
- 在备份系统中,硬链接通常用于维护多个快照:如果每天备份给定文件,备份系统可以硬链接所有副本(但不是原始版本),这减少了空间需求,同时仍然确保每个快照在文件系统级别是自支持的。
另一个用例是使文件在其他位置可用。例如,如果您有一个在“开发”位置维护的脚本,您可能希望将其硬链接到路径上的某个位置;这可以确保即使您将脚本从开发目录中删除,该脚本仍然可用。 (但是,在这种情况下有许多注意事项;您可能会发现在路径中“安装”特定版本或使用符号链接更合适。)
答案3
单个程序可能会根据其启动名称来改变其行为:
$ ls -li `which pgrep` `which pkill`
208330 -r-xr-xr-x 2 root bin 19144 Jul 26 2016 /usr/bin/pgrep
208330 -r-xr-xr-x 2 root bin 19144 Jul 26 2016 /usr/bin/pkill
哪个在来源是通过类似的东西决定的
if (strcmp(__progname, "pgrep") == 0) {
action = grepact;
pgrep = 1;
} else {
action = killact;
尽管具体细节会根据所涉及的操作系统和语言而有所不同。
这使得(大部分)相同的代码不必编译成两个(大部分)相同的二进制文件。请记住,unix 的磁盘空间非常昂贵,尽管根据 Stevens 在 APUE 第 4 章中的说法,BSD4.2(1983)中实现了符号链接以取代硬链接的各种限制。检查符号链接名称是否用作程序名称的测试程序可能如下所示:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
printf("called as '%s'\n", *argv);
exit(0);
}
并通过测试:
$ cc -o myname myname.c
$ ln -s myname alias
$ ./myname
called as './myname'
$ ./alias
called as './alias'
$
答案4
文件系统是一种简单而有效的文件组织和分类方式(这是它们存在的主要原因)。硬链接在这方面允许更高程度的灵活性。
如前所述,在处理硬链接时没有原始和副本的概念,所有目录条目(硬链接)只是对文件存在(指向其索引节点)的引用,没有优先级,因此也不存在损坏的硬链接。 。
所以这里有一些用例硬链接参加但软链接没有:
想象一下,您有一系列电影、音乐或其他媒体,并且希望应用不同的分类标准,例如按分支中的艺术家分类的歌曲(每个艺术家都有自己的子目录);按流派在另一个分支中(每个在不同的子目录中)等。您仍然不想复制文件,也不想决定将“原始文件”放在哪里,这样您就可以自由地重新分类,而不必“管理”并在移动时重新链接文件以避免链接损坏。
另一个原因是避免浪费存储空间,而存储空间需要拥有同一文件的多个副本,同时允许
chroot
系统调用从“主”文件系统根中的文件子集受益(符号链接永远不能引用外部文件)沙chroot
箱,即使它们具有相对路径)。硬链接存在的另一个非常重要但很少提及的原因是
..
子目录。这些..
目录实际上是(在大多数 unix fs 实现中)到父目录的硬链接,如果没有硬链接,则必须以完全不同的方式实现,而硬链接的存在使得这很容易实现。