软连接和硬连接引出的linux目录系统的猜想
说到这个链接,就需要从整个linux文件系统来说了
everything is file
这个是linux的一个重要理念
也就是说所有的东西都是文件,包括键盘,显示器,硬盘,等等,都被抽象为一个文件
文件一共分为这几类
- 普通文件-
- 目录文件d
- 软连接l
- 快文件b
- 字符文件c
文件是怎么存储的?操作系统的设计者应该怎么设计文件存储呢?
试想一下,一个文件需要有很多信息来表示,文件名,文件信息,文件作者,文件内容
如果都放到一起,可以吗?
可以是可以,但是效率很低,查找的话,会很麻烦
这就有点像图书馆,其实我只需要知道isbn号码就可以确定书籍了,同样道理
操作系统将文件分为两块
用户数据(user data,用户数据)和元数据(meta data,存放inode,修改时间,大小等信息,但是没有文件名)
元数据和用户数据不是放到一起的,分开存放
meta data需要注意,里面有一个重要的字段 inode,是文件的唯一编号,就相当于身份证,是确定文件的唯一标识,
但是meta data里面没有存放文件名,为什么?文件名放到哪里了?
因为文件名是给人类看的,不是给计算机看的,用户只需要操作的就是文件名
所以,我只需要新建一个文件,将所有的文件名集中在一起,就可以实现快速搜索,快速定位等功能了,效率最高
这个文件就是目录,在linux中,一切都是文件,而目录也是文件
目录文件里面存放的就是一张表,每一项就是文件名和inode的对应关系
这样,`ls`命令就只需要在这个文件中搜索就可以了,效率最高
如果需要其他而外的信息,那么只需要按照inode找到对应的meta data文件就可以了
如果要修改文件,按照inode找到对应的user data区块即可
综上,linux系统,文件系统是分为三个层次的
- 1、目录文件
- 2、meta data
- 3、user data
频率使用最高的就是第一层,越往下约低,很完美
我们试着分析一下常见的命令的执行流程
```
ls test
```
打开test这个目录文件,直接输出所有的文件名即可
```
ll test
```
ll是要列出文件的详细信息,所以只查找目录文件是不够的,还需要查看对应的文件的meta data文件
```
vim test/a.txt;//假设该文件存在
```
这个就比较麻烦
- 1、找到对应的目录文件
- 2、在该文件中找到文件名对应的inode
- 3、跟据inode找到对应的user data块
再说链接
链接其实就是按照上面所说的文件系统的规则上建立起来的
硬连接到底有什么用处?为什么要有链接,直接使用源文件不好吗?
不好,如果直接给源文件,有这样几个问题
- 存储空间极大浪费
- 权限无法控制
为了解决这几个问题,linux使用了链接,分为两种:
软连接
软连接本质就是创建一个新的文件,这里说的新的文件的定义是创建了一个新的inode号,因为在linux中,inode是文件的唯一标示,meta data里面随意写,user data部分仅仅是一个源文件的指向而已,所以存储空间问题得到解决,并且权限问题也好限制
好处:
- 占用空间小
- 可以指向其他硬盘的文件,这个功能原来的系统无法提供
缺点:
- 如果源文件被删除了,那么软连接也就没用了,有风险
硬连接
硬连接的玩法就和软连接不同了
硬连接的本质其实就是在对应的目录文件下面添加了一项,对应的inode就是源文件了,并且将inode引用数量加上一个即可
好处:
- 安全
- 省空间
缺点
- 不能指向其他的硬盘
说到安全,就需要说一下删除了
```
rm -rf a.txt
```
执行这个命令的时候,需要
- 修改目录文件,将对应项删除掉
- 更新meta data中的inode引用次数,如果是0 的话,就删除掉meta data文件
没有meta data文件,也就相当于没有了文件
这样可以看到 新建一个硬连接好处其实很多
使用很小的代价,就可以创建出一个备份,因为只有是引用数是0才会删除文件
windows系统中为什么要舍弃硬连接呢?
很简单,硬连接虽好,但是用途太单一了,备份一个数据,直接拷贝一份放到其他地方这更符合人们的习惯
并且,如果用户不想要一个文件了,删除掉了,但是后来发现还有一个硬连接,这个就不符合用户的意愿了
并且 因为是inode是一个硬盘分的,不能指向其他硬盘,有局限,所以使用也就很少了
# 参考链接
- [https://my.oschina.net/michaelyuanyuan/blog/109147](https://my.oschina.net/michaelyuanyuan/blog/109147)
- [http://www.ruanyifeng.com/blog/2011/12/inode.html](http://www.ruanyifeng.com/blog/2011/12/inode.html)
- [https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/index.html](https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/index.html)