在讲这些链接之前,我们都会先讲如何创建它们!
对于软连接,在 linux 中,我们可以使用 ln
(link)指令带上 -s
选项来生成一个指定文件的软链接!
也就是说创建软链接的指令为:ln -s 指定文件 要创建的软链接名称
(注意软链接的名称是可以随便起的,但是为了可辨识度高,一般前缀为sort,后缀为 .link)
# 我们为log.txt创建一个软链接
[liren@VM-8-2-centos fileSystem]$ ln -s log.txt soft_log.link
[liren@VM-8-2-centos fileSystem]$ ls -li
1314728 -rw-rw-r-- 1 liren liren 0 Feb 2 15:39 log.txt
1314729 lrwxrwxrwx 1 liren liren 7 Feb 2 15:40 soft_log.link -> log.txt
我们通过 ls -li
指令也可以看到这是我们第一次接触到文件类型为 l(link)的文件,并且可以看到 sort_log.link
和 log.txt
的 inode 是不同的,除此之外硬链接数量也没有变化,具体的可以看下图,硬链接数量后面会讲!
软链接文件是一个独立的文件,有自己的 inode 属性和数据块。数据块中存储的是软链接指向目标文件的路径和文件名,通过保存的路径访问源文件,因此源文件被删除则无法再访问,通过路径将找不到源文件,这时候软链接就会失效。
软链接类似 windows 中的快捷方式,快捷方式怎么用软链接就怎么用。比如桌面看到的软件保存的是其它的路径,在系统中可能你要运行的可执行程序在一个很深的目录下,就可以在较上层的目录中建立软链接来直接使用。
所以我们可以总结一下软链接(也称为 符号链接)的特点:
- 软链接文件的文件类型为 ‘l’ (link的第一个字母),即链接文件!
- 软链接并不会改变原文件的硬链接数!
- 软链接拥有自己独立的 inode,是一个全新的文件,所以软链接文件的文件属性和原文件并不相同!
- 软链接中保存的是源文件路径和自己的属性内容!
如果想删掉软链接,可以通过 rm 指令删掉,但是我们更推荐下面这种做法:
unlink sort_log.link #删除软链接
想要创建一个硬链接,和软链接差不多,只需要去掉 -s
选项即可!
也就是说创建硬链接的指令为:ln 指定的文件 硬链接的名称
(一般我们习惯**硬链接的名称以 hard 开头,以 .link 结尾**)
# 我们为log.txt创建一个硬链接
[liren@VM-8-2-centos fileSystem]$ ln log.txt hard_log.link
我们可以看到,硬链接的 inode 编号居然和源文件是一样的,也就是说硬链接其实不是一个全新的文件,只是当前目录多添加了一个 hard_log.link
对应的 inode 编号和文件名的映射而已!除此之外这个硬链接数我们还没介绍,下面先来看看它们分别对应的内容:
符合我们的预期,因为硬链接本质上和源文件指向的都是同一个文件!下面我们尝试来删掉文件:
可以清楚看到删除源文件之后,硬链接的 inode 编号还是原来的那个,并且硬链接数从 2 变成了 1,甚至我们来查看一下软硬链接它们分别的内容:
可以发现硬链接依然能够看到文件的内容,但是软链接已经失效了,因为软链接中存放的是原来源文件的路径,现在源文件没了,当然就找不到了,也可以侧面说明源文件和硬链接文件的路径是不同的!
至于如何删除硬链接,这和删除软链接是一样的,都可以通过 rm 和 unlink 指令来删除:
[liren@VM-8-2-centos fileSystem]$ unlink hard_log.link #删除硬链接
[liren@VM-8-2-centos fileSystem]$ ll
total 0
lrwxrwxrwx 1 liren liren 7 Feb 2 15:40 soft_log.link -> log.txt
[liren@VM-8-2-centos fileSystem]$
所以现在我们就可以来解释硬连接数是什么了!
通过上面我们也能观察到,硬链接和源文件的关系本质上类似于 C++ 中的引用,并且利用了**引用计数**的概念,也就是说,创建一个硬链接其实就是多了一个指向源文件的一个引用,对于目录来说,只会多添加了一个 inode 和文件名的映射关系而已,我们可以看下图,更好的理解这个关系:
这也就是为什么我们把源文件删掉了之后,我们还是能查看 hard_log.link 的内容,其实就是被指向文件还没有被删掉,只有当这个文件没有被任何 inode 指向,也就是硬链接数 count == 0 ,该文件才会被回收释放!
所以其实软链接中如果源文件被删了,但是其实软链接指向的源文件的指向文件其实有可能还是存在其它文件指向它的,不一定就是被删了!
1、软链接会生成独立的 inode,硬链接与源文件 inode 相同
2、软链接只保存源文件的路径,硬链接则是一个源文件的 “文件别名”
3、源文件删除之后,软链接失效,而硬链接依然有用
4、只有硬链接才影响源文件的硬链接数
软链接最常见的作用之一就是作为快捷方式使用,如下:log.txt 程序在很深的路径下,以至于我们每次运行它都很不方便,此时我们就可以为它建立一个软链接。
硬链接的应用其实就涉及到了我们目录等文件底层了,我们先来创建一个普通文件:
可以看到普通文件的硬链接数是 1,这个不难理解,因为 log.txt 本身就是一个 inode 和文件名的映射,所以硬链接数才为 1。接下来我们创建一个目录看看:
咦是不是很奇怪,为什么目录的硬连接数是 2 呢,如果说目录文件名本身和它的 inode 有映射,那顶多就只有一个硬链接数啊,为什么会有两个啊 ❓❓❓
其实是这样子的,还记得我们常见目录的时候,目录里面会默认存在两个目录文件吗,分别是 .
和 ..
,有人可能会问这也是文件吗,那肯定啊,谁规定说文件名一定得是英文字母呢!
所以我们到 file 目录下面看一看:
平时我们一直使用 cd ..
等指令,为什么能到达上级目录,其实就是因为这个 ..
文件就是指向上级目录的(其实就是一个上级目录的别名)。当我们创建一个目录的时候,目录里面默认放的这两个文件,其中 .
就指向 file 这个当前目录,所以也就是说硬链接数为 2 就是来自于 .
和 file
本身。
那我们看到 file 目录下还有一个 ..
文件,为什么它的硬链接数是 3 呢 ❓❓❓
其实很好理解,配合下图来解释,我们在 file
目录下存在一个 ..
文件,表示的是 file
的上级目录也就是 fileSystem
,而 fileSystem
中又存在一个 .
文件,另外再加上 fileSystem
目录的本身,一共就是 3 个,所以硬链接数就是 3 !
总结一下就是硬链接的应用非常的重要,它为我们提供了在目录和目录之间的快速切换!
注意在 Linux 不允许用户给目录创建硬链接,只能系统自己创建 .
和 ..
,这是因为给目录创建硬链接可能会在目录中引入循环,使得在目录遍历时系统陷入无限循环当中,从而导致无法定位到访问目录(比如系统从根目录开始查找一个文件,当在查找过程中遇到根目录的硬链接时就会造成环路查找)。