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


768

最近,在面试中有人问我这个问题。我很诚实,说我知道符号链接的行为以及如何创建符号链接,但不了解硬链接的用法以及它与符号链接的区别。


2
关于“不了解硬链接的使用”,它可以用于进行二进制文件大量复制的构建系统中。创建硬链接而不是实际的副本可以加快速度。MSBuild 4.0支持此功能。
Ankush

13
我发现此链接对于理解它非常有用。askubuntu.com/questions/108771/…–
kta

2
unix.stackexchange列出了很多要点 ...非常有帮助,因为它非常简洁地列出了所有约束并且易于浏览。(这些要点很多涵盖了仅在此问题的评论中提到的或根本没有提及的边缘情况/腔)
Trevor Boyd Smith

Answers:


779

在文件系统下,文件由inode表示。(或者是多个inode?不确定。)

文件系统中的文件基本上是指向索引节点的链接。
然后,硬链接仅创建另一个文件,该文件具有指向相同基础inode的链接。

删除文件时,它会删除一个指向基础索引节点的链接。仅在删除到该索引节点的所有链接后,该索引节点才被删除(或可删除/可重写)。

符号链接是指向文件系统中另一个名称的链接。

一旦建立了硬链接,该链接即指向inode。删除,重命名或移动原始文件不会影响硬链接,因为它链接到基础索引节点。索引节点上数据的任何更改都会反映在引用该索引节点的所有文件中。

注意:硬链接仅在同一文件系统内有效。符号链接可以跨越文件系统,因为它们只是另一个文件的名称。


2
我确定i节点取决于操作系统的特定版本;但是,我相信它通常是单个i节点。索引节点具有有关文件的信息以及有关数据在磁盘上的存储位置的信息。大文件将具有指向其他表的间接指针。
terson

76
您可能想要添加有用的功能,即符号链接可以跨文件系统,而硬链接则不能(它们必须引用同一文件系统上的文件)。
paxdiablo


1
经过阅读和实验后,我还写了一个博客,内容是csharpbsharp.tumblr.com
Adnan Bhatti

1
@zen:您可以在不使用文件系统时随时对其进行卸载/重新安装。对于根分区,这有点棘手,但是可以做到(不推荐)。为此,通常最好先引导可重用的CD,然后首先修改安装并重新引导。但是您应该在超级用户上问这种问题。
马丁·约克

464

使用任何Linux(ish)控制台都可能会有所帮助的一些不错的直觉。

创建两个文件:

$ touch foo; touch bar

在其中输入一些数据:

$ echo "Cat" > foo
$ echo "Dog" > bar

(实际上,我本来可以使用echo,因为如果文件不存在,它会创建文件……但不要紧。)

和预期的一样:

$cat foo; cat bar
Cat
Dog

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

$ ln foo foo-hard
$ ln -s bar bar-soft

让我们看看发生了什么:

$ ls -l

foo
foo-hard
bar
bar-soft -> bar

更改foo的名称无关紧要:

$ mv foo foo-new
$ cat foo-hard
Cat

foo-hard指向文件的索引节点(即内容)-未被更改。

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

找不到文件的内容,因为软链接指向已更改的名称,而不是内容。

同样,如果foo被删除,则foo-hard仍保留内容;如果bar被删除,bar-soft则仅是指向不存在文件的链接。


12
这是否意味着“文件”和“硬链接”相同,都指向一个inode?关于删除文件或硬链接,只要一个内容仍然指向索引节点,内容仍然存在吗?
Daniel W.

1
@DanFromGermany正确。只要至少一个硬链接(即文件)指向该内容,就可以访问该内容。
Adam Matan

6
touch blah1; touch blah2可以缩短为touch blah1 blah2
Dmitri Zaitsev

11
@DmitriZaitsev是的,但是对于IMO初学者来说,它的可读性较低。
亚当·马坦

8
就我已阅读的许多答案而言,我认为这是最好的理解答案。一个示例比一堆解释性文本更好。
朱Chu

434

俗话说,一张图片值得一千个字。这是我的可视化方式:

在此处输入图片说明

这是我们获得该图片的方式:

  1. myfile.txt在文件系统中创建一个指向新索引节点的名称(该索引节点包含文件的元数据,并指向包含其内容的数据块,即文本“ Hello,World!”:

    $ echo 'Hello, World!' > myfile.txt
    
  2. 创建指向my-hard-link该文件的硬链接myfile.txt,这意味着“创建一个文件,该文件应指向所指向的相同inode myfile.txt”:

    $ ln myfile.txt my-hard-link
    
  3. 创建指向my-soft-link该文件的软链接myfile.txt,这意味着“创建一个应指向该文件的文件myfile.txt”:

    $ ln -s myfile.txt my-soft-link
    

看一下如果myfile.txt删除(或移动)将会发生什么:my-hard-link仍然指向相同的内容,因此不受影响,而my-soft-link现在却指向任何内容。其他答案则讨论了每种方法的优缺点。


3
@ThunderWiring通过“点”,我的意思是任何链接引用。在硬链接的情况下,它直接引用一个索引节点(即所引用的相同索引节点myfile.txt)。对于软链接,它的引用不是inode(其中包含数据),而是它的引用是myfile.txt(例如/home/Documents/myfile.txt)的文件系统路径
akivajgordon

4
我非常喜欢您的视觉回应@akivajgordon-确实帮助我更好地理解了差异!
wmock 2016年

7
一万个字!
SaganRitual

13
也许我很慢,但是您的照片仅在2秒钟内就消除了20年的神秘感。
jdk1.0

3
最有用的答案,我很生气,这个帖子如此深入。我会给你一百个互联网积分,但可惜我只能给你一个。
新郎(Dagrooms)

71

当原始文件四处移动时,硬链接很有用。例如,将文件从/ bin移动到/ usr / bin或/ usr / local / bin。到/ bin中的文件的任何符号链接都将由此中断,但是硬链接(直接链接到文件的inode)将不在乎。

硬链接可能只占用一个目录条目,因此可能会占用较少的磁盘空间,而符号链接则需要自己的索引节点来存储其指向的名称。

硬链接也需要较少的时间来解决-符号链接可以指向符号链接目录中的其他符号链接。其中一些可能位于NFS或其他高延迟文件系统上,因此可能导致网络流量无法解决。硬链接始终位于同一文件系统上,始终在单个查找中解决,并且永远不会涉及网络延迟(如果它是NFS文件系统上的硬链接,则NFS服务器将执行解析,并且对于客户端系统)。有时这很重要。不适合我,但是我可以想象高性能系统在其中可能很重要。

我还认为mmap(2)甚至open(2)之类的东西都使用与硬链接相同的功能来保持文件的inode处于活动状态,以便即使将文件取消链接(2),inode仍保留以允许进程继续访问,只有在进程关闭后,文件才真正消失。这样可以使用更安全的临时文件(如果可以自动进行打开和取消链接,可能我不记得其中可能有POSIX API,那么您确实有一个安全的临时文件),您可以在其中读写您的数据,而任何人都无法访问它。好的,在/ proc使每个人都可以查看您的文件描述符之前,确实是这样,但这是另一回事了。

说到此,恢复在进程A中打开但在文件系统上未链接的文件的过程围绕着使用硬链接来重新创建inode链接,因此当打开它的进程关闭文件或关闭文件时,文件也不会消失。


35

软链接

软或符号更像是对原始文件的快捷方式。...如果删除原始文件,则快捷方式将失败,并且如果仅删除快捷方式,则原始文件将不会发生任何事情。

软链接语法ln -s Pathof_Target_file link

输出: link -> ./Target_file

证明: readlink link 另外在ls -l link输出你会看到的第一个字母lrwxrwxrwx是表明该文件是软链接。

删除链接: unlink link

注意:如果愿意,即使将软链接从当前目录移到其他位置,也可以使用。创建软链接时,请确保提供绝对路径而不是相对路径。即(从/ root / user / Target_file开始,而不是./Target_file)

硬链接:

硬链接更多是镜像副本或指向同一文件的多个路径。对file1做一些操作,它会出现在文件2中。删除其中一个仍然可以使另一个正常。

仅在删除所有(硬)链接或到(相同文件)inode的所有路径时,才删除inode(或文件)。

一旦建立了硬链接,该链接便具有原始文件的索引节点。删除重命名或移动原始文件不会影响硬链接,因为它链接到基础索引节点。索引节点上数据的任何更改都会反映在引用该索引节点的所有文件中。

硬链接语法ln Target_file link

输出:将创建一个具有名称链接的文件,其索引节点号与Targetfile相同。

证明:( ls -i link Target_file 检查其inode)

删除链接:( rm -f link就像删除普通文件一样删除链接)

注意:符号链接可以跨越文件系统,因为它们只是另一个文件的名称。而硬链接仅在同一文件系统中有效。

符号链接具有一些功能,硬链接丢失了:

  • 硬链接指向文件内容。而“软链接”指向文件名。
  • 硬链接的大小是内容的大小,而软链接的大小是文件名的大小。
  • 硬链接共享相同的索引节点。软链接没有。
  • 硬链接不能跨文件系统。软链接。
  • 您会立即知道符号链接指向硬链接时所指向的位置,您需要浏览整个文件系统以查找共享相同inode的文件。

    # find / -inum 517333

    /home/bobbin/sync.sh
    /root/synchro
    
  • 硬链接不能指向目录。

硬链接有两个限制:

  • 目录不能被硬链接。Linux不允许这样做来维护目录的非循环树结构。
  • 不能跨文件系统创建硬链接。这两个文件必须位于相同的文件系统上,因为不同的文件系统具有不同的独立inode表(不同文件系统上的两个文件,但具有相同的inode编号将有所不同)。

3
“硬链接的大小是内容的大小,而软链接的大小是文件名的大小。” 需要说明的是,建立另一个硬链接只会影响几个字节的可用空间。
Ingo 2015年

34

查看硬链接和符号链接之间差异的简单方法是通过一个简单的示例。硬链接指向文件的存储位置或该文件的索引节点。一个符号链接将指向实际文件本身。

因此,如果我们有一个名为“ a”的文件并创建一个硬链接“ b”和一个符号链接“ c”,它们均引用文件“ a”:

echo "111" > a
ln a b
ln -s a c

“ a”,“ b”和“ c”的输出将是:

cat a --> 111
cat b --> 111
cat c --> 111

现在,我们删除文件“ a”,看看“ a”,“ b”和“ c”的输出将如何处理:

rm a
cat a --> No such file or directory
cat b --> 111
cat c --> No such file or directory

所以发生了什么事?

因为文件“ c”指向文件“ a”本身,所以如果删除文件“ a”,则文件“ c”将没有任何指向,实际上它也被删除。

但是,文件“ b”指向文件“ a”的存储位置或索引节点。因此,如果删除文件“ a”,则它将不再指向索引节点,但是由于文件“ b”确实删除了索引节点,因此索引节点将继续存储属于“ a”的任何内容,直到不再有硬链接指向该索引为止。


需要指出的是,文件是一个非常抽象的对象,并且具有所有抽象的内容,因此高层实现的真正意图可能没有适当的解释,而又没有冒抽象的风险。
Cholthi Paul Ttiopic'4

28

符号链接链接到路径名。它可以在系统文件树中的任何位置,并且在创建链接时甚至不必存在。目标路径可以是相对路径,也可以是绝对路径。

硬链接是指向inode的附加指针,这意味着它们只能与目标存在于相同的卷上。指向文件的其他硬链接与用于引用文件的“原始”名称没有区别。


同样,当删除链接到的文件时,符号链接断开,硬链接仍然有效,因为它“保留”了文件系统中的文件。
njsf

21

我会指出您维基百科:

几点:

  • 与硬链接不同,符号链接可以(大部分时间)跨文件系统。
  • 符号链接可以指向目录。
  • 硬链接指向一个文件,使您可以使用多个名称引用同一文件。
  • 只要有至少一个链接,数据仍然可用。

1
理论上(在某些情况下甚至在实践中)硬链接也可以指向目录(实际上,“。”是指向当前目录的硬链接,而“ ..”是指向父目录的硬链接)。但是它们可能很危险,因此大多数UNIX不允许使用它们(或要求您采取特殊步骤来执行它)。苹果将​​它们用于时间机器的实现,例如:earthlingsoft.net/ssp/blog/2008/03/x5_time_machine
Joachim Sauer 2009年

3
您正在指向文章的链接...这是否使您成为符号链接?
伊恩·坎贝尔

@JoachimSauer您是否认为新的Apple文件系统将消除Time Machine使用硬链接到目录的需要?
cjm

我发现Wikipedia的解释比最佳答案中的解释明显更短,更具体。
lakesare '18

9

硬链接在进行增量备份时非常有用。例如,请参阅rsnapshot。这个想法是使用硬链接进行复制:

  • 将备份编号n复制到n + 1
  • 将备份n-1复制到n
  • ...
  • 将备份0复制到备份1
  • 使用任何更改的文件更新备份0。

新备份将不会占用您所做任何更改的任何额外空间,因为所有增量备份将指向未更改文件的同一组索引节点。


6

硬链接与软链接

硬链接与软链接可以通过此图像轻松解释。


5
我猜您的软链接图片不正确。指向:软链接的索引节点不应指向原始文件的索引节点。如果您重命名原始文件,则会导致相关的软链接失效
percy507 '18

@ percy507是的,您是对的-但我仍然觉得这是一个非常不错而直观的解释。试想一下,索引节点之间的箭头不存在...
Michael Litvin

5

我补充尼克的问题:硬链接何时有用或必要?我想到的唯一一个其中符号链接无法完成工作的应用程序是在chroot环境中提供系统文件的副本。


带有安装点的分布式系统在不同系统上的不同位置。当然,可以通过一致的方式在系统外进行设计。
terson

我认为@Tanktalus提供了一个很好的例子。
Nick Stinemates,

4

MSDN

符号链接

符号链接是指向另一个文件系统对象的文件系统对象。指向的对象称为目标。

符号链接对用户是透明的。链接显示为普通文件或目录,并且用户或应用程序可以以完全相同的方式对其进行操作。

符号链接旨在帮助与UNIX操作系统进行迁移和与应用程序兼容。Microsoft已实现其符号链接,使其功能与UNIX链接一样。

符号链接可以是绝对链接,也可以是相对链接。绝对链接是指定路径名各部分的链接。相对链接是相对于相对链接说明符在指定路径中的位置来确定的

绝对符号链接的示例

X: "C:\alpha\beta\absLink\gamma\file"
Link: "absLink" maps to "\\machineB\share"
Modified Path: "\\machineB\share\gamma\file"

相对符号链接的示例

X: C:\alpha\beta\link\gamma\file
Link: "link" maps to "..\..\theta"
Modified Path: "C:\alpha\beta\..\..\theta\gamma\file"
Final Path: "C:\theta\gamma\file"

硬链接

硬链接是通过将多于一个的路径引用的单个文件的文件的文件系统表示在相同的体积

要在Windows中创建硬链接,请导航至要创建链接的位置,然后输入以下命令:

mklink /H Link_name target_path

请注意,您可以删除任何顺序的硬链接,无论它们的创建顺序如何。此外,在以下情况下无法创建硬链接

  • 引用位于不同的本地驱动器中
  • 参考资料包括网络驱动器。换句话说,参考之一是网络驱动器
  • 要创建的硬链接与目标位于同一路径

交界处

NTFS支持另一种称为联结的链接类型。MSDN对其定义如下:

联结(也称为软链接)与硬链接的不同之处在于,它引用的存储对象是单独的目录,联结可以链接位于同一计算机不同本地卷上的目录。否则,结点的操作与硬链接相同。

硬链接部分和连接部分中的粗体部分显示了两者之间的基本区别。

在Windows中创建联结的命令,导航到要创建链接的位置,然后输入:

mklink /J link_name target_path

3

也:

  1. 硬链接的读取性能优于符号链接(微性能)
  2. 可以复制符号链接,进行版本控制等。换句话说,它们是实际文件。另一方面,硬链接的级别略低,与符号链接相比,您会发现很少有工具可以将硬链接作为硬链接而不是普通文件来使用。

3

简单地说,硬链接:只是在文件中添加新名称,也就是说,一个文件可以同时具有多个名称,所有名称彼此相等,没有首选,硬链接并不意味着复制所有内容文件并创建新文件不是,它只是创建了一个备用名称而已。

符号链接(symlink):是指向另一个文件的文件指针,如果该符号链接指向一个现有文件,该文件随后被删除,则即使该名称不再为任何文件命名,该符号链接仍指向相同的文件名。


3

您认为普通的“文件”实际上是两个独立的部分:文件的数据和目录条目。当您为文件创建硬链接时,实际上是在创建第二个目录条目,该目录条目引用相同的数据。这两个目录条目具有完全相同的功能。每个文件都可以用来打开文件进行读取。因此,您实际上并没有“一个文件加一个硬链接”,而是“有两个目录条目的文件数据”。您所认为的删除文件实际上是删除目录条目,并且当删除数据的最后一个目录条目时,数据本身也会被删除。对于只有一个目录条目的普通文件,删除目录条目将照常删除数据。(打开文件时,操作系统会创建指向该文件的临时链接,

例如,创建一个文件A.txt,一个硬链接B.txt,然后删除A.txt。当您创建A.txt时,将创建一些数据以及一个目录条目A.txt。创建硬链接时,将创建另一个目录条目B.txt,指向完全相同的数据。删除A.txt时,仍然拥有所有数据和一个目录条目B.txt,就像您首先创建文件B.txt一样。

软链接只是一个(几乎)普通文件,只不过它不包含数据,而是另一个目录条目的路径。如果删除该软链接引用的文件,则该软链接将包含一个不再指向目录条目的路径。它被打破。如果删除软链接,则就像删除任何其他文件一样,它指向的文件不受影响。


2

目录条目是链接结构的目录:

struct dentry{
    ino_t ino;
    char  name[256];
}

ino是索引节点的数目,名称是文件名,索引节点的结构可能类似于:

struct inode{
      link_t nlink; 
      ...
}

例如,您创建一个文件/ 1,目录条目可能类似于:

struct dentry{
     ino_t ino; /* such as 15 */
     char  name[256]; /* "1" */
} 

inode结构可能像这样:

   struct inode{ /* inode number 15 */
         link_t nlink; /* nlink = 1 */
         ...
    }

然后创建一个硬链接(可能是/ 100),目录条目可能像这样:

  struct dentry{
     ino_t ino; /* 15 */
     char  name[256]; /* 100 */
  }

inode结构可能像这样:

   struct inode{ /* inode numebr 15 */
         link_t nlink; /* nlink = 2 */
         ...
    }

然后您创建到文件1的符号链接(可能是/ 200),目录条目可能类似于:

  struct dentry{
        ino_t ino; /* such as 16 */
        char  name[256]; /* "200" */
  }

inode结构可能像这样:

   struct inode{ /* inode number 15 */ 
         link_t nlink; /* nlink = 2 */
         ...
    }

   struct inode{ /* inode number 16 */
         link_t nlink; /* nlink = 1 */
         ...
    } /* the data of inode 16 maybe /1 or 1 */

2

除上述所有答案外,查找硬链接和软链接文件的区别可以理解如下:

f6在当前目录中有一个文件,还有一个名为的目录t2

名为f1和的文件./t2/f2是指向的符号链接f6

名为f7和的文件./t2/f8是的硬链接f6

要找到软链接和硬链接,我们可以使用:

$ find -L . -samefile f6 

> ./f1
> ./f6
> ./f7
> ./t2/f2
> ./t2/f8

要仅查找硬链接,我们可以使用:

$ find . -xdev -samefile f6

> ./f6
> ./f7
> ./t2/f8

由于可以在同一文件系统上创建硬链接,因此我们可以在同一文件系统/挂载点中搜索所有不带-L选项(带有-xdev选项)的硬链接。它将不必要的搜索保存到不同的安装点中。

因此,搜索硬链接比搜索软链接要快一些(如果我输入错误或不清楚,请纠正。)


1

符号链接以类似于硬链接的方式为文件命名。但是,即使有剩余的符号链接,也可以删除文件。


不会。符号链接不是“同一文件的另一个名称”,它是一个独立的文件,链接到目标文件。
Kusalananda

1

我的用法两分钱:

链接可用于缩短长路径名,即:

ln -s /long/folder/name/on/long/path/file.txt /short/file.txt

对所做的更改/short/file.txt将应用于原始文件。

链接可用于在大文件之间移动:

$ ls -lh /myapp/dev/
total 10G
-rw-r--r-- 2 root root 10G May 22 12:09 application.bin

ln /myapp/dev/application.bin /myapp/prd/application.bin

即时复制到其他文件夹,并且/myapp/dev可以移动或删除原始文件(在上),而无需触摸文件上的/myapp/prd


0

我只是找到了一种简单的方法来理解常见情况(软件安装)中的硬链接。

有一天,我将软件下载到文件夹中Downloads进行安装。完成后sudo make install,将某些可执行文件cp编入本地bin文件夹。在这里,cp创建硬链接。我对软件感到满意,但很快就意识到Downloads从长远来看这不是一个好地方。因此,我mv将软件文件夹编辑到 source目录中。好了,我仍然可以像以前一样运行该软件,而不必担心任何目标链接的事情,例如在Windows中。这意味着硬链接可以直接找到inode以及周围的其他文件。


0

在这个答案中,当我说一个文件时,我指的是内存中的位置

所有保存的数据都使用称为inode的数据结构存储在内存中。每个inode都有一个inode编号.inode编号用于访问inode。指向文件的所有硬链接可能具有不同的名称,但共享相同的inode编号。由于所有硬链接都具有相同的索引节点号(依次访问相同的索引节点),因此它们都指向相同的物理内存。

符号链接是一种特殊的文件,由于它也是一个文件,因此将具有文件名和索引节点编号。如上所述,索引节点编号附加了一个指向数据的索引节点。符号链接中的索引节点访问指向另一个文件“路径”的那些索引节点。更具体地说,符号链接中的索引节点编号指向指向另一个硬链接的索引节点。

当我们在GUI中移动,复制,删除文件时,我们在使用文件的硬链接而不是物理内存。在删除文件时,我们正在删除文件的硬链接。我们不会清除物理内存。如果删除了所有与文件的硬链接,那么尽管存储在内存中的数据仍然可能无法访问,

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.