硬连接和软连接是在硬盘中连接文件的两种方法。硬连接本质上是一个文件的同步副本,它直接引用源文件的 inode。软连接则直接引用源文件,源文件再引用 inode,更像是源文件的一个快捷方式。那么硬连接和软连接究竟有何不同呢?

inode

要理解硬连接和软连接的不同,首先要了解 inode。

inode 是一个描述文件或目录属性的数据库,如元信息、硬盘物理地址等。通过 inode,操作系统可以检索文件权限信息、物理地址等信息。当一个文件从一个文件夹移到另一个文件夹,文件将被移动到硬盘的另一个位置,文件的 inode 值也会自动发生变化。

硬连接

硬连接直接通过 inode 引用文件。硬连接只能用于文件,而不能用于目录。

硬连接(Hard Link)扮演着源文件拷贝或镜像的角色。可以访问源文件的数据,如果源文件被删除,硬连接依然可以访问源文件的数据。

下面通过一个操作实例来具象的理解硬连接:

创建并访问源文件

  1. $ touch sourcefile && echo "This is a plain text file." > sourcefile
  2. $ cat sourcefile
  3. This is a plain text file.

创建硬连接

$ ln sourcefile hardfile
$ ls -li

79448344 -rw-r--r--  2 joebon  staff  27  5 23 15:47 hardfile
79448344 -rw-r--r--  2 joebon  staff  27  5 23 15:47 sourcefile

输出结果最左边一列是文件的 inode 值,它指向物理硬盘的一个区块。文件系统会维护一个引用计数,只要有文件指向这个区块,inode 就不会从硬盘上消失。

我们可以看到,源文件和硬连接文件的 inode 值是一样的,都指向同一个硬盘区块。

删除源文件

$ rm sourcefile
$ cat hardfile

This is a plain text file.

我们可以看到,删除源文件之后,硬连接文件仍然可以正常访问。这是因为删除源文件只是删除了源文件对 inode 的引用,文件系统会对 inode 引用进行计数,只要仍存在 inode 引用,该 inode 就不会删除。

软连接

软连接本质上是源文件的一个快捷方式,指向源文件本身,而不是源文件的 inode 值。软连接可以同时用于文件和目录,也可以在不同的硬盘或容器之间使用。

软连接(Soft Link 或 Symbolic Link)扮演着源文件指针的角色。不可以访问源文件数据,如果源文件被删除,软连接将会指向一个不再存在的文件地址。

下面通过一个操作实例来具象的理解硬连接:

创建硬连接

$ ln -s sourcefile softfile
$ ls -li

79450053 lrwxr-xr-x  1 joebon  staff  10  5 23 15:56 softfile -> sourcefile
79448344 -rw-r--r--  2 joebon  staff  27  5 23 15:47 sourcefile

我们可以看出,软连接和源文件的 inode 是不同的。

删除源文件

$ rm sourcefile
$ cat softfile

cat: softfile: No such file or directory

因为软连接是直接指向源文件的,而不是指向 inode,所以只要删除源文件,软连接文件就无法正常访问,即使源文件指向的 inode 此时可能仍然存在。

不同点

一张图解释硬连接和软连接的本质不同:

image.png

硬连接直接引用源文件引用的 inode,软连接则直接引用源文件。
这点核心的不同点,也造就了以下诸多不同特性。对硬连接和软连接的不同点进行总结:

对比参数 硬连接 软连接
Inode number 硬连接文件和源文件拥有相同的 inode number 软连接的文件和源文件拥有不同的 inode number
目录 硬连接不允许连接目录 软连接允许连接目录
文件系统 不能跨文件系统使用 可以跨文件系统使用
数据 源文件内容可以在硬连接文件中使用 软连接只指向源文件,不保留文件数据
源文件删除之后 源文件删除,硬连接文件仍然可以访问源文件数据 源文件删除,软连接将无法访问源文件数据
速度 更快 更慢

其中,Inode number:全称 index node number,是 Linux/Unix 系统中文件的唯一 id;

参考资料