Linux文件系统(二)

目录

ext2文件系统

超级块 (Super Block) 

GDT (Group Descriptor Table)

块位图 (Block Bitmap)

inode位图 (Inode Bitmap)

Inode Table

Data Block

inode和datablock映射


ext2文件系统

我们想要在硬盘上储⽂件,必须先把硬盘格式化为某种格式的⽂件系统,才能存储⽂件。⽂件系统的⽬的就是组织和管理硬盘中的⽂件。没有它就不能访问硬盘里的文件

ext2将整个分区划分为同样大小的块组(Block Group),只要能管理好一个块组,就能管理整个分区,也就能管理好整个磁盘

上图中启动块(Boot Block/Sector)的⼤⼩是确定的,为1KB,由PC标准规定,⽤来存储磁盘分区信息和启动信息,任何⽂件系统都不能修改启动块。启动块之后才是ext2⽂件系统的开始。 

超级块 (Super Block) 

存放整个文件系统的结构信息,主要有block和inode的总量,未使用的inode和block的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间等其他相关信息

由于超级块对于文件系统非常重要,为了防止损坏导致文件系统无法使用,有多个超级块在Block Group中进行备份

GDT (Group Descriptor Table)

块组描述符表,描述块组属性信息,分区有多少块组就有多少个块组描述符,每个块组描述符描述一个块组的属性信息,如在这个块组中从哪里开始是inode Table,哪里开始是Data Blocks,空闲inode和数据块还有多少个等等。

struct ext2_group_desc
{
    __le32 bg_block_bitmap;
    /* Blocks bitmap block */
    __le32 bg_inode_bitmap;
    /* Inodes bitmap */
    __le32 bg_inode_table;
    /* Inodes table block*/
    __le16 bg_free_blocks_count;
    /* Free blocks count */
    __le16 bg_free_inodes_count;
    /* Free inodes count */
    __le16 bg_used_dirs_count; /* Directories count */
    __le16 bg_pad;
    __le32 bg_reserved[3];
};

块位图 (Block Bitmap)

Block Bitmap中记录着Data Block中哪个数据块已经被占⽤,哪个数据块没有被占⽤

inode位图 (Inode Bitmap)

每个bit表示一个inode是否空闲可用

Inode Table

存放了一系列inode,每个inode中的字段都是关于文件的属性

特别指出,inode记录了文件的数据都存放在哪些块内,也就是这个文件所使用的块号

每个inode的编号以分区为单位,不可跨分区

Data Block

数据区:存放⽂件内容,也就是⼀个⼀个的Block。根据不同的⽂件类型有以下⼏种情况:

对于普通⽂件,⽂件的数据存储在数据块中。

对于⽬录,该⽬录下的所有⽂件名和⽬录名存储在所在⽬录的数据块中,除了⽂件名外,ls -l命令
看到的其它信息保存在该⽂件的inode中。也就是说目录的数据是inode号和文件名的映射关系

Block 号按照分区划分,不可跨分区

现在,来思考一下,如何根据inode号来查找某个文件的内容和属性,inode号可以确定位于哪个分组,也就是确定位于哪个Block Group

首先,查看Inode Bitmap,该inode号是否有效,若有效,则查看inode的字段,属性直接从inode的字段读出,内容存放在哪些块也被记录在inode中,也可以查找到内容

再思考一下,创建新文件,创建新文件需要分配inode号

首先要存储属性,根据Inode Bitmap查找未被使用的的inode号,把文件属性记录进去,然后修改Inode Bitmap对应位置为1,注意修改操作是操作系统在内存中完成的,把一整个数据块读入内存进行操作

再存储数据,根据数据大小来看需要几个数据块,将数据块号记录到inode中

再在这个文件所属的目录的数据中,添加文件名和inode号的映射关系

inode和datablock映射

inode内部存在

__le32 i_block[EXT2_N_BLOCKS];/* Pointers to blocks */

,EXT2_N_BLOCKS =15

就是⽤来进⾏inode和block映射的

inode中有12个指针来直接指向数据块,一个数据块若为 4KB,12个就有48KB

一级间接块索引表指针指向了一个数据块,这个数据块存的全是其他存放文件内容的数据块,假设数据块号占 4字节,一个数据块可以存1024个其他数据块号,这些数据块存的都是文件内容,这样,文件大小被扩展到了MB级别

二级间接块索引表指针指向了一个数据块,这个数据块存的全是一级间接块索引指针,这样文件就被扩展到了GB级别

三级同理

块号是可以跨组的,也就是可以存储其他Block Group里的Data Block

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值