目录

Linux 文件链接

在 Linux 系统中,存在一类特殊的文件:链接文件。使用 ln 命令创建链接是很多 Linux 入门教程都会提及的操作,但是创建的链接类型是什么样的,以及硬链接与符号链接之间有什么区别,并没有解释清楚。

硬链接

硬链接(hard link)在 Linux 系统中会指向被链接文件的 inode 号,也就是说,创建一个文件的硬链接只是创建了一个指向对应 inode 号的「入口」。这也就解释了为什么硬链接不能指向不存在的文件,并且必须在同一个文件系统下。此外,具有硬链接关系的文件彼此是平等的,即首个被创建的文件并没有特殊的「地位」,而删除这些文件实际上只是 inode 的硬链接数减一,并不影响其他硬链接。

可以使用以下示例来理解硬链接:

## 创建新文件 file 并写入 hello! source file.
$ echo "hello! source file." > file

## 检查该文件内容
$ cat file
hello! source file.

## 查看 file 文件的 inode 信息。inode 号为 6567274,硬链接数为 1
$ stat file
  文件:file
  大小:20        	块:8          IO 块大小:4096   普通文件
设备:0,42	Inode: 6567274     硬链接:1
权限:(0644/-rw-r--r--)  Uid: ( 1000/     sam)   Gid: ( 1000/     sam)
访问时间:2022-06-29 15:32:10.911018864 +0800
修改时间:2022-06-29 15:32:10.911018864 +0800
变更时间:2022-06-29 15:32:10.911018864 +0800
创建时间:2022-06-29 15:32:10.911018864 +0800

## 创建 file 的硬链接 file.hard
$ ln file file.hard

## 查看现有文件
$ ls -l
-rw-r--r-- 2 sam sam  20  6月29日 15:32 file
-rw-r--r-- 2 sam sam  20  6月29日 15:32 file.hard

## 查看 file.hard 文件的 inode 信息。inode 号与 file 文件一致,并且硬链接数变为 2
$ stat file.hard
  文件:file.hard
  大小:20        	块:8          IO 块大小:4096   普通文件
设备:0,42	Inode: 6567274     硬链接:2
权限:(0644/-rw-r--r--)  Uid: ( 1000/     sam)   Gid: ( 1000/     sam)
访问时间:2022-06-29 15:32:10.911018864 +0800
修改时间:2022-06-29 15:32:10.911018864 +0800
变更时间:2022-06-29 15:33:11.482896399 +0800
创建时间:2022-06-29 15:32:10.911018864 +0800

## 删除 file 文件
$ rm file

## 再次查看 file.hard 文件的 inode 信息。inode 号不变,但硬链接数减为 1
$ stat file.hard
  文件:file.hard
  大小:20        	块:8          IO 块大小:4096   普通文件
设备:0,42	Inode: 6567274     硬链接:1
权限:(0644/-rw-r--r--)  Uid: ( 1000/     sam)   Gid: ( 1000/     sam)
访问时间:2022-06-29 15:32:10.911018864 +0800
修改时间:2022-06-29 15:32:10.911018864 +0800
变更时间:2022-06-29 15:41:15.547996868 +0800
创建时间:2022-06-29 15:32:10.911018864 +0800

## 检查 file.hard 文件内容,与 file 文件一致
$ cat file.hard
hello! source file.

符号链接

符号链接(symbolic link,又称软链接)是一类特殊的文件,其中存储的是被链接的文件的路径。创建符号链接时,链接文件会被单独分配一个 inode 号,其存储的文本字符串会被操作系统解释为一条指向另一个文件或者目录的路径,从而实现链接。对符号链接的操作一般都是透明的,即对符号链接的访问会直接对目标文件进行操作。与硬链接不同,符号链接的存在并不依赖于目标文件或目录,并且符号链接可以指向目录。如果符号链接被删除,目标文件不受影响;如果目标文件被删除或者移动,符号链接依然存在,只是指向一个不存在的路径,这种情况被称为已断开的链接(dangling link)。

可以使用以下示例来理解符号链接:

## 创建新文件 file 并写入 hello! source file.
$ echo "hello! source file." > file

## 检查该文件内容
$ cat file
hello! source file.

## 查看现有文件
$ ls -l
-rw-r--r-- 1 sam sam  20  6月29日 16:49 file

## 创建 file 的符号链接 file.soft
$ ln -s file file.soft

## 再次查看现有文件,file.soft 指向 file
$ ls -l
-rw-r--r-- 1 sam sam  20  6月29日 16:49 file
lrwxrwxrwx 1 sam sam   4  6月29日 16:49 file.soft -> file

## 检查 file.soft 文件内容,将直接访问 file 文件
$ cat file.soft
hello! source file.

## 删除 file 文件
$ rm file

## 再次检查 file.soft 文件内容,已无法访问 file 文件
$ cat file.soft
cat: file.soft: 没有那个文件或目录