文件系统(精讲)
目录
理解硬件
CHS寻址方式
磁盘管理
引入文件系统
inode
Block Bitmap
inode Bitmap
GDT
Super Block
目录与文件名
路径解析
路径缓存
软硬链接
软链接
硬链接
软硬链接的区别
理解硬件
在普通的计算机里用得最多的就是磁盘,只是现在的笔记本电脑用的基本上是固态硬盘,但是台式电脑和企业级还在用磁盘,因为容量大,便宜的优点。由这个图我们可以知道一个盘是由很多个磁道组成的,而且每个磁道围着主轴构成了一个个同心圆,而为了方便又给每个磁道划分了扇区,这样我们的磁头就可以快速定位到每个扇区,从而达到读写的目的。
CHS寻址方式
这个图很清晰,我们可以知道一个盘一个盘围着主轴旋转,而且每一面都是可以存储数据的,还有一个机械臂杆,控制所有磁头,用来读写数据,磁头都是一个需要转,其他都会跟着转的。硬盘存储的基本单位是扇区(512字节)。读的时候机械臂杆控制磁头寻找需要的扇区,然后连同一整个柱面的数据都会被磁头读取,修改之后,又会连同一整个柱面写回去。
问题:512字节写入到某一个扇区中,磁盘应该如何转动?
我们可以结合上面的图来看,就能知道磁盘的转动。首先,磁头随着机械臂杆的控制前后寻找需要的磁道(柱面),然后盘片朝着一个方向旋转,由磁头寻找到需要的扇区,找到扇区后,因为有很多个磁头,需要定位一个磁头。这样就精准找到了需要找到的磁头。柱面、磁头、扇区。由这三个变量定位找到扇区,这种寻址方法就叫做CHS寻址。
磁盘管理
看图,这是我们小时候经常玩的磁带,它有一条一条的磁带,有时我们还经常把他拉出来,其实这里面就是保存的数据,我们拉出来之前在这个容器里面是一个一个的同心圆,但将他拉出来之后,就能被拉直成一条线,这样可以看出,他的本质就是一个线性结构,是个数组,磁盘其实也是一样的。
拉开之后就是一个数组,我们将他管理起来就是用一个数字----数组下标!!!
有一个小细节就是扇区并不和数组下标一样从0开始,而是从1开始的,但柱面和磁头就是从0开始的。
引入文件系统
文件系统(OS)访问磁盘并不是以扇区为单位,而是以“块”为单位,一个块有8个扇区,一般是4KB(可以调整)。文件系统使用磁盘块,以4KB为单位。
而分块管理又会有些难度,所以又在块里面分了组,以此类推,直到能够管理好为止。这种思想就是“分而治之”。我找到一个图,能够很形象地体现这种思想。
基本单位数是4KB。文件由内容和属性构成的,内容就是Data Blocks。在Linux中,任何正常文件都有自己的文件属性集合。每个文件属性其实就是一个结构体,只是每个结构体的值不一样,但是都需要类型,大小,权限等属性,所以就创建了一个结构体,我们称这个结构体为inode,而且大小都是固定的,一般是128字节。
inode
就是一个struct,里面存储着这个文件的信息,比如type、size、priority等等,而且每个文件的inode都是一样大的,只是储存的内容不同,但是文件名不会储存在inode中,因为每个文件的文件名不一样,这些文件名不一样的话就不能保证inode大小设置一样。如果我们得到一个inode,那就可以找到文件。
Block Bitmap
我们看这个就对应上面那副图来看,Block Bitmap就是“块位图”,而块的基本单位是4KB,在Data Block里面存储的就是文件的内容,而块位图就是记录Data Block里面每个块的存储情况。位图是与数据块一一对应的,如果数据块的块被占用,那么位图就会置1,表示已经占用。我这样一解释,应该还是很好理解的。
inode Bitmap
这个就是inode位图,记录着inode的使用情况,参照块位图,一样的,也是一一对应。每一个比特位标记一个inode的是否空闲。
GDT
块组描述符,描述块组属性信息,记录着每个块组描述符的信息,比如哪里开始是inode位图,哪里开始是Block位图,还有多少个空闲,有多少已经被占用。
Super Block
超级块,这个是记录着整个文件系统的所有信息,对于文件系统来说至关重要,所以,在一个区里面分组会有一部分前面都有超级块,如果有一个不小心被删除,那么其他的只需要复制粘贴覆盖他就好了。由此我们还能知道一些东西:格式化!格式化平常就知道不能格式化,否则数据就全没了,那是为什么呢?这是因为格式化的本质就是写文件系统的管理信息,比如让这些块组描述符全部为0,那数据不就全消失了嘛。
目录与文件名
上面交代了只要知道inode就能找到文件,可是在平时,我们都是用文件名来找文件的啊,没有谁用inode寻找文件吧,目录是文件吗???其实目录也是文件,在磁盘上是没有目录的概念的,在它看来,所有文件都是文件内容加属性。而且文件内容保存的是文件名与inode的映射关系。所以我们打开一个文件就必须要找到他的目录,然后访问内容,通过文件名映射到inode,拿到inode再去找文件。
路径解析
通过上面的分析我们可以知道我们需要打开一个文件的话,必须要打开它的目录,那打开它的目录也要打开它目录的目录,以此类推..我们需要通过路径打开所有目录,才能打开这个文件。都要从根目录开始,依次打开每⼀个目录,根据目录名,依次访问每个目录下指定的目录,直到访问 到目标文件。这个过程就是路径解析。
路径缓存
我们可以了解到,要找到文件的话必须从根目录开始进行解析,原则上是这样的,但是太慢了,所以Linux会缓存历史路径为一个树状的结构,这个结构体是struct dentry。
软硬链接
软链接
话不多说,我们看代码就明白了。
由此可以看出code-soft就是code.c的软链接,那么软链接有什么用呢?我们再看个图
我们可以看到这两个文件的inode是不一样的,这代表着这两个文件时单独的两个文件, 在生活中的应用其实就是快捷方式,快捷方式就是单独的文件。但是软链接只是源文件的一个标记,如果源文件被删除,那么这个链接文件就不能独立存在,虽然文件名保留了,但里面的内容却不能执行了。
硬链接
看图:
我们通过这个命令创建了一个文件的硬链接。我们在用ls来看看细节的东西。
我们看到源文件和链接文件他们的inode是一样的,他们共用一个inode,而且可以看到权限位后面的那一位变成了2。其实,硬链接文件就是源文件的别名,一个源文件有几个别名,硬链接数就是几。code.c这个文件有两个别名,硬链接数就是2。与软连接不同的是,当硬链接的源文件被删除后,硬链接文件仍能正常执行,只是文件的链接数减少了一个,因为此时该文件的文件名少了一个。能够起到文件备份的作用。
这个代码我们创建了一个目录,为什么只是创建了一个目录,他的硬链接数就是2呢?
我们进入dir目录,发现每个目录下都有.和..这两个隐含文件,分别代表当前目录和上级目录。
小tips:一个目录下相邻的子目录数等于该目录的硬链接数减2。
软硬链接的区别
- 软链接文件是独立的文件,有单独的inode,但是硬链接没有。
- 软链接相当于快捷方式,而硬链接本质没有创建文件,只是建立了一个文件名和已有的inode的映射关系,并且写入了当前目录。