简单分析ext2文件系统原理

一.文件系统特性

文件系统通常会将档案的实际数据与档案权限、属性分别存放在不同的区块,权限与属性放置到 inode 中,至于实际数据则放置到 data block 区块中。 另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与block 的总量、使用量、剩余量等。 每个 inode 与block 都有编号,至于这三个数据的意义可以简略说明如下:

superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息等;

inode:记录档案的属性,一个档案占用一个inode,同时记录此档案的数据所在的 block 号码;

block:实际记录档案的内容,若档案太大时,会占用多个 block 。

二.Ext2的结构

ext2文件的属性与实际文件数据分开存放,分别存在inode块和数据块中。

EXT2文件系统在格式化时,会把词霸空间分为多个区块群组(block group),每个区块群组都拥有独立的inode/block/superblock系统。

简单分析ext2文件系统原理 - 四叶草的幻想 - 梦想时光机

Superblock(超级区块):

是记录整个filesystem相关信息的地方,它记录的信息主要有:

1)block 与 inode 的总量;

2)未使用与已使用的 inode / block 数量;

3)block 与 inode 的大小;

4)filesystem 的挂载时间、最近一次写入资料的时间、最近一次检验磁碟 (fsck) 的时间等档案系统的相关资讯;

5)一个 valid bit 数值,o   若此档案系统已被挂载,o 则 valid bit 为 0 ,o   若未被挂载,则 valid bit 为 1 。

GDT(块组描述表):

这个区段可以描述每个 block group 的开始与结束的 block 号码,以及说明每个区段 (superblock, bitmap, inodemap, data block) 分别介于哪一个 block 号码之间。

block bitmap (区块对照表):此处记录使用与未使用的block ;

inode bitmap (inode 对照表) 记录使用与未使用的 inode 号码

Inode table(Inode表格):每个Inode内容的存放区:

Inode 里面的内容(常见的):

1)该档案的存取模式(read/write/excute);

2)该档案的类型(type);

3)该档案的拥有者与群组(owner/group);

4)该档案的容量;

5)该档案建立或状态改变的时间(ctime)

6)最近一次的读取时间(atime)

7)最近修改的时间(mtime);

8)定义档案特性的旗标(flag),如 SetUID…;

9)该档案真正内容的指向 (pointer);

Data block(资料区块):

是每个block用来存放数据的地方,在Ext2文件系统中所支持的block大小有1K,2K及4K,因为block大小而产生的Ext2文件系统限制如下:

简单分析ext2文件系统原理 - 四叶草的幻想 - 梦想时光机

 

三.文件操作:

1. 目录:

新建目录时,ext2会给该目录分配一个inode与至少一个block块给该目录:inode记录目录的相关权限与属性,并记录分配到的那块block号码,而block则记录在这个目录下的文件名与该文件名占用地方Inode号码数据

2. 档案:

新建档案时,ext2会给该文件分配一个inode与相对该档案大小的block数量给该档案

例如∶假设我的一个 Block 为 4 Kbytes ,而我要建立一个 100 KBytes 的档案,那么 linux 将分配一个 inode 与 25 个 Block 来储存该档案!

3.文件读取:

inode 本身并不记录文件名,文件名的记录是在目录的 block 当中,因此,我们要读取某个档案时,就务必会经过目录的indoe与block,然后才能找到那个待读取档案的Indode号码,最终才会读到正确的Block内的数据

由于目录树是由根目录开始读起,因此系统透过挂载的信息可以找到挂载点的Inode号码,此时就能够得到根目录的Inode内容,并根据该Inode读取根目录的block内的文件名数据,再一层一层的往下读到正确的档名。

举例来说,当我想要读取/etc/crontab 这个档案时,系统上面与/etc/crontab 有关的,目录与档案信息如下,那么该档案的读取流程为:

简单分析ext2文件系统原理 - 四叶草的幻想 - 梦想时光机

 

1)读取/的Indode:

透过挂载点的信息读取号码为2的Inode,且Indode规范的权限(r,x)可以读取该block中的内容;取得 /根目录底下所有档案的关联资料是放置在哪一个 Block 当中

2)读取 /的block:

经过上过步骤获取的block号码,找到该内容有/etc/目录的Indode号码(16)

3)读取 etc/ 的Inode

读取16号Inode可知当前用户有 r与 x的权限,可以读取etc/的block内容,取得 /etc 这个目录底下所有档案的关联资料是放置在哪一个 Block 当中

4)读取etc/的block

经过上个步骤取得的block号码,找到该内容有crontab档案的Indode号码(1163),前往该Indode

5) 读取crontab的Indode:

读取1163号Indode得知,当前用户有r的权限,可以读取crontab的block内容;前往由 inode 所指向的 Block 区域

6)读取crontab的block:

最后将crontab的内容数据读取出来。

4.新增一个档案:

1) 先确定用户对于欲新增档案的目录是否具有w与x的权限,如果有的话,才能新增;

2) 根据Indode Bitmap找到没有好似用的Inode号码,将心档案的权限/属性写入;

3)根据block Bitmap找到没有使用的block号码,将实际数据写入block中,且更新Indode的block指向数据

4)将刚刚写入的Inode与block数据同步更新Inode Bitmap与block Bitmap,并更新Superblock的内容

发表评论

电子邮件地址不会被公开。 必填项已用*标注