Linux硬链接和符号链接
链接是一种赋予文件多个身份的方法。
Linux中的链接类似于Windows中的快捷方式,而与Mac OS中的别名相似。
但是,在Linux文件系统上,只有在没有剩余的硬链接之前,文件才会被删除。
硬链接与符号链接
每个Linux文件系统都使用一个索引节点号来表示一个文件,并且每个索引节点号在其文件系统内都是唯一的(至少在理论上是这样)。
硬链接基于inode编号,两个硬链接的文件具有相同的inode编号或者inode id。
由于这个原因,不允许跨文件系统进行硬链接,因为这会导致OS混乱。
想象一下这样一种情况,两个文件系统已经包含其自己的版本为inode编号为44733的data.txt文件,并且有人尝试创建从一个文件系统到另一个文件系统的硬链接。
繁荣?
确切地。
由于无法分辨硬链接和它的原始名称之间的区别,因此大多数文件系统也不允许硬链接到目录。
这最终将导致目录循环和悬挂的目录子树。
因此,我们有两个主要的硬链接限制:
- 硬链接不能链接目录。
- 硬链接不能跨越文件系统边界。
另一方面,符号(软链接或者符号链接)链接是一个特殊文件,其中包含指向另一个文件的路径。
此路径可以是绝对路径,也可以是相对路径。
通过符号链接,可以将多个文件名与单个文件相关联,还可以在目录之间创建链接。
由于symlink在其指向的文件路径旁边不存储任何信息,因此可以在整个文件系统中使用它。
但是,当移动或者删除链接源时,符号链接的行为会有所不同。
如果删除了源文件,则符号链接会因为指向不存在的文件而损坏。
以下是符号链接的主要功能:
- 符号链接可以在目录之间创建链接。
- 符号链接可以跨越文件系统边界。
- 如果删除源,则不会更新符号链接。
请注意,即使移动或者删除了硬链接,硬链接也始终引用源。
管理链接
Linux提供了ln命令来创建链接。
$ln [options] source link
源是原始文件,链接是我们要创建的链接的名称。
默认情况下,如果未指定任何选项,则ln命令将创建一个硬链接。
# touch file # ln file hardfile # ls -li 272956 -rw-r----- 2 root root 0 Nov 22 20:55 file 272956 -rw-r----- 2 root root 0 Nov 22 20:55 hardfile
请注意,硬链接始终具有相同的inode编号。
创建硬链接时,inode引用计数器会增加到2,换句话说,我们有两个链接到同一个文件。
只要计数器不等于零,文件系统就不会删除索引节点。
即使我们删除源文件,文件系统也只会删除两个现有链接之一。
另一个链接仍然存在。
只要我们不删除文件的最后一个硬链接即可。
要创建符号链接,我们必须将-s选项传递给命令:
# ln -s file softfile # ls -l lrwxrwxrwx 1 root root 4 Nov 22 21:04 softfile -> file
如果与-f方法一起使用,则ln删除具有目标链接名称的所有现有链接或者文件。
-i选项的作用非常相似,但是在替换任何现有文件和链接之前会提示。
如前所述,我们通常无法创建目录的硬链接。
但是,root用户可以通过将-d或者-F选项传递给ln来尝试这样做。
在现实世界中,此功能很可能会失败,因为大多数文件系统根本不支持此功能:
# mkdir /tmp/testdir # ln -d /tmp/testdir//mnt/newdir ln: failed to create hard link `/mnt/newdir' => `/tmp/testdir/': Operation not permitted