最近我在一次工作面试中被问到这个问题。我诚实地说,我知道符号链接的行为和如何创建一个,但不了解硬链接的使用,以及它与符号链接的区别。


当前回答

一些例子可能会有所帮助。

创建两个包含数据的文件:

$ printf Cat > foo
$ printf Dog > bar

创建一个硬链接和软链接(又名符号链接):

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

通过增加大小以长格式列出目录内容:

ls -lrS
lrwxr-xr-x   1 user  staff        3  3 Apr 15:25 bar-soft -> bar
-rw-r--r--   2 user  staff        4  3 Apr 15:25 foo-hard
-rw-r--r--   2 user  staff        4  3 Apr 15:25 foo
-rw-r--r--   1 user  staff        4  3 Apr 15:25 bar

这告诉我们

1st column: the file mode for the soft and hard links differ soft link: lrwxr-xr-x filetype: l = symbolic link owner permissions: rwx = readable, writable, executable group permissions: r-x = readable, not writable, executable other permissions: r-x = readable, not writable, executable hard link: -rw-r--r-- filetype: - = regular file owner permissions: rw- = readable, writable, not executable group permissions: r-- = readable, not writable, not executable other permissions: r-- = readable, not writable, not executable 2nd column: number of links is higher for the hard linked files 5th column: the size of the soft link is smaller, because it's a reference as opposed to a copy last column: the symbolic link shows the linked-to file via ->

更改foo的文件名不会影响foo-hard:

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

更改foo的内容反映在foo-hard中:

$ printf Dog >> foo
$ cat foo-hard
CatDog

像foo-hard这样的硬链接指向文件的inode(内容)。

这不是像bar-soft这样的软链接的情况:

$ 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只是一个指向不存在文件的链接。

其他回答

俗话说,一幅画胜过千言万语。以下是我对它的想象:

下面是我们如何得到这张照片的:

Create a name myfile.txt in the file system that points to a new inode (which contains the metadata for the file and points to the blocks of data that contain its contents, i.e. the text "Hello, World!": $ echo 'Hello, World!' > myfile.txt Create a hard link my-hard-link to the file myfile.txt, which means "create a file that should point to the same inode that myfile.txt points to": $ ln myfile.txt my-hard-link Create a soft link my-soft-link to the file myfile.txt, which means "create a file that should point to the file myfile.txt": $ ln -s myfile.txt my-soft-link

看看如果myfile.txt被删除(或移动)会发生什么:my-hard-link仍然指向相同的内容,因此不受影响,而my-soft-link现在什么都不指向。其他答案讨论了每种方法的利与弊。

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

所有保存的数据都使用称为inode的数据结构存储在内存中,每个inode都有一个inodennumber。inode号用于访问inode。到文件的所有硬链接可能有不同的名称,但共享相同的inode号。因为所有的硬链接都有相同的inodennumber(访问相同的inode),所以它们都指向相同的物理内存。

符号链接是一种特殊的文件。因为它也是一个文件,它将有一个文件名和一个inode号。如上所述,inode号访问指向数据的inode。现在,符号链接的特殊之处在于,符号链接中的inodennumbers访问那些指向另一个文件的“路径”的inode。更具体地说,符号链接中的inode号访问指向另一个硬链接的inode。

当我们在GUI中移动、复制、删除文件时,我们使用的是文件的硬链接,而不是物理内存。当我们删除一个文件时,我们正在删除该文件的硬链接。我们并没有清除物理内存。如果文件的所有硬链接都被删除,那么将无法访问存储的数据,尽管它可能仍然存在于内存中

我推荐你们去维基百科:

符号链接 硬链接

以下几点:

与硬链接不同,符号链接可以跨文件系统(大多数情况下)。 符号链接可以指向目录。 硬链接指向一个文件,并允许您使用多个名称引用同一个文件。 只要至少有一个链接,数据就仍然可用。

硬链接和软链接可以很容易地用这张图来解释。

我刚刚发现了一个简单的方法来理解硬链接在一个常见的场景,软件安装。

有一天,我下载了一个软件到下载文件夹进行安装。在我做sudo make install后,一些可执行文件被cped到本地bin文件夹。这里,cp创建硬链接。我对这个软件很满意,但很快就意识到,从长远来看,下载并不是一个好地方。所以我把软件文件夹移动到源目录。好吧,我仍然可以像以前一样运行软件而不用担心任何目标链接的事情,就像在Windows中一样。这意味着硬链接可以直接找到inode和其他文件。