如标题所示,我想知道由命令ln创建的硬链接和软链接之间的区别。命令man ln确实提供了信息,但不能完全回答我的问题。

此外,如果有人可以提供一种设置,使硬链接比符号链接更可取,那就太好了。

评论

差异之一...您有一些文件,例如文件测试。如果您使ln测试硬链接,使ln -s测试符号链接,然后将文件测试移动到其他目录(或重命名),则符号链接将无法工作。硬链接将起作用。现在尝试删除文件测试。硬链接仍然可以使用,实际上,您仍然可以访问文件,直到与文件的硬链接数量不为0。这是由于inode的原因,它是用手册编写的...

我重新打开了它,因为它在此问题上值得一个很好的通用答案(与先前的问题是一个晦涩的C示例不同)。

最佳答案:youtube.com/watch?v = aO0OkNxDJ3c

也很完整的答案:stackoverflow.com/questions/185899/…

@AbhishekBhatia该视频不可用

#1 楼

在Linux / Unix中,快捷方式称为链接


链接有两种类型:软链接(符号链接)或硬链接。



软件链接(符号链接)

您可以建立文件和目录的链接,并且可以在不同的分区上创建链接(快捷方式),并且其inode编号与原始目录不同。 />
如果删除了真实副本,则该链接将不起作用。


硬链接仅适用于文件;您不能链接到具有不同inode编号的其他分区上的文件。

如果删除了真实副本,则该链接将起作用,因为它会访问该真实副本正在访问的基础数据。 br />


问题:如何制作软链接?

答案:ln -s可以建立软链接;首先,您需要定义源,然后再定义目标。 (请记住,您需要定义源和目标的完整路径;否则它将不起作用。)

 sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib32/libGL.so.1
             (----------Source-------)             ( Destination )




如您所见,它具有不同的索引节点,并且可以在不同的分区上进行创建。


问题:如何制作硬链接?

答案:A可以使用ln进行硬链接;首先,您需要定义源,然后需要定义目标。 (请记住,您需要定义源和目标的完整路径;否则它将不起作用。)

假设我在/script目录中有一个名为firefox的脚本。

 ls -i # Shows you the inode
 5898242 firefox

 ln /scripts/firefox /scripts/on-fire
       ( Source )    ( Destination )




如您所见,它具有相同的inode。如果删除原始文件,则该链接仍将起作用,并且仍将充当原始文件。



上面,我检查该链接是否正常运行,然后删除原始的firefox脚本。


问题:如果有人可以提供一种设置,使硬链接比符号链接更可取,那就太好了。

答:根据磁盘分区的布局,硬链接具有以下限制:硬链接必须位于同一分区(-1点)上,并且只能链接到文件(-1点),但是如果删除了原始链接,则该链接可以工作,并且另一方面,软链接可以指向目录或文件(+1点),并且没有分区限制(+1点),但是如果删除了源,则该链接将不起作用(-1点)。

评论


我可以创建硬链接并将inode作为源吗?

–TMOTTM
18-09-30在9:09

#2 楼

“一张图片胜过千言万语。”



而且,“一个例子值得一百段...”

创建两个文件:

$ touch blah1   
$ touch blah2


在其中输入一些数据:

$ echo "Cat" > blah1
$ echo "Dog" > blah2


和预期的一样:

$cat blah1; cat blah2
Cat
Dog


我们创建硬链接和软链接:

$ ln blah1 blah1-hard
$ ln -s blah2 blah2-soft


让我们看看发生了什么:

$ ls -l

blah1
blah1-hard
blah2
blah2-soft -> blah2



更改blah1的名称无关紧要:

$ mv blah1 blah1-new
$ cat blah1-hard
Cat


blah1-hard指向文件的索引节点,即内容-未被更改。

$ mv blah2 blah2-new
$ ls blah2-soft
blah2-soft
$ cat blah2-soft  
cat: blah2-soft: No such file or directory


找不到文件的内容,因为软链接指向已更改的名称,而不是内容。
类似,如果blah1被删除,blah1-hard仍然保留内容;如果blah2被删除,则blah2-soft只是指向不存在文件的链接。


源:从StackOverflow中公然复制它!

评论


公平地说,您确实在顶部添加了可爱的图片...啊,您也复制了它!结合两个答案实际上是非常有帮助的:)

–icc97
17年1月22日在13:28

更好的解释,无处!

– dennisbot
17年6月22日在19:49

我一直凝视着图像20秒钟,然后突然发现了。这实际上是很棒的。

–穆罕默德·约拉德(Mohammed Joraid)
17年7月28日在7:05

顺便说一句:在git中使用硬链接是一个坏主意,以防万一有人(对软链接感到沮丧)怀疑...也可以应用于其他版本控制系统。

–弗兰克·诺克(Frank Nocke)
17年9月18日在12:43

硬链接的索引节点是否类似于存储在云中的文件,任何设备都可以访问它?

– OKER
18年1月19日在12:24

#3 楼

