Linux文件系统结构

  不一样的文件系统存储文件的方式是不一样的,因此其结构也是不一样的。本文要介绍的是Linux最传统的文件系统EXT2的结构。node

  EXT2文件系统的主要组成结构有:inode tableinode表格)、data block(信息区块)、superblock(超级区块)、filesystem description(文件系统描述说明)、inode bitmapinode对照表)、block bitmap(区块对照表)等。spa

  在EXT2文件系统中,文件的权限、属性与文件的内容是分开存储的,文件的权限和属性都存储在inode中,而文件内容则存储在block中。inodeblock的大小和数量都是在格式化(即文件系统建立)的时候就已经固定了的。每一个inode的大小均为128bytesext4xfs能够设置256bytes),每一个文件仅占用一个inode,因此文件系统中可以创建的文件数量与inode的数量有关。block1k2k4k三种大小,因此当文件内容的大小超出block的大小时就须要多个block来存储了。日志

  每一个inodeblock都是有编号的。inode中不只存储了文件的权限和属性,也存储了文件内容存放的全部block的编号,这样只要找到文件的inode就能根据inode中记录的block的编号一次性把全部存放该文件内容的block的数据所有读取出来了。这里借鸟哥的图加以说明:blog

  问题来了,记录一个block编号须要4bytes的空间,若是一个文件比较大的话,须要的block的数量是比较多的,可是inode只有128bytes啊,怎么记录得了那么多的block编号呢?其实并非全部的block编号都直接记录在inode中的,当文件占用的block数量比较多的时候,系统会拿出一些block专门来记录文件内容block的编号,而后inode只要记录这些block的编号就能够读取到文件内容block的编号了。EXT2inode中记录blok编号的区域定义为12个直接,一个间接,一个双间接,和一个三间接记录区,这里仍是借用鸟哥的图加以说明:ip

这样子仍是能够根据inode找到存储文件内容的全部block啊!文档

  不过尽管如此,因为inode中存放block编号的区域大小是固定的,inode可以存储的block编号的数量就是固定的,而block的大小也是固定的,因此也就是说在一个已知block大小的文件系统中,文件的最大大小是固定的!it

  既然block的大小有1K2K4K三种类型,那咱们是应该选择大一点的仍是小一点的好呢?因为一个block只能存储一个文档的内容,一个文件无论多小,它至少都会占用一个block的空间,因此若是block的空间很大,可是系统中有不少很小的文件,那会就浪费不少的空间了。若是把block定得很小,可是系统中有不少大文件的话,那么一个文件就须要存放到不少个block中,读取文件内容的时候须要到多个block中读取,并且inode须要记录的block的编号不少,系统还须要拿出更多的block来记录文件内容block的编号,这在时间和空间上都是比较浪费的。因此,block的大小定多少合适,仍是须要根据文件系统预计使用状况来决定的。io

  接下来简单介绍一下EXT文件系统结构中其余组成部分:table

(1)Superblock:大小为1024bytes,是记录整个文件系统相关信息的地方,主要有:blockinode的大小和数量、未使用与已使用的inode/block的数量,以及文件系统的是否已被挂载、挂载的时间等等。配置

(2)Filesystem description:描述每一个block group(下文介绍)的开始与结束的block编号,以及说明每一个区段(inode tabledata block等)分别介于哪一个block号码之间。

(3)Inode bitmap:记录哪些inode是未使用的,哪些是已被使用的。

(4)Block bitmap:记录哪些block是未使用的,哪些是已被使用的。

  此外,在EXT3EXT4中,还会规划出一个区块用于记录文件修改的日志记录,以便在文件系统发生问题的时候能很快查到问题所在。

  若是文件系统很大的话,inodeblock的数量就会很大,不容易管理,因此EXT在格式化的时候基本上是区分为多个区块群组的,每一个区块群组都有以上介绍的全部组成部分(能够从指令dumpe2fs的打印结果中查看),看起来就像下图(图借自鸟哥):

  这样了解了EXT2文件系统的结构以后,文件的建立、查询、修改、删除具体经历了哪些过程,包含了哪些细节,咱们就能够清楚地知道了!

  文件系统格式化的时候,EXT文件系统家族在格式化处理的过程当中就把全部/inode/block/meta data等结构都预先规划并分配好,之后系统就能够直接取用,不须要再进行动态配置了。这种方法有个问题,就是当格式化的文件系统很大的时候,格式化须要花费很长的时间。而新的日志式文件系统XFS就弥补了这个不足,它的inodeblock都是等系统须要使用的时候才进行动态分配的,因此格式化过程超快,适合用于大文件系统。