协慌网

登录 贡献 社区

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

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

答案

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

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

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

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

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

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

使用任何 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仅仅是一个不存在的文件链接。

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

在此处输入图片说明

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

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

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

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

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

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