软链接、硬链接到底是什么?

什么是链接?

简单理解,链接本身是一个文件,这个文件是对另一个文件的引用。你可以理解为链接是 Windows 中的快捷方式。

什么是软链接、硬链接?

软链接、硬链接是文件。
软链接(soft link)是指这个文件指向源文件的路径名。
硬链接(hard link)是指这个文件直接指向源文件在硬盘的区块。

举个栗子,建立基本认知

比如我们有一个源文件:

echo "Hello, world" > origin.text

vim origin.text
# 将会看到如下内容
Hello, world

创建一个软链接

ln -s origin.text soft-origin.text

创建一个硬链接

ln origin.text hard-origin.text

我们来查看一下 soft-origin.texthard-origin.text 的内容:

cat soft-origin.text
# 将会看到如下内容
Hello, world

cat hard-origin.text
# 将会看到如下内容
Hello, world

再来查看一下文件属性

ls -il
total 16
13050427619 -rw-r--r--  2 fizz  staff  12 Dec  3 20:54 hard-origin.text
13050427619 -rw-r--r--  2 fizz  staff  12 Dec  3 20:54 origin.text
13050427755 lrwxr-xr-x  1 fizz  staff  11 Dec  3 20:55 soft-origin.text -> origin.text

可以看到,我们创建了两个额外的文件。

软链接、硬链接的区别是什么?

举个栗子,展示区别

ls -il
total 16
13050427619 -rw-r--r--  2 fizz  staff  12 Dec  3 20:54 hard-origin.text
13050427619 -rw-r--r--  2 fizz  staff  12 Dec  3 20:54 origin.text
13050427755 lrwxr-xr-x  1 fizz  staff  11 Dec  3 20:55 soft-origin.text -> origin.text

输出的结果中,最左侧的 13050427619 这列代表文件在硬盘的区块。
可以看到:

  • 源文件和硬链接文件,区块地址一致,都为 13050427619
  • 源文件和软链接文件,区块地址不一致,源文件为 13050427619,软链接为 13050427755
  • 权限描述符不同。-rw-r--r-- !== lrwxr-xr-xlrwxr中的 'l' 代表 这是一个 Symbolic link(符号链接)。更多请查看:meaning-of-l-in-lrwxr-xr-x
  • soft-origin.text -> origin.text 和另外2个文件的展示不同。

这个区块地址有一个专业名词叫 inode

我们来理解一下区块的不同。

修改 hard-origin.text 内容:

$ echo "welcome to https://blog.zilin.cc" >> hard-origin.text

$ cat hard-origin.text
Hello world
welcome to https://blog.zilin.cc

$ cat origin.text
Hello world
welcome to https://blog.zilin.cc

修改 soft-origin.text 内容:

$ echo "welcome to zilin.cc" >> soft-origin.text

$ cat origin.text
Hello world
welcome to https://blog.zilin.cc
welcome to zilin.cc

$ cat hard-origin.text
Hello world
welcome to https://blog.zilin.cc
welcome to zilin.cc

$ cat soft-origin.text
Hello world
welcome to https://blog.zilin.cc
welcome to zilin.cc

接下来我们执行下列操作,进行实验:

# 移除源文件 `origin.text`
$ rm origin.text

# 打印硬链接内容
$ cat hard-origin.text
Hello world
welcome to https://blog.zilin.cc
welcome to zilin.cc

# 打印软链接内容,得到错误内容
$ cat soft-origin.text
cat: soft-origin.text: No such file or directory

# 对软链接进行内容写入 "try"
$ echo "try" >> soft-origin.text

# 打印软链接内容
$ cat soft-origin.text
try

# 打印源文件内容
$ cat origin.text
try

# 打印文件属性信息
$ ls -il
total 16
13050427619 -rw-r--r--  1 fizz  staff  65 Dec  3 21:21 hard-origin.text
13050439823 -rw-r--r--  1 fizz  staff   4 Dec  3 21:24 origin.text
13050427755 lrwxr-xr-x  1 fizz  staff  11 Dec  3 20:55 soft-origin.text -> origin.text

稍微做解释:

  1. 移除源文件 origin.text
  2. 打印硬链接内容
  3. 打印软链接内容,得到错误内容 No such file or directory
  4. 对软链接进行内容写入 "try"
  5. 打印软链接内容
  6. 打印源文件内容
  7. 打印文件属性信息

可以看到:

  • 删除了 origin.text 后,并不影响 hard-origin.text 的读写。
  • 删除了 origin.text 后,soft-origin.text 的读取失败。因为所对应的源文件已经不在了。
  • 重新对 soft-origin.text写入数据,会重新创建一个origin.text文件。该文件是一个新的文件
  • 删除源文件,再次创建文件后,soft-origin.text 读取内容都是新内容。

总结

从使用的角度理解

  • 软链接是源文件的快捷方式,源文件删除了,软链接的内容就失效了。
  • 硬链接和源文件是同一级别的文件。源文件删除了,只代表源文件内容的一个打开方式删除了;只要还有硬链接,就不会删除源文件内容。

从指针的角度理解

文件名本身是指针,硬链接是和文件名同一级别的指针,软链接是指向指针的指针。

  • 文件名是一个指针。软链接、硬链接都是文件指针。
  • 源文件名指向源文件地址(指内容在硬盘存储的一个区块地址)。
  • 软链接指向源文件名(也就是源文件指针)。
  • 硬链接指向源文件地址。