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

什么是链接?

简单理解,链接本身是一个文件,这个文件是对另一个文件的引用。你可以理解为链接是 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 这列代表文件在硬盘的区块。
可以看到:

这个区块地址有一个专业名词叫 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. 打印文件属性信息

可以看到:

总结

从使用的角度理解

从指针的角度理解

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