硬链接和符号链接有什么区别?


487

如标题所示,我想知道命令创建的硬链接和软链接之间的区别ln。该命令man ln确实提供了信息,但没有充分回答我的问题。

同样,如果有人可以提供一种设置,使硬链接比符号链接更可取,那将是很好的。


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

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


1
也相当一个完整的答案:stackoverflow.com/questions/185899/...
Elzo Valugi

该视频不可用
Ooker

Answers:


58

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


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

  1. 软链接(符号链接)

    您可以建立指向文件和目录的链接,并且可以在不同的分区上创建链接(快捷方式),并使用与原始目录不同的inode编号。

    如果实际副本被删除,则该链接将不起作用

  2. 硬链接

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

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


问题:如何建立软链接?

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

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

在此处输入图片说明

如您所见,它具有不同的inode并可以在不同的分区上进行。


问题:如何进行硬链接?

答:可以使用进行硬链接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点),但是(-1点)如果删除源,则该链接将不起作用。


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

324

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

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


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

319

“一张图片胜过千言万语。” 绘画作品


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

创建两个文件:

$ 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复制它


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

2
更好的解释,无处!
dennisbot

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

1
顺便说一句:使用with的硬链接git 是一个坏主意,以防万一有人(对软链接感到沮丧)想知道...也可以应用于其他版本控制系统。
Frank Nocke

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

89

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

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

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


If you replace the named file, then the link still contains the same name, and so now it points to the new file-我认为这没有得到很好的解释。您是说,如果我替换有符号链接的文件,那么包含名称的链接将保持不变。但是,仅当其文件名(即替换旧文件的新文件)与替换文件(即被新文件替换的旧文件)相同时,才指向替换文件,对吗?
迈克(Mike)

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

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

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

58

硬链接只能在同一文件系统上工作,它只是同一inode的不同名称(文件在内部由inode引用)。一个文件将在最后一个环节,以它的inode走了只能从磁盘上删除(您rmD或unlinkd是最后一个环节)。硬链接通常仅适用于文件,不适用于目录。

符号链接(符号链接)是一个特殊文件,其中包含另一个文件的路径。此路径可以是绝对路径,也可以是相对路径。符号链接可以跨文件系统工作,甚至可以指向不同的文件,例如,例如,拔出外部硬盘驱动器,然后将其替换为在同一路径中具有不同文件的另一个硬盘驱动器。符号链接可以指向文件或目录。


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

@knittl:确定吗?在某些文件系统上,似乎允许硬链接到目录,但只有root可以创建它们。请参阅-d, -F, --directory开关。是的,我已经出现在笔记ln(1)页面:)
0xC0000022L

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

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

因此,硬链接可以指向具有不同名称的同一文件夹/文件,即具有链接至同一inode的不同名称吗?
查理·帕克

21

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

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

涉及的内核和文件系统透明地翻译了所有内容。

因此基于:

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

我可能会有些困惑,但是通读各种东西之后,我一直在努力寻找标准文件和硬链接之间的区别。我读取它的方式是每个文件都包含一个硬链接(存储文件名),并链接到一个指向物理数据的索引节点。

添加硬链接只会为inode提供一个额外的基于文件系统的指针。那正确吗?


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

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

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

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

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

15

何时使用软链接:

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

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

何时使用硬链接:

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

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

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


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

8

当您尝试查找“文件名”和硬链接之间的差异时,就会出现混乱,因为两者之间没有区别。

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

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

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


0

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

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.