【Linux】认识文件(四):文件系统,inode,以及软硬连接
- 一.磁盘(仅了解)
- 1.组成
- 2.CHS寻址
- 二.抽象化磁盘(仅了解)
- 三.文件系统
- 1.什么是文件系统
- 2.ext2文件系统的结构
- i.Date blocks
- ii.Block Bitmap
- iii.inode
- 1.inode Table
- 2.inode Bitmap
- iiiii.GDT
- iiiiii.Super block
- 四.文件的增删查改
- 1.创建一个文件需要干什么
- 2.删一个文件需要干什么
- 3.查找一个文件需要干什么
- 4.如何查找文件的inode
- 五.文件的软硬链接
- 1.什么是软链接
- 2.软链接的应用
- 3.什么是硬链接
- 4.硬链接数
- 5.硬链接的应用
- 6.硬链接和软连接的区别
在文件(一)的博客中曾经提到过:
文件分成打开的文件 和 未打开的文件
前面我们讲了内存中被进程打开文件的管理方式
现在将要带来在未打开的文件管理方式
一.磁盘(仅了解)
这里我们就挑了硬盘作为存储器,来了解磁盘的工作方式。
硬磁盘就是我们常常听说的机械硬盘。
虽然固态硬盘相比于机械硬盘,读取速度更快
但是架不住机械硬盘便宜啊
所以在服务器中,机械硬盘依旧是主流
所以这里也是选择磁盘来讲解
1.组成
磁盘结构:
磁盘的结构大致是这样。
其中:
- 磁头:是专门用来读写数据的
- 磁盘面:是存储数据的地方
这里来看一下磁盘面的结构:
- 磁道则可以理解成划分磁盘面的一个结构,一个磁道上有多个扇面
- 扇区:可以理解为磁盘中最小的存储单元
2.CHS寻址
如果我们想要向磁盘中读取和写入数据,我们首先要干的是什么?
就是要定位,定位要读取的数据位置或者要写入数据的位置
上面我们知道了,扇区是存储数据的最小单元。
所以我们要找到对应的存储数据其实就是找到正确的扇区位置
所以接下来的问题就变成了,在磁盘中定位一个扇区的方式
首先:
看到一个磁盘中有多个磁面,所以首先要定位到正确的磁面。
这里我们能注意到,一个磁头对应一个磁面
所以要找到正确的磁面只要找到对应的磁头就行。
找到正确的磁面后
接下来就是要确认的就是对应的磁道
然后只要知道对应的扇区在对应磁道的第几个就行了
这就是CHS寻址方式
1.哪个磁头,2.哪个磁道(柱面),3.第几个扇区 确定这三个,就能定位数据
二.抽象化磁盘(仅了解)
说完了实体的磁盘,我们的目标是了解文件在系统中是怎么样
将磁盘进行管理的。
但是我们直接将磁头磁盘磁道搬进去肯定是不行的。
所以我们需要将磁盘进行抽象化,理解成计算机好管理的方式。
我们知道磁盘在物理上是圆形的
但是在逻辑上可以把一个盘面想象成线性结构
我们知道磁盘中有多个磁面
这里我们可以把磁面看做一个线性结构(通俗点就是顺序表)
这样子的话,磁盘中的多个磁面就变成了多个线性结构
这样我们就可以把磁盘看做一个大的线性结构
现在磁面中还有磁道和 扇面
我们知道扇面是最小的存储单元
一个磁道上有多个扇面
而一个磁面中有多个磁道
所以和磁面一样,可以把磁道看做一个线性结构
这样多个
里面每个单位都是扇面
基本上大致就能分成这样。
可以说,扇面就是最小的存储单位
如果我们想要在磁盘中进行存储和删除和修改内容时:
都要找到对应的扇面位置进行操作
所以首先就是要找到存储位置对应的扇面
经过上面将磁盘进行抽象化,我们能清楚的发现:
通过第几个盘面,第几个磁道,第几个扇面
我们就能准确得定位一个扇面的位置
我们上面讲了这么多,只是把一整个磁盘进行了抽象化了
在实际使用磁盘的时候,我们会将磁盘进行分区:
一块分成不同分区了以后,肯定要进行管理
接下来就轮到文件系统的登场了。
三.文件系统
1.什么是文件系统
上面我们是把磁盘进行了线性化,发现对应的内容进行存储的扇面进行定位,然后就能进行增删查改
但是我们在日常使用的时候,我们用户只是创建和删除文件而已,计算机甚至没有提到过扇面磁道磁面的概念
这就是文件系统的作用了:
文件系统在用户层为用户提供了文件的增删查改的功能,在底层将用户的操作转化成对磁盘的操作
所以上面的磁盘只是了解一下,因为真正和磁盘打交道的是文件系统,不是用户。
我们要做的是了解文件系统的操作和它的结构。
不同系统的不同版本的文件系统可能都不用一样
所以这里就挑一个经典的文件系统进行讲解:Linux ext2文件系统
2.ext2文件系统的结构
结构大图:
这里能看到一个磁盘进行分区以后,一个大区中:
有BootBlock和多个Block group
Boot Block主要功能是:在计算机启动时负责引导操作系统的加载和启动过程
一个大区中有多个Block group,我们主要讲的就是它的构成。
接下来讲分别讲解各个部分对应的作用
i.Date blocks
这算是Block group中最大的一个部分了
主要存储的是文件的内容
因为在linux中,文件的内容和文件的属性是分开来存储的。
这里面的一个个块就是文件系统块
一般大小是4kb,一般都是磁盘格式化时定义好的
从底层看,一个快就是由一个个扇区组合而成的,可以说一个块就是一部分扇区的集合
一个文件可能由多个文件系统块组成
这里我们假设一个文件系统块是4kb,但如果一个文件实际内容大小就只有1kb
那这个文件依旧还是占据一个文件系统块
ii.Block Bitmap
听这个名字就知道,它是block的位图
最主要的作用是判断datablock中的用于存储的比特位分配情况
如果想要在Date block中写入数据,首先要通过Block的位图
找出没有被使用的区块号,然后返回给文件系统,对空闲的区块号进行数据写入
iii.inode
这里我们来了解什么是inode
还记得前面说过的:Linux中文件内容和文件属性是分开来存放的
inode就是一个结构体,描述的就是文件的属性
这里是随便列举的几个属性
但是其中有一个比较重要的:int blocks[nums]
这个是为了找到Blocks中存储的文件内容的对应的区块号
这里就通过图片让大家认识更清晰一点
这里用的是直接索引,对应的区块号存储的就是文件的实际内容
接下来就是间接索引
就比如这里的7,8,9区块号存储的是存储这个文件的内容的其他区块号
这种就叫做二级索引
要注意:可能不止有二级索引,还有可能有三级,四级索引
这种方法可以增加记录文件区块号的大小,只依赖block[nums]太少了
不光如此
每个文件都有一个单独的inode编号,系统中不是通过文件名来区分文件的, 而是通过inode编号区分的
文件名不属于inode中的属性
inode 编号是按照在该对应组的存储的顺序进行分配的
每个组都有自己对应的inode表和inode存储区域
1.inode Table
inode Table听名字就能大概知道:存储inode的地方
这里要注意,inode是有编号的。
磁盘分区后,不同区的inode是完全分隔的,没有关系。
就比如:
A区的inode编号100对应的可能是文件A
B区的inode编号100对应的可能是文件B
但是相同区的不同组inode虽然是分隔的,但是还是有关系的
比如A组的inode范围是0-100
那么B组的inode就要从101开始
这里要注意特殊情况
:
有可能会出现inode table存储完了,但是Dateblock 还没有用光
同样也会有可能inode table还有,但是Data Block用光了
2.inode Bitmap
这个和Block Bitmap一致,存储的就是inode table中的分配情况
iiiii.GDT
GDT记录了Block group内其他所有区域(inode bitmap,Block Bitmap等)的信息
包含了块组的相关信息,包括块位图的位置。通过读取块组描述符中的块位图位置,可以获得块组的分配情况。
iiiiii.Super block
SuperBlock是:
每个Block group的大小,每个Block group的inode数量,每个Block group的block数量,每个Block group的起始inode
这个SuperBlock不用每个组都有,因为它描述的是所有组的分类情况
但是也不能只有一个,因为一个如果挂掉了,整个磁盘的分类情况都要毁了
四.文件的增删查改
这里我们通过文件系统,来看看想要对文件进行增删查改,文件系统都进行了哪些操作?
1.创建一个文件需要干什么
1.创建文件一定是在一个路径下进行创建的,路径就能确定文件在哪个分区和哪个分组里面
2.找到对应分区和分组后,就是分配inode:
对应组的GDT会查看它记录的inode Table和DataBlock的占用的情况
如果空间足够,则会通过inodebitmap,将最近一个没有被占用的inode编号,作为你的inode
如果还需要写入文件内容的话
3.写入数据
首先告诉写入了多少大小的数据,到GDT中查看是块使用情况,判断空间是否大小充足
在block bitmap中找到没有被使用的块号
将它传给对应的inode并写入Block[nums]中,之后到对应的data block中进行数据写入。
2.删一个文件需要干什么
1.找到文件对应的inode,在对应的inode中找到存储的对应的区块号
2.在block bitmap将对应的区块置0,表示该区块允许被覆盖
这里要注意不会去动data block中的内容
所以计算机中的删除相当于允许被覆盖
这就是为什么计算机中的拷贝复制很慢
因为需要动Data Block的内容
但是删除却很快,因为只是动了Bitmap将对应的区块置0,没有动 DataBlock
3.查找一个文件需要干什么
1,找到文件的inode,然后通过inode bitmap判断inode是否有效,
2.通过inode中的block,通过block bitmap判断内容是否有效
3.data block中进行读取内容
4.如何查找文件的inode
这里我们能发现:
这里面的每一步都是要找到文件的先找到文件对应的inode
在讲如何找到inode之前, 首先来聊一下目录:
如何理解目录?
目录也是文件,通过文件=内容+属性
所以目录也有内容,放的是该目录下所有的文件名字,和文件名对应的inode映射关系
所以想找到文件对应的inode:
就要找到自己所在的目录的文件内容中的自己的文件名和inode的映射关系
所以通过上面,我们可以想到以前没想到的几个问题:
1.为什么同一个目录下不能有同名文件
因为要通过文件名找到自己的inode
2.目录下没有w,我们无法创建文件
就算创建了文件夹,也无法将(没有权限)文件名和inode的映射关系写进目录中的内容中
3.目录下没有r,无法查看文件
因为想要读文件内容,也需要读目录中的文件名和inode映射关系,没有权限读不了
所以想找到文件对应的inode:就要找到自己所在的目录的文件内容中的自己的文件名和inode的映射关系
那也就是说要找到文件的名字,首先要找到目录的内容
需要找到目录的内容,就要找到目录的inode
要找到目录的inode,就要找到目录的目录的文件内容
这样不就无限查找上去了吗,确实是这样
但是查找到根目录就行了。
所以要访问文件,都需要一路向上递归,找到根目录,然后再一路返回,找到对应目录的inode,最后找到本文件的inode
这样确实效率很低,所以系统一般会将你经常访问的目录通过dentry缓存进行记录
通过这里我们就知道了
要查找文件就需要目录中有文件名和inode的映射关系
五.文件的软硬链接
1.什么是软链接
软链接:
ln -s file.txt soft-link
(soft) 目标文件 创建的软链接名
从这里的inode我们能看到
软链接是一个独立的文件,有独立的inode
所以:
软链接是一个独立的文件,有独立的inode有独立的数据块,里面存储的是指向的文件的路径
将软连接指向的文件进行删除后软链接就会失效
软链接就类似于win中的快捷方式
2.软链接的应用
软链接的应用就可以看做是windows中的快捷方式
快捷方式有啥作用应该也不用多讲了吧
应该大伙基本上都用过
3.什么是硬链接
硬链接:
ln test.txt hard-link
目标文件 创建的软链接名
从这里能看到:
硬链接不是一个独立的文件,没有独立的inode
所谓建立硬链接的本质其实是:
在特定目录的数据块中新增另一个硬链接文件名和指向被链接文件的inode编号的映射关系
类似于C++中的取别名
4.硬链接数
不知道大伙有没有发现:
创建一个 文件的硬链接后,这个数字发生了增加
相反的是软连接就不会有这个功能。
这个数字就叫做硬链接数
从名字上看:就是一个文件被硬链接的数量
但是我们回顾硬链接的本质:在特定目录的数据块中新增另一个硬链接文件名和指向被链接文件的inode编号的映射关系
所以说硬链接数就是有多少个文件名和这个inode建立了映射关系。
任意一个文件都有inode,每一个inode内部,都有一个叫做引用计数的计数器(表明有多少个文件指向我)
如果当计数器变成0的时候文件才会被删除,因为没有一个文件名能访问到这个inode了
这就是为什么硬链接的源文件被删除后,硬链接没有失效,因为引用计数没有变成0,还有文件名能访问到这个inode。
5.硬链接的应用
硬链接有什么用
这里可以在回头看看目录
这里我们能发现
空的目录文件比常规文件的硬链接数多一个
空的目录文件多了两个文件:“.“”和 “…“
这里应该不难猜出: “.”其实是目录文件的硬链接
那也可以推出:"…"其实是父目录的硬链接
所以虽然硬链接的使用场景很少,但是是不可缺少的
6.硬链接和软连接的区别
这里来提两个问题:
1.软链接能连接目录吗?
2.硬链接能连接目录吗?
这个问题其实我们根据两个链接的原理其实就能猜出来
软链接存储的是链接目标的路径,是一个独立的文件
所以这里肯定是可以的
至于硬链接
硬链接的原理是:将硬链接创建的文件名和目标文件的inode产生依赖关系
相当于C语言中的取别名
这里我们来想想硬链接如果链接目录的问题:
如果一个A目录中塞进了一个硬链接B
同时这个硬链接B指向了A目录
但是硬链接只是类似于取别名,文件名不同,但是对应的inode是相同的
那么根据牛顿相对论,B硬链接A的同时,B也是被A硬链接的
这种情况就叫做循环链接
第二个问题:
1.软连接能跨系统吗
2.硬链接能跨系统吗
这其实也是想想原理就能理解的问题:
软链接只是记录了文件的路径,所以和文件啥系统没啥关系。
但是硬链接就不一样了,它记录了文件名和inode的映射关系
先不说不同系统的文件系统不一致
inode在同一个盘中,不同分区的inode都不能通用,更别说跨系统了,跨区都难(在ext2中)