硬链接不是指向文件的指针,而是指向相同inode的目录条目(文件)。即使您更改另一个文件的名称,硬链接仍然指向该文件。如果将另一个文件替换为新版本(通过复制),则硬链接将不会指向新文件。同一文件系统内只能有硬链接。使用硬链接时,您没有原始文件和链接的概念,它们都是相同的(可以将其视为对对象的引用)。这是一个非常低级的概念。

另一方面,符号链接实际上指向另一个路径(文件名)。每次您通过符号链接访问文件时,它都会解析文件的名称。如果您移动文件,则符号链接将不会跟随。如果将文件替换为另一个文件,并保留名称,则符号链接将指向新文件。符号链接可以跨越文件系统。使用符号链接,您可以在实际文件和符号链接之间有非常清晰的区别,符号链接在指向文件的路径旁边不存储任何信息。

评论


(用自己的话说)“指向文件”的事物可以称为指针(在意义上几乎完全是同义的)。如果我们挑剔,那么(通常)硬链接的概念可能存在,即使文件系统不使用inode。

– jfs
16年6月18日在18:56

#4 楼

两者都是文件的指针。区别在于指针的种类。符号链接通过名称指向另一个文件。它具有特殊模式位,可将其标识为符号链接,并且其内容为真实文件的名称。因为它只包含一个名称,所以该名称实际上不必存在,也可以存在于其他文件系统上。如果替换命名文件(更改其内容而不影响其名称),则该链接仍包含相同的名称,因此现在它指向新文件。您可以轻松地识别符号链接并查看其指向的文件的名称。

硬链接通过inode编号指向文件。因此,硬链接与文件的名字没有不同。没有“真实”名称与硬链接名称;所有硬链接都是文件的同等有效名称。因此,链接到的文件必须实际存在,并且必须与尝试创建链接的文件系统位于同一文件系统中。如果删除原始名称,则硬链接仍指向同一文件。由于所有硬链接都是文件的同等有效名称,因此您无法查看文件的另一个名称。要找到此文件,您必须查看每个文件并比较它们的inode编号以查找具有相同inode编号的其他名称。

您可以分辨出文件中有多少个名称ls -l的输出。文件模式之后的第一个数字是链接计数。链接数超过1的文件在某处具有其他名称,相反,链接数仅为1的文件没有(其他)硬链接。

评论


如果替换命名文件,则该链接仍包含相同的名称,因此现在它指向新文件-我认为这没有得到很好的解释。您是说,如果我替换有符号链接的文件,那么包含名称的链接将保持不变。但这仅在文件名(即替换旧文件的新文件)与替换文件(即被新文件替换的旧文件)相同时才指向替换文件,对吗?

–迈克
2015年4月17日在22:29



@Mike,是的:符号链接指向原始文件名,因此替换该文件意味着该链接现在指向新文件。

–psusi
15年4月18日在1:32

但是只要它的名字正确就可以吗?将符号链接指向香蕉,我将文件替换为橙色,然后sy链接无法再找到文件香蕉,即它将不起作用

–迈克
15年4月18日在8:08

@Mike,世界替换意味着它具有相同的名称,否则,您只是删除一个文件并添加另一个;)

–psusi
15年4月18日在16:28

#5 楼

硬链接只能在同一文件系统上工作,它只是同一inode的不同名称(文件在内部由inode引用)。仅当到文件索引节点的最后一个链接消失时(从文件的最后一个链接到rmunlink d),才会从磁盘上删除文件。
硬链接通常仅适用于文件,而不适用于目录。 >符号链接(符号链接)是一个特殊文件,其中包含另一个文件的路径。此路径可以是绝对路径,也可以是相对路径。符号链接可以跨文件系统工作,甚至可以指向不同的文件,例如,例如,拔出外部硬盘驱动器,然后将其替换为在同一路径下具有不同文件的另一个硬盘。
符号链接可以指向文件或目录。

评论


谢谢,这告诉了我它们是如何工作的,但是硬链接到底能做什么?为什么它对目录不起作用?

–ste_kwr
2012年2月29日在18:41

@knittl:确定吗?在某些文件系统上,似乎允许硬链接到目录,但只有root可以创建它们。请参阅-d,-F和--directory开关。是的,我在ln(1)页面中看到了该注释:)

– 0xC0000022L
2012年2月29日在19:08



@kniwor:描述硬链接的最简单方法是“只是同一文件的另一个名称(即磁盘上的数据)”。并且-至少在我的系统上-ln不能用于建立目录的硬链接。但是,存在到目录的硬链接,最突出的例子是。并且...我不想在原始答案中包括它,因为那样只会使事情复杂化。

– knittl
2012年3月1日10:26



@STATUS_ACCESS_DENIED:好的……但这通常不是一个好主意。这就是为什么我在原始答案中“通常”写。另请参阅我以前的评论以获取示例。

– knittl
2012年3月1日上午10:29

因此硬链接可以指向具有不同名称的同一个文件夹/文件,即具有链接到同一inode的不同名称?

–查理·帕克(Charlie Parker)
17-4-10在17:38



#6 楼

另一个线程的答案之一(现在从您的文章顶部链接)提到了此页面,我认为这是一个很好的中级解释。如果您迷失于ascii艺术,请使用tl; dr版本:


标准文件是从文件系统到索引节点的指针,索引节点又指向物理数据。文件组件存储其到文件系统的链接(本质上是其路径)和到inode的链接。
硬链接就像文件一样。它们只是直接指向inode的附加指针。
符号链接是单独的文件(包括单独的inode和数据),它们存储文件的文件系统路径。

内核和文件系统

因此基于以下内容:


硬链接仅允许相同文件系统链接。符号链接可以指向任何路径。
(基本上)硬链接指向绝对数据。符号链接可以指向相对路径(例如../parent.file
通过扩展,如果您移动硬链接的目标指针(请记住,它本身实际上只是指向inode的硬链接),则硬链接链接仍然有效。移动符号链接的目标通常会破坏符号链接。
解决硬链接会更快,但无法估量。速度的那微不足道的部分是以不灵活的文件系统为代价的。


我可能已经使自己有些困惑了,但是通读各种东西之后,我正在努力寻找标准与标准之间的区别。文件和硬链接。我的读取方式是每个文件都包含一个硬链接(存储文件名),并链接到一个指向物理数据的inode。

添加一个硬链接只是为inode提供了一个额外的文件系统-基于指针。是吗?

评论


我认为您是对的,每个文件都是一个索引节点的路径名,而硬链接是同一索引节点的附加路径名。因此,硬链接与普通文件没有什么不同。

– Enzotib
2011年5月18日15:20

我正在尝试理解这一点……但您说:>“符号链接是存储文件的文件系统路径的单独文件(包括单独的inode和数据)。”一个符号链接真的有单独的数据吗?然后,它就像链接到的目录的副本一样,对吗? ...并且每次将某些内容写入符号链接时,必须将其两次写入磁盘吗?没有意义。

– MiniGod
2012-12-29 23:43



@MiniGod符号链接不是数据块的索引节点,该数据块存储到另一个索引节点(文件名)的路径。是的,这就像矩阵一样令人困惑,但是一旦获得它,您将永远不会忘记:)

–奥利♦
2012年12月29日23:48

@Oli我可能会感到困惑,但是当您说:“包括独立的inode和数据”时,您的意思是符号链接具有独立的数据!

– MiniGod
2012年12月31日,下午1:34

@MiniGod是的。 Symlink是指向数据的inode(就像普通文件一样),该数据是路径。它比这聪明得多-允许通过符号链接进行透明使用-但这实际上就是它们的全部。

–奥利♦
2012年12月31日下午2:21

#7 楼

何时使用软链接:

跨文件系统的链接:如果要跨文件系统链接文件,则只能使用符号链接/软链接。

目录链接:如果您想要链接目录,则必须使用软链接,因为您无法创建到目录的硬链接。

何时使用硬链接:

存储空间:硬链接占用的空间很小,因为在创建硬链接时没有创建新的索引节点。在软链接中,我们创建一个占用空间的文件(通常为4KB,具体取决于文件系统)

性能:访问硬链接时性能会稍好一些,因为您直接访问磁盘指针而不是磁盘指针正在浏览另一个文件。
移动文件位置:如果将源文件移动到同一文件系统上的其他位置,则硬链接仍将起作用,但软链接将失败。

冗余:如果要确保数据安全,则应使用硬链接,因为在硬链接中,数据是安全的,直到删除了所有指向文件的链接,而不是在软链接中,您将丢失如果删除文件的主实例,则返回数据。

评论


请注意,还有一个快速符号链接,其路径名最大为64个字节。它仍然占用一个inode,但不占用4kb的块空间。

–syockit
15年1月21日在10:57

#8 楼

当您尝试查找“文件名”和硬链接之间的差异时会产生混乱,因为它们之间没有区别。

您创建的每个文件都包含磁盘上的数据和一个硬链接-是目录中的文件名,也是指向磁盘上数据的指针。故事结局。当删除最后一个(或唯一一个)硬链接时,操作系统便知道不再需要该数据。

从中您可以看到,实际数据永远不会被删除,只有硬链接( s)是。并且当它在磁盘上足够拥挤时,数据可能会被另一个文件的数据覆盖。在此之前,可能会恢复已删除文件中的数据,但是如果没有硬链接就很难找到它。

符号链接,如前所述,仅告诉您“文件夹中有一个名为<targetname>的文件名为“ <targetfolder>”。他们指向硬链接。他们不知道数据在哪里。硬链接知道这一点。

#9 楼

非常简单文件(和目录!)存储在块设备(HDD或其他设备)上的地址中。通常,您将一个名称映射到一个地址,这就是您获取文件的方式。硬链接是映射到相同地址的第二,第三等名称。相反,符号链接引用符号-名称-映射到名字的第二个名称也是如此。就内核而言,一旦它读取了符号链接目标,它就会停止,并以目标值作为文件名(或多或少)返回到开头,因此相对符号链接是可能的,但却毫无帮助。除非在用户空间代码中明确查询了目标名称,否则不会在文件系统级别以上使用目标名称。