一、梗概
- 多年来,Linux 一直使用EXT2(Card等 1995)作为默认文件系统。EXT3(EXT3,14)是 EXT2 的扩展。EXT3 中增加的主要内容是一个日志文件,它将文件系统的变更记录在日志中。日志可在文件系统崩溃时更快地从错误中恢复。没有错误的 EXT3 文件系统与 EXT2 文件系统相同。EXT3 的最新扩展是 EXT4(Cao 等 2007)。EXT4 的主要变化是磁盘块的分配。在 EXT4中,块编号为48位。EXT4不是分配不连续的磁盘块,而是分配连续的磁盘块区,称为区段。除了这些细微的更改之外,文件系统结构和文件操作保持不变。本书的目的是讲授文件系统的原理。主要目标并非实现大的文件存储容量,而是重点论述文件系统设计和实现的原则,强调简单性以及与 Linux 的兼容性。*
二、知识点归纳
1、超级块
如果说inode块是Unix操作系统中文件的核心,那么超级块就是文件系统的心脏。启动Unix操作系统后,发现某个文件系统无法使用,很有 可能就是超级块出现了问题。为什么这个超级块有这么大的作用呢?主要是因为在超级块中保存了全局文件信息,如硬盘已用空间、数据块可用空间、inode结 点信息等等。做一个形象的比喻,这个超级块就好像是企业的资产负债表,一个文件系统中有哪些资源都记录在这个表中。
2、块组描述符
块组描述符表的起始地址位于超级块所在块的下一个块,在整个文件系统中有很多块 组描述符表的备份,备份的方式具体分为两种:
(1) 文件系统不具备稀疏超级块特性。
如果文件系统不具备稀疏超级块特性,那么在每个块组中都会有一个超级块的备份, 同时也有块组描述符表的备份。
(2) 文件系统具备稀疏超级块特性。
如果文件系统具备稀疏超级块特性,那么只在块组号是3、5、7的幂的块组(如1、3、 5、7、9、25、49等)内才对超级块和块组描述符表做备份,其他块组内则没有备份。
3、索引节点
理解inode,要从文件储存说起。
文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个”块”(block)。这种由多个扇区组成的”块”,是文件存取的最小单位。”块”的大小,最常见的是4KB,即连续八个 sector组成一个 block。
文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点”。
每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。
inode包含文件的元信息,具体来说有以下内容:
1)文件的字节数
2)文件拥有者的User ID
3)文件的Group ID
4)文件的读、写、执行权限
5)文件的时间戳,共有三个:
ctime指inode上一次变动的时间
mtime指文件内容上一次变动的时间
atime指文件上一次打开的时间。
6)链接数,即有多少文件名指向这个inode
7)文件数据block的位置*
可以用stat命令,查看某个文件的inode信息:
stat example.txt
i_block[15]数组包含的磁盘块指针:
4、文件系统结构
EXT2文件系统的主要组成结构有:inode table(inode表格)、data block(信息区块)、superblock(超级区块)、filesystem description(文件系统描述说明)、inode bitmap(inode对照表)、block bitmap(区块对照表)等。
在EXT2文件系统中,文件的权限、属性与文件的内容是分开存储的,文件的权限和属性都存储在inode中,而文件内容则存储在block中。inode和block的大小和数量都是在格式化(即文件系统创建)的时候就已经固定了的。每个inode的大小均为128bytes(ext4与xfs可以设置256bytes),每个文件仅占用一个inode,所以文件系统中能够建立的文件数量与inode的数量有关。block有1k,2k和4k三种大小,所以当文件内容的大小超出block的大小时就需要多个block来存储了。
每个inode和block都是有编号的。inode中不仅存储了文件的权限和属性,也存储了文件内容存放的所有block的编号,这样只要找到文件的inode就能根据inode中记录的block的编号一次性把所有存放该文件内容的block的数据全部读取出来了。如图:
问题来了,记录一个block编号需要4bytes的空间,如果一个文件比较大的话,需要的block的数量是比较多的,但是inode只有128bytes啊,怎么记录得了那么多的block编号呢?其实并不是所有的block编号都直接记录在inode中的,当文件占用的block数量比较多的时候,系统会拿出一些block专门来记录文件内容block的编号,然后inode只要记录这些block的编号就可以读取到文件内容block的编号了。EXT2把inode中记录blok编号的区域定义为12个直接,一个间接,一个双间接,和一个三间接记录区。*
三、实践内容
通过mkfs创建虚拟磁盘
Linux下的命令:
mke2fs [-b blksize -N ninodes] device nblocks
在设备上创建一个带有nblocks个块(每个块大小为blksize字节)和ninodes个索引节点的EXT2文件系统。
例: