Linux系统的Ext2文件系统
下面我们正是你介绍Ext2文件系统
Ext2文件系统使用以inode为基础的文件系统。
文件系统一开始将inode与block规划好了,除非重新格式化,否则inode与block固定后就不再变动,但是当inode与block数量过多时,就不易于管理。因此Ext2在格式化的时候基本上是区分为多个块组(block group),每个块组都有独立的/inode/block/superblock系统。Ext2格式化后如图
在整体的规划中,文件系统最前面有一个启动扇区(boot sector),这个启动扇区可以安装引导装载程序。因此可以将不同的引导装在程序安装到个别的文件系统最前端,而不用覆盖整块硬盘唯一的MBR(主引导分区)。具体每个内瓤说明如下:
1、data block (数据块):用来放置文件内容。在Ext2文件系统中所支持的block大小有1KB,2KB及4KB三种,在格式化block大小的时候就固定了,且每个block都有编号,以方便inode记录。
但是,由于block大小的区别,会导致文件系统能够支持的最大磁盘容量与最大单一文件容量并不相同,block大小而长生的Ext2文件系统限制如下
block大小 | 1KB | 2KB | 4KB |
最大单一文件限制 | 16GB | 256GB | 2TB |
最大文件系统容量 | 2TB | 8TB | 16TB |
限制:
1)、原则上,block大小与数量在格式化完就不能再改变
2)、每个block内最多只能够放置一个文件的数据
3)、承上,如果文件大于block的大小,则一个文件会占用多个block数量
4)、承上,如果文件小于block,则该block的剩余空间就不能再被使用(磁盘空间会浪费)
2、inodetable(inode表格):inode的内容主要记录文件的属性以及该文件实际数据是放置在哪几号block内,基本上,inode记录的文件数据至少有下面这些:
1)、该文件的访问模式
2)、该文件的所有者与组
3)、该文件的大小
4)、该文件创建或状态改变的时间
5)、最近一次的读取时间
6)、最近修改的时间
7)、定义文件特性的标志
8)、该文件真正内容的指向
9)、每个inode大小均固定在128bytes
10)、每个文件都仅会占用一个inode而已
11)、承上,因此文件系统能够创建的文件数量与inode的数量有关
12)、系统读取文件时需要先找到inode,并分析inode所记录的权限与用户是否符合,若符合才能开始实际读取block的内容
inode/block与文件大小的关系:
inode要记录的数据非常多,但只有128bytes,而inode记录一个block号码要花掉4bytes,假设一个文件有400MB且每个block为4KB,那么至少要10万条block号码的记录,inode哪有这么多可记录
的信息?为此我们系统很聪明将inode记录block号码的区域定义为12个直接,一个间接,一个双间接与一个三间接记录区。
图中最左边为inode本身(128bytes),里面有12个直接指向block号码的对照,这12个记录可以直接取到block号码,也就是直接寻址。至于所谓的间接就是再拿一个block来当作记录block号码的记录区,如果文件过大时,就会使用间接的block来记录编号,也就是间接寻址。同理,如果文件持续长大,就会利用双间接。
这样inode能够指定多少个block呢?以较小的1KB的block来说明。可以指定的情形如下:
1)、12个直接指向:12*1K=12K,由于是直接指向,所以总共可以记录12条记录
2)、间接:256*1K
每条block号码的记录会花去4bytes,因此1K的大小能记录256条记录
3)、双间接:256*256*1K=256^2K
4)、三间接:256*256*256*1K=256^3K
总额:将直接、间接、双间接、三间接加总,得到12+256+256^2+ 256^3=16GB,此时我们知道当文件系统将block格式化为为1K大小时,能够容纳的最大文件为16GB,比较一下文件系统线指标的结果可发现是一致的。但这个方法不能用在2K及4K的block大小的计算中。因为大于2K的block将会收到文件系统本身的限制
3、Superblock(超级块)
superblock是记录整个文件系统相关信息的地方,没有superblock,就没有这个文件系统了,它记录的主要信息有:
1)、block与inode的总量
2)、未使用与已使用的inode/block数量
3)、block与inode的大小
4)、文件系统的挂载时间、最近一次写入数据的时间、最近一次检验磁盘的时间等文件系统的相关信息
5)、一个validbit数值,若此文件系统已被挂载,则valid bit为0,若未被挂载,则valid bit为1
superBlock是非常重要的,因为我们这个文件系统的基本信息都写在这里。此外,每个block group都有可能含有superblock。但是我们也说一个文件系统应该仅有一个superblock。事实上除了第一个blockgroup内会含有superblock之外,后续的block group 不一定含有superblock,若含有superblock则也是作为第一个superblock的备份而已。
4、File System Description(文件系统描述说明):这个区段可以描述每个block group的开始与结束的block号码,以及说明每个区段分别介于哪一个block号码之间
5、block bitmap(块对照表):如果你想要添加文件时总会用到block。那你要使用哪个block来记录呢?当然是选择”空的block“来记录新文件的数据。那你怎么知道哪个block是空的?这就得通过
block bitmap 的辅助,从block bitmap 当中可以知道哪些block是空的,因此我们的系统就能很快速找到可使用的空间来处理文件。同样,如果删除某些文件时,那么哪些文件原本占用的block号码就得释放出来,此时在block bitmap当中相对应到该block号码的标志就得修改成为”未使用中“。这就是blockmap的功能。
6、inode bitmap(inode对照表):这个与block bitmap功能类似,只是block bitmap记录的是使用与未使用的block号码,inode bitmap记录使用与未使用的inode号码。
查看文件系统
刚才谈到的各部分数据都与block号码有关,每个区段与superblock的信息都可以使用dumpe2fd这个命令来查询,利用dumpe2fs可以查询到非常多的信息。
与目录树的关系
目录与文件在Ext2文件系统当中是如何记录数据的呢?基本上可以这么说
1、目录:当我们在Linux的ext2文件系统新建一个目录时,ext2会分配一个inode与至少一块block给该目录。其中inode记录该目录的相关权限与属性,并可记录分配的那块block号码。而block则是记录在这个目录下的文件名与该文件名占用的inode号码数据。也就是说目录所占用的block内瓤在记录如下的信息:
1)、如果想实际查看root目录下的文件所占用的inode号码时,可以如下操作:
2、文件:当我们在Linux下的ext2新建一个一般文件时,ext2会分配一个inode与相对于该文件大小的block数量给该文件
3、目录树读取:因为文件名是记录在目录的block当中,因此当我们要读取某个文件时,就务必会经过目录的inode与block,然后才能找到那个待读取文件的inode号码,最终才会取到正确的文件的block的内容。由于目录树是从根目录开始读取,因此系统通过挂载的信息可以找到挂载点的inode号码,此时就能得到根目录的inode内容,并依据该inode读取根目录的block内的文件名数据,再一层一层向下读到正确的文件名。
3、文件系统大小与磁盘读取性能
当一个文件系统规划的很大时,由于磁盘上面的数据经常变动,所以,整个文件系统上面的文件通常无法连续写在一起,即block号码不hi连续,而是填入式的将数据填入没有被使用的block中,如果写入的block很松散,那么就会有文件数据离散的问题发生。