在上一篇基础IO中我们主要讲述了文件再磁盘中的存储,当然我们说的也都只是预备知识,为这一篇的文件系统进行铺垫。
目录
- 搭文件系统的架子:
- 填补细节:
- inode:
- datablock[]:
- 更上层的理解:
搭文件系统的架子:
我们在开始之前还要有一个补充细节:
我们说过文件 = 内容 + 属性
而他们本质上都是数据。
那么内容的数据与属性的数据是在一起存放嘛?
不同的文件系统有不同的规则,在linux下是分开存放
!
现在我们只要知道每个组内有什么即可。
那我们就先来看存放内容数据的地方:
- 数据区(
Data blocks
):存放文件内容
我们在图中展示的的比例大小只是为了好形象的写出各个区域,但实际上数据区占据了90
以上的大小
- 块位图(
Block Bitmap
):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用
比特位的位置表示当前块号,1与0代表当前是否被占用。
我们说过内容与属性是分开存放的,那么属性存放在哪里?
- i节点表(
inode Table
):存放文件属性 如 文件大小,所有者,最近修改时间等
struct inode
{
size_t size;
mode_t mode;
int creater;
...
int inode_number;
...
int datablocks[N];
}
注意:
此结构体大小为128
字节
同时我们要说明一点,inode内部没有文件名,那么我们怎样标识一个文件呢?使用inode_number进行标识。
也就是下图中的最左方数字
那么文件的内容与属性如何连接起来呢?
使用datablock这个数组进行连接。
数组中的数字是data blocks的位置。
既然datablock有bitmap,inode也肯定要有一个bitmap用来管理inode。
- inode位图(
inode Bitmap
):每个bit表示一个inode是否空闲可用。
Block Group
:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。
这个block group里存着这个组的相关管理数据,例如还有多少空的data block ,有多少空的inode_number,组的起始块,结束块位置…
超级块与block group的作用是类似的
- 超级块(
Super Block
):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了
但并不是每个组都有一个SB,而是每隔几个就会有一个SB,这样既可以防止磁盘刮花,也不必占用太多的空间存储。
以上也就是我们磁盘级的文件系统!
我们的格式化也就是在每一个分区内分组,再写入文件系统的过程
填补细节:
inode:
我们说过,inode_number是标识磁盘文件的标识符,但有个前提,是在当前分区是唯一的,也就是说,我们inode编号是以分区为单位的!在不同分区内可能会出现相同的inode编号。
在组内进行更详细的划分:
比如我们现在在当前分区有一个inode为10010的编号,怎么找到对应的属性与数据?
我们使用inode编号与[0, 10000]
, [10001. 20000]
…进行对比,发现是在1号(从0号位下标开始)分组内。于是我们便使用10010 - 10001 = 9
,使用9在inode bitmap中寻找,观察此inode编号是否合法,合法后在inode table中
找到该属性,最后再通过datablock[]
进而找到内容的存放位置。
datablock[]:
我们在前边说过,inode结构体大小为128字节,那么datablock能占多少呢?
一般我们使用ext2这个文件系统进行讲解,linux也有ext3,4等,在2中有15个元素,那么一个文件只能存60KB
?
前12个元素确实如此,但是第13,14个元素并不是单纯的映射,15个更是重量级。
图只是形象,实际肯定更复杂
我们现在只是想输出一个结论:
我们是有能力存大文件的!甚至跨组,但是不建议,因为这样磁头与盘片又会旋转重新寻址,造成效率低下!
更上层的理解:
问题来了,我们在上层使用的都是文件名啊,可是系统都是用inode编号进行标识,那么怎么进行联系呢?
那我们就不得不谈一谈目录了,目录也是文件。
目录 = 内容 + 属性
属性 :不管是什么文件,可执行,目录还是普通文件都是一样的结构体,只是内容不同
那目录的内容里是什么呢?
是文件名与inode编号的映射关系,所以我们在上层不用inode编号,使用文件名即可对文件进行各种操作。
结论:
- 所以同一目录下不能存在相同文件名。
- 查找文件的顺序,先使用文件名找到inode编号。
…
明天就更新完毕,今天快熄灯了