第十一章学习笔记 Ext2文件系统

ext2文件系统

通过mkfs创建虚拟磁盘,并在一个名为vdisk的虚拟磁盘文件上创建一个EXT2文件系统,有1440个大小为1kb的块

 

 

 

 

下图是一个磁盘分区格式化成ext2文件系统后的存储布局。

 

 

 

文件系统中存储的最小单位是块(Block每个 block group 中有多少个 block 是固定的。而上图中启动块(Boot Block)的大小是确定的(1KB),启动块是由PC标准规定的,用来存储磁盘分区信息和启动信息,任何文件系统都不能使用启动块。启动块之后才是ext2文件系统的开始,ext2文件系统将整个分区划成若干个同样大小的块组(Block Group),每个块组由以下组成:

 

1).超级块(Super Block

描述整个分区的文件系统信息,例如块大小、文件系统版本号、上次mount的时间等等。超级块在每个块组的开头都有一份拷贝。

包含incode操作

 

2).块组描述符表(GDTGroup Descriptor Table)

  由很多块组描述符组成,整个分区分成多少个块组就对应有多少个块组描述符。每个块组描述符(Group Descriptor)存储一个块组的描述信息

 

3).块位图(Block Bitmap

一个块组中的块是这样利用的:

  数据块存储所有文件的数据,比如某个分区的块大小是1024字节,某个文件是2049字节,那么就需要三个数据块来存,即使第三个块只存了一个字节也需要占用一个整块;超级块、块组描述符表、块位图、inode位图、inode表这几部分存储该块组的描述信息。那么如何知道哪些块已经用来存储文件数据或其它描述信息,哪些块仍然空闲可用呢?块位图就是用来描述整个块组中哪些块已用哪些块空闲的,它本身占一个块,其中的每个bit代表本块组中的一个块,这个bit1表示该块已用,这个bit0表示该块空闲可用。

  为什么用df命令统计整个磁盘的已用空间非常快呢?因为只需要查看每个块组的块位图即可,而不需要搜遍整个分区。相反,用du命令查看一个较大目录的已用空间就非常慢,因为不可避免地要搜遍整个目录的所有文件。与此相联系的另一个问题是:在格式化一个分区时究竟会划出多少个块组呢?主要的限制在于块位图本身必须只占一个块。用mke2fs格式化时默认块大小是1024字节,可以用-b参数指定块大小,现在设块大小指定为b字节,那么一个块可以有8bbit,这样大小的一个块位图就可以表示8b个块的占用情况,因此一个块组最多可以有8b个块,如果整个分区有s个块,那么就可以有s/(8b)个块组。格式化时可以用-g参数指定一个块组有多少个块,但是通常不需要手动指定,mke2fs工具会计算出最优的数值。

 

4).inode位图(inode Bitmap

和块位图类似,本身占一个块,其中每个bit表示一个inode是否空闲可用

 

5).inode表(inode Table

  一个文件除了数据需要存储之外,一些描述信息也需要存储,例如文件类型(常规、目录、符号链接等),权限,文件大小,创建/修改/访问时间等,也就是ls -l命令看到的那些信息,这些信息存在inode中而不是数据块中。每个文件都有一个inode,一个块组中的所有inode组成了inode表。

   inode表占多少个块在格式化时就要决定并写入块组描述符中,mke2fs格式化工具的默认策略是一个块组有多少个8KB就分配多少个inode。由于数据块占了整个块组的绝大部分,也可以近似认为数据块有多少个8KB就分配多少个inode,换句话说,如果平均每个文件的大小是8KB,当分区存满的时候inode表会得到比较充分的利用,数据块也不浪费。如果用户在格式化时能够对这个分区以后要存储的文件大小做一个预测,也可以用mke2fs-i参数手动指定每多少个字节分配一个inode

 

6).数据块(Data Block

根据不同的文件类型有以下几种情况

 (1对于常规文件,文件的数据存储在数据块中。

 (2对于目录,该目录下的所有文件名和目录名存储在数据块中,注意文件名保存在它所在目录的数据块中,除文件名之外,ls -l命令看到的其它信息都保存在该文件的inode中。注意这个概念:目录也是一种文件,是一种特殊类型的文件。

 (3对于符号链接,如果目标路径名较短则直接保存在inode中以便更快地查找,如果目标路径名较长则分配一个数据块来保存。

 (4设备文件、FIFOsocket等特殊文件没有数据块,设备文件的主设备号和次设备号保存在inode中。

(含incode操作)

 

 

 

 

2.数据块寻址

一个文件有多个数据块,这些数据块很可能不是连续存放的根目录的数据块是通过其inode中的索引项Blocks[0]找到的这样的索引项一共有15个,从Blocks[0]Blocks[14],每个索引项占4字节。前12个索引项都表示块编号,例如上面的例子中Blocks[0]字段保存着24,表示第24个块是该文件的数据块,块大小是1KB,这样可以表示从0字节到12KB的文件。

索引项Blocks[12]所指向的块并非数据块,而是称为间接寻址块(Indirect Block),其中存放的都是类似Blocks[0]这种索引项,再由索引项指向数据块。

 

 

 

1.LinuxExt2/Ext3/Ext4文件系统简介:

https://blog.csdn.net/qq_31865983/article/details/90205498)

2.在Ext2文件系统中,Linux内核如何读取指定文件内容:

  不管Ext2还是其他文件系统,其实基本上的结构都是一样的,都有incode用来指定每个文件,如果是用c编程,fopen,fread,fclose等都是很标准的函数,可以很方便的去读取某个文件是具体内容。

3.通过虚拟磁盘的mount_root来构建基本文件系统,将文件系统的实现划分为3个级别:

级别1扩展了基本文件系统,以实现文件系统树;

级别2实现了文件内容的读/写操作;

级别3实现了文件系统的挂载/装载和文件保护;描述了各个级别文件系统函数的算法,并通过编程实列和练习整合到一个完全有效的文件系统中。

 

posted @ 2021-10-16 14:50  20191229XYZ  阅读(129)  评论(0编辑  收藏  举报