软连接和硬连接引出的linux目录系统的猜想

2018-12-08  本文已影响0人  踏歌行_161c

说到这个链接,就需要从整个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)

上一篇下一篇

猜你喜欢

热点阅读