在上一篇文章中,我们介绍了基本的文件系统概念和SD卡中常用的FAT32文件系统。在有了上文的基础,我们这次来学习一下linux中默认的ext文件系统。
ext文件系统是为linux量身打造的,因此和linux的虚拟文件系统(VFS)在基础概念上基本是一致的,本文也顺带介绍一下vfs。vfs能适配十几种不同类型的文件系统,如上文介绍的FAT等。vfs进行适配的原理是在内存中讲FAT文件系统的FAT、FDT等转换成了ext文件系统中的inode结构了。
首先看一下ext3文件系统的结构总览:
图中我们看到了如下概念:引导扇区、块、块组、super block超级块、块组描述符表、块位图、i-节点位图、i-节点表,我们依次介绍一下:
引导扇区
ext3文件系统中的前两个扇区用来存放应道程序,称为引导扇区。
块
就像上文中提到FAT文件系统为方便管理将几个扇区组成一个簇一样,ext文件系统将若干个扇区组成一个块。一个块大小一般为1024字节、2048字节等,在创建文件系统时确定。块是ext文件系统分配空间的最小单位。每个块有一个唯一的编号,0号块位于文件系统的起始扇区。
块组
Block Group,ext文件系统的块被组合在一起构成几个大的块组,每个块组结构相同,大小一致。最后一个块组由于磁盘扇区个数差异一般会小于其他块组。
super block超级块
超级块用于存储文件系统的配置参数,如块大小,总块树,i-节点数,当前空闲块数等。通常只有0号块组的超级块被文件系统使用,其他块组中相应位置的超级块作为备份。
超级块起始于2号扇区(0号和1号扇区为引导扇区),当文件系统定义的块大小为2个扇区时,超级块起始于1号块;当文件系统定义块大小为4个扇区时,超级块起始与0号块的后两个扇区。
超级块的结构定义如下:
块组描述符表
块组描述符表是所有块组的描述符聚集在一起组成的表。Ext3文件系统的每个块组描述符占用32字节,用以描述块组中的位图起始地址、i-节点表起始地址、空闲块数、空闲i-节点数等信息,每个块组都有这样的一个块组描述符,所有的块组描述符集中存放,组成块组描述符表。通常只有0号块组的块组描述符表被文件系统使用,其他块组中相应位置的块组描述符表作为备份。
块位图
ext3文件系统以块作为数据存储的基本单位,块的分配情况由该块组的块位图描述。
1,块位图的地址由该块组的描述符给出
2,含有超级块、块组描述符表的块组,块位图起始于块组描述符表的下一个块;对于没有超级快、块组描述符表的块组,块位图起始于该块组的第一个块。
3,在创建ext3文件系统时,会将每个块组包含的块数于每个块包含的bit数设置为相同,这样块位图占用一个完整的块就正好可以用一个bit表示当前块组中一个块的使用情况。
i-节点位图
ext3文件系统使用i-节点描述文件的元数据,i-节点的分配情况由该块组的i-节点位图描述。
1,i-节点位图的地址由该块组的描述符给出
2,i-节点位图起始于该块组块位图的下一个块
3,系统分配了一个块来存放i-节点位图,但实际上i-节点位图用不完这个块。
4,i-节点从1开始编号。
inode,i-节点表
先介绍一下inode,即i-节点,这是ext文件系统的一个核心概念。i-节点存放文件的初文件名以外的所有信息,如:文件的链接数、文件大小、文件时间信息、文件所属用户ID、文件所属组ID、文件内容存放地址的块指针,这些数据称为元数据。对比FAT文件系统,发现i-节点类似于将FAT文件系统中的文件目录项中除文件名之外的信息提取了出来,但比其更为强大。
1,每个文件或文件夹使用一个i-节点。
2,i-节点表位于i-节点位图的下一个块。
3,超级块中记录着文件系统中的i-节点总数和每个块组中包含的i-节点数。
4,每个i-节点的基本大小为128字节,但也可以由当超级块的相关属性定义为大于128字节的大小。
5,再次强调,i-节点从1开始编号,而且1-10号的i-节点被系统保留。1号i-节点用于描述坏块,2号i-节点用于指向根目录,8号i-节点用于描述日志。
6,已知一个i-节点号后就可以算出该i-节点所在的块组,计算方法为
(i-节点 - 1)/每个块组i-节点数
7,i-节点的结构如下:
数据块
数据块主要是存储文件的具体内容的区域。
目录项
说道最后了,发现inode中没有存储的文件名一直也没有出现,现在介绍一下。
i-节点中有其指向的文件类型信息,如i-节点指向一个文件时,其对应的数据区域存储的是文件的内容。如i-节点指向的是一个目录时,其对应的数据区域存储的就是目录项。这个概念和FAT文件系统中的文件目录项相同。
1,一个目录的i-节点指向的块就是存储当前目录下所有文件、字文件夹的目录区。
2,每个目录项的长度不固定,其长度随文件名长度变化,但必须为4的倍数。文件名最长255字节,以ascii码存储。
3,目录区中的前两个目录必须为“.”和"..",代表当前目录和父目录。这一点和FAT文件系统相同。
4,目录项结构定义如下: