不同的文件系统存储文件的方式是不同的,所以其结构也是不同的。本文要介绍的是Linux最传统的文件系统EXT2的结构。
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个直接,一个间接,一个双间接,和一个三间接记录区,这里还是借用鸟哥的图加以说明:
这样子还是可以根据inode找到存储文件内容的所有block啊!
不过尽管如此,由于inode中存放block编号的区域大小是固定的,inode能够存储的block编号的数量就是固定的,而block的大小也是固定的,所以也就是说在一个已知block大小的文件系统中,文件的最大大小是固定的!
既然block的大小有1K,2K和4K三种类型,那我们是应该选择大一点的还是小一点的好呢?由于一个block只能存储一个文档的内容,一个文件不管多小,它至少都会占用一个block的空间,所以如果block的空间很大,但是系统中有很多很小的文件,那会就浪费很多的空间了。如果把block定得很小,但是系统中有很多大文件的话,那么一个文件就需要存放到很多个block中,读取文件内容的时候需要到多个block中读取,而且inode需要记录的block的编号很多,系统还需要拿出更多的block来记录文件内容block的编号,这在时间和空间上都是比较浪费的。所以,block的大小定多少合适,还是需要根据文件系统预计使用情况来决定的。
接下来简单介绍一下EXT文件系统结构中其他组成部分:
(1)Superblock:大小为1024bytes,是记录整个文件系统相关信息的地方,主要有:block与inode的大小和数量、未使用与已使用的inode/block的数量,以及文件系统的是否已被挂载、挂载的时间等等。
(2)Filesystem description:描述每个block group(下文介绍)的开始与结束的block编号,以及说明每个区段(inode table,data block等)分别介于哪个block号码之间。
(3)Inode bitmap:记录哪些inode是未使用的,哪些是已被使用的。
(4)Block bitmap:记录哪些block是未使用的,哪些是已被使用的。
此外,在EXT3和EXT4中,还会规划出一个区块用于记录文件修改的日志记录,以便在文件系统发生问题的时候能很快查到问题所在。
如果文件系统很大的话,inode和block的数量就会很大,不容易管理,所以EXT在格式化的时候基本上是区分为多个区块群组的,每个区块群组都有以上介绍的所有组成部分(可以从指令dumpe2fs的打印结果中查看),看起来就像下图(图借自鸟哥):
这样了解了EXT2文件系统的结构之后,文件的创建、查询、修改、删除具体经历了哪些过程,包含了哪些细节,我们就可以清楚地知道了!
文件系统格式化的时候,EXT文件系统家族在格式化处理的过程中就把所有/inode/block/meta data等结构都预先规划并分配好,以后系统就可以直接取用,不需要再进行动态配置了。这种方法有个问题,就是当格式化的文件系统很大的时候,格式化需要花费很长的时间。而新的日志式文件系统XFS就弥补了这个不足,它的inode和block都是等系统需要使用的时候才进行动态分配的,所以格式化过程超快,适合用于大文件系统。