软链接 & 硬链接
在Linux下,链接文件分为两类:软链接和硬链接。在Linux上文件被分为两部分:用户数据(user data)与元数据(meta data)。用户数据即文件数据块是记录文件真实内容的地方;元数据则记录了关于文件的附加信息,如文件大小、创建时间、所有者等信息。在Linux下系统通过文件元数据中的inode号来唯一标识文件。文件名只是为了方便记忆。硬链接与软链接的引入主要是为了解决文件的共享问题。
硬链接
若一个inode号对应多个文件名时,则称之为硬链接。硬链接具有以下几个特性:
- 文件拥有相同的inode号和数据块;
- 只能对已存在的文件创建硬链接;
- 不能跨越文件系统创建硬链接;
- 不能堆目录创建硬链接;
- 删除一个硬链接文件不影响其他相同inode号的文件。
软链接
在Linux中,若文件的数据块中存放的内容是另一文件的路径名,则称之为软连接。软链接类似于Windows系统下的快捷方式。软连接有自己的inode号和用户数据块。为此,软链接避免了硬链接的诸多限制,软链接主要具有以下特点:
- 软链接有自己的文件属性及权限等;
- 可以对不存在的文件或目录创建软链接;
- 软链接可以跨越文件系统创建;
- 删除软链接时不会影响被指向的文件;
- 若原文件被删除时,相关软链接文件被称为死链接(当该路路劲的文件重新创建时,死链接可以恢复正常)。
链接文件的创建
ln命令是Unix/Linux下用于在文件之间创建链接的命令。它有以下四种形式:
ln [OPTION]... [-T] TARGET LINK_NAME (1st form)
ln [OPTION]... TARGET (2nd form)
ln [OPTION]... TARGET... DIRECTORY (3rd form)
ln [OPTION]... -t DIRECTORY TARGET... (4th form)
第一种形式创建一个名为LINK_NAME
的链接指向TARGET
。第二种形式在当前目录创建指向TARGET
的链接。第三、四种形式为多个TARGET
在指定的DIRECTORY
目录创建链接。
ln命令默认创建的是硬链接,通过--symbolic
或-s
选项可以创建软链接。ln命令在建立链接时,新链接的名称不应该存在。当在建立硬链接时,TARGET
必须存在。下表给出了部分ln命令选项说明,更多的可以使用man ln
查看。
选项 | 说明 |
---|---|
-f, –force | 链接时删除已有的目的文件 |
-i, –interactive | 删除已有的目的文件时进行询问 |
-s, –symbolic | 创建软链接文件 |
-S, –suffix=SUFFIX | 重写默认的备份后缀 |
示例
接下来的示例展示了ln命令的基本用法,以及软链接与硬链接之间的一些细微区别。
user@host:~$ mkdir ln-test && cd ln-test
user@host:~/ln-test$ echo 'hello world' > src-file
user@host:~/ln-test$ cat src-file
hello world
user@host:~/ln-test$ ln src-file hard-src-file
user@host:~/ln-test$ ln -s src-file soft-src-file
user@host:~/ln-test$ echo 'Hello World!' > src-file
user@host:~/ln-test$ cat hard-src-file
Hello World!
user@host:~/ln-test$ cat soft-src-file
Hello World!
user@host:~/ln-test$ rm src-file
user@host:~/ln-test$ cat hard-src-file
Hello World!
user@host:~/ln-test$ cat soft-src-file
cat: soft-src-file: 没有那个文件或目录
user@host:~/ln-test$ ln no-exist-file hard-no-exist-file
ln: failed to access "no-exist-file": 没有那个文件或目录
user@host:~/ln-test$ ln -s no-exist-file soft-no-exist-file
user@host:~/ln-test$ mkdir test
user@host:~/ln-test$ ln test hard-test
ln: "test": 不允许将硬链接指向目录
user@host:~/ln-test$ ln -s test soft-test
首先,建立测试目录并进入测试目录,接着创建名为src-file
的文件,内容为hello world
。第5、6行分别为该文件建立硬链接hard-src-file
和软链接soft-src-file
。紧接着,我们修改文件src-file
为Hello World!
,可以看到,无论是硬链接还是软链接,其内容都与src-file
一致。在示例的第12行中,我们删除了原文件src-file
,再次查看时,通过软链接方式建立的文件无法打开,而采用硬链接创建的文件的内容则没有发生变化。在示例的17、19行展示了对于不存在的文件建立硬链接与软链接的区别,其中,当原文件不存在时,无法为文件创建硬链接,然而,软链接则可以成功创建。示例的最后展示了对目录建立硬链接与软链接的区别,从上可以看出,不能为目录创建硬链接,只能创建软链接。
参考
[1] User Commands
[2] 理解Linux的硬链接与软链接