文章目录
- 软链接和硬链接
- 软链接的应用场景
- 硬链接的应用场景
- 当前目录和上级目录
- 总结
本篇要探讨的主题是关于软硬链接的概念
在Linux系统链接文件中有两种,一种是硬链接,一种是软链接,那么本篇就基于上述的两种链接方式来进行一定的总结和拓展
软链接和硬链接
假设现在我创建了这样的一个文件test.c,然后我执行了这样的指令
ln -s test.c newtest.c
这就是一层软链接,这样就建立起来了一个newtest.c,它链接到了test.c
那这是什么意思呢?这个软链接有什么用呢?
先观察一下属性:
从中可以发现,这两个文件的inode值不一样,并且链接好的这个文件有一个指向表明它是链接到这个test.c
再看硬链接的操作:
ln test.c hardtest.c
这里看出,这两个文件的inode值居然是一样的,并且还有一个数字从1变成了2,这是什么呢?有什么意义和价值呢?该如何理解呢?后面来介绍
首先可以得到一个初步结论
软链接提供的是一个独立的文件,而硬链接并不是一个独立的文件,原因是软链接有自己独立的编号,但是硬链接没有,所以从直白的角度来说就是这样的区别
第二个结论是,软链接其实可以类比成是一种快捷方式,为什么要有快捷方式?
其实原因就在这个字面意思上,因为快捷,在Windows系统中,想要调用一个文件有很多种方式,其中一个方式就是在桌面上调用它的快捷方式,还有一种方式是找到它的绝对路径下访问它的exe文件,很明显对于大部分使用场景来说,直接在桌面调用它的快捷方式是一种很便携的方式,而这里的软链接也是如此,我们假设现在的场景
软链接的应用场景
现在有一个test.c,里面存放了一些源代码,并且现在把他编译形成了一个可执行程序,如果我想正常运行它,就必须要找到它所在的绝对路径,然后运行它,这是没问题的,下面是对应的操作
[test@VM-16-11-centos Symbolic and Hard Link]$ ll
total 4
-rw-rw-r-- 1 test test 77 Jan 18 10:35 test.c
[test@VM-16-11-centos Symbolic and Hard Link]$ gcc -o test.exe test.c
[test@VM-16-11-centos Symbolic and Hard Link]$ ./test.exe
hello world
但是缺点也很明显,我想要运行这个文件,必须要在Symbolic and Hard Link
这个文件夹下进行运行,如果我不想在这里运行,我想去别的地方也能轻松的访问到可以吗?这就需要借助软链接的帮助了
test@VM-16-11-centos linux-system-and-network]$ ln -s ./Symbolic\ and\ Hard\ Link/test.exe softtest
[test@VM-16-11-centos linux-system-and-network]$ ll
total 28
drwxrwxr-x 4 test test 4096 Dec 7 21:12 File
drwxrwxr-x 3 test test 4096 Nov 16 18:25 Mybash
drwxrwxr-x 2 test test 4096 Dec 7 21:13 my_c_lib
drwxrwxr-x 11 test test 4096 Dec 7 21:06 Process
-rw-rw-r-- 1 test test 107 Dec 7 21:08 README.en.md
-rw-rw-r-- 1 test test 89 Dec 7 21:08 README.md
lrwxrwxrwx 1 test test 33 Jan 18 10:44 softtest -> ./Symbolic and Hard Link/test.exe
drwxrwxr-x 2 test test 4096 Jan 18 10:36 Symbolic and Hard Link
[test@VM-16-11-centos linux-system-and-network]$ ./softtest
hello world
此时达成的效果其实与创建了一个快捷方式基本一样,软链接的主要运用场景就在于快速定位文件信息
那么工作的原理是什么呢?由前面的例子可以有初步的理解是,软链接有一个独立的inode编号,这也就意味着在创建软链接的时候会在文件系统中做出修改,会修改文件系统中位图和数据块等等的信息,而软链接出来的文件也是文件,既然是文件就必然会有内容和属性,那么就分别进行讨论文件中到底放的是什么东西?
内容:既然是软链接,那软链接内部的内容就是指向的目标文件的路径,换句话说可以认为,软链接文件的内容中保存的是目标文件
属性:和普通文件基本一致
硬链接的应用场景
关于硬链接,可以从它和软链接的区别入手,一个很明显的区别就是,硬链接不是一个独立的文件,它的inode编号和原来的文件是相同的。这意味着硬链接和目标文件从inode获取的编号是一样的,也就意味着访问的会是同一个文件的属性和同一个属性的内容,在前面的知识中提到过,文件名其实并不是文件的属性,文件名只是在目录的数据块中会和文件的inode编号建立一个映射关系,也就是说inode和文件名是分开存储的,也就是说硬链接产生的文件其实就是新建了一层映射关系,只不过这个inode的映射关系建立的是一个前面的已经存在的inode,只是新增了一个映射关系
最后要谈到的一点是这个数字的问题
这个数字到底是什么呢?现在也不陌生了,这个数字其实就是硬链接数,这个有多少个映射关系指向这个inode,那么这个硬链接数也会随之而发生变化,从中得出的结论是,如果这个文件被删除了,但是它还有其他的硬链接数,那么它实际上被删除了吗?其实是没有的,那么什么情况下才是真正被删除了呢???
答案是,没有inode和它本身进行映射,也就意味着用户已经不需要这个inode了,在用户关心的这些文件中已经没有任何一个文件指向这个inode编号,那么不就意味着这个文件被删除了吗,而删文件在操作系统层面上就是删位图,把位图删除掉,就算是把这个文件清空了,那么在文件系统的层面上,它怎么知道有多少文件指向了我呢?文件该如何知道,自己在什么时候已经被用户所抛弃了,不再需要了呢?其实就是引出到了引用计数的概念,这个词也并不陌生,在前面的智能指针部分已经有了一个明确的概念,那么这里就不多进行阐述了,那么新增硬链接和删除硬链接本质上就是对这个inode的引用计数进行新增和删除,等到这个inode的引用计数变成0的时候,就意味着这个inode编号没有任何一个文件名和它建立联系,那么就算是真正意义上的删除了
文件名在目录中是唯一的,从某种意义来说,文件名就是一种指针,它指向了一个一个的inode,当文件名去掉一个指针,这个引用计数就减去1,而新增一个硬链接数,就相当于是有一个东西指向了这个inode编号,引用计数就加1
硬链接的本质就是相当于文件名和inode之间建立一层映射的关系,文件名相当于是一个指针,指向的是inode的编号,当我们需要访问的时候,就通过这个引用指针对这个文件进行新增或删除,删除的意义就是把这层文件名和inode编号之间的映射删除,并且同时对这个inode编号的引用计数减去1,当没有任何一个文件名指向它的时候,就表示要删除了,就把它在位图中进行合适的修改即可
当前目录和上级目录
有了这些基础知识,那么就可以根据这些知识解释一些现象了:
新建一个文件夹,它的硬链接数是2?为什么呢?
原因是有两个文件名指向这个inode,一个是上级目录,一个是当前目录,所以在这个目录中:
所以这个目录下就存在一个叫做当前目录的文件,它指向的就是这个inode,而它本身也会指向一个inode,所以就有两层映射关系
在这个目录下再新建一个目录,引用计数变成3了,这是为什么呢?
这就是上级目录的功劳了!在原来的基础上又多了一个上级目录指向了这个文件,自然引用计数就再加1了
从这个例子中也能看出来,为什么在调用cd ..
这个命令的时候可以回到上级目录?凭什么?凭的就是上级目录中存储的是上级目录的inode,我借助这个inode就是能进入这个目录下进行访问
总结
自此,就解决了软硬链接的问题,硬链接本身就是这样来进行路径的切换,用户用硬链接来构建Linux的整个路径结构,方便进行路径的回退,这就是硬链接的意义
那软硬链接的区别是什么?区别之一就是软链接是一个真正的文件名,有自己的文件名和inode,文件内部的内容存储的是目标文件,但是不能对于目录进行软链接