20201322陈俊池学习笔记5

第十一章 EXT2文件系统

一、知识点归纳

11.1 EXT2文件系统

Linux一直将EXT2作为默认文件系统。EXT3是EXT2的扩展。EXT3中增加的主要内容是一个日志文件,他将文件系统的变更记录在日志中。日志可在文件系统崩溃时更快地从错误中恢复。没有错误的EXT3文件系统与EXT2文件系统相同。EXT3的最新扩展时EXT4。EXT4的主要变化是磁盘块的分配。在EXT4中,块编号为48位。EXT4是分配连续的磁盘块,称为区段。本书的目的是论述文件系统设计和实现的原则,强调简单性以及与Linux的兼容性。我们选择EXT2文件系统。

11.2 EXT2文件系统数据结构

11.2.1 通过mkfs创建虚拟磁盘

在linux下,通过mkfs创建虚拟磁盘,输入命令: mke2fs [-b blksize -N ninodes] device nblocks 可创建一个带有nblocks个块(每个块大小为blksize个字节)和ninodes个索引节点的EXT2文件系统

11.2.2 虚拟磁盘布局

虚拟磁盘布局图如下:

Block#0:引导块 B0是引导块,文件系统不会使用它。它用来容纳一个引导程序,从磁盘引导操作系统。

11.2.3 超级块

Block#1:超级块(在硬盘分区中字节偏移量为1024)B1是超级块,用于容纳整个文件系统的信息。下文说明了超级块的结构:

struct ext2_super_block {
u32 s_inodes_count; // Inodes count
u32 s_blocks_count; // Blocks count
u32 s_r_blocks_count; // Reserved blocks count
u32 s_free_blocks_count; // Free blocks count
u32 s_free_inodes_count; // Free inodes count
u32 s_first_data_block; // First Data Block
u32 s_log_block_size; // Block size
u32 s_log_cluster_size; // Allocation cluster size
u32 s_blocks_per_group; // # Blocks per group
u32 s_clusters_per_group; // # Fragments per group
u32 s_inodes_per_group; // # Inodes per group
u32 s_mtime; // Mount time
u32 s_wtime; // Write time
u32 s_mnt_count; // Mount count
u16 s_max_mnt_count; // Maximal mount count
u16 s_magic; // Magic signature
// more non-essential fields
u16 s_inode_size; // size of inode structure
};

11.2.4 块组描述符

Block#2:块组描述符块(硬盘上的s_first_data_block+1)EXT2将磁盘块分成几个组。每个组有8192个块(硬盘上的大小为32K)。每组用一个块组描述符结构体来描述。

struct ext2_ group_ desc (
u32
bg_ block_ bi tmap; // Bmap block number
u32 bg inode_ bi tmap; //Imap b1ock number
u32 bg inode_ table; // Indes begin block number
u16 bg_ free_ blocks_ count ; // THESE are OBVIOUS
u16 bg_ free_ inodes_ count ;
u16 bg_ used_ dirs_ count;
u16 bg_ pad; //ignore these
u32 bg_ reserved[3] ;
};

11.2.5 块和索引节点位图

Block#8:块位图(Bmap)(bg_block_bitmap)位图用来表示某种项的位序列,例如:磁盘块或索引节点。位图用于分配和回收项。 Block#9:索引节点位图(bg_inode_bitmap)一个索引节点就是用来表示一个文件的数据结构。EXT2文件系统是使用有限数量的索引节点创建的。各索引节点的状态用B9的Imap中的一个位表示。

11.2.6 索引节点

Block#10:索引(开始)节点(bg_inode_table)每个文件都用一个128字节(EXT4中是256字节)的唯一索引节点结构体表示。

struct ext2_ inode {
u16 i_ mode;// 16 bits - ttttlugsIrwxJrwxIrwxl
u16 i_ uid;//owner uid
u32 i_ size;//file size in bytes
u32 i_ atime;//time fields in seconds
u32 i_ ctime;// since 00:00:00,1-1-1970
u32 i_ mtime;
u32 i_ dtime;
u16 i_ gid;// group ID
u16 i_ 1 inks_ count;// hard-link count
u32 i_ blocks;// number of 512-byte sectors
u32 i_ flags;//IGNORE
u32 i_ reserved1 ;//IGNORE
u32 i_ b1ock[15] ;//See details below
u32 i_ pad[7] ;//for inode size = 128 bytes
}
  • 直接块:i_block[0]至i_block[11]指向直接磁块盘

  • 间接块:i_block[12]指向一个包含256个块编号的磁盘块,每个块编号指向一个磁盘块

  • 双重间接块:i_block[13]指向一个指向256个块的块,每个块指向256个磁盘块

  • 三重间接块:i_block[14]对于小型EXT2文件可忽略

每个索引节点都有一个唯一的索引节点编号,即索引节点在索引节点块上的位置+1

索引节点位置从0开始计数 索引节点编号从1开始计数

11.2.7 数据块

紧跟在索引节点后面的是文件存储数据块。

11.2.8 目录条目

目录包含dir_entry_2结构,即:

struct ext2_dir_entry_2 {
u32 inode;
u16 rec_len;
u8 name_len;
u8 file_type;
char name[EXT2_NAME_LEN];
};

dir_entry为可扩充结构。名称字段包含1-255个字符,不含终止null。

11.3 邮差算法

11.3.2 将索引节点号转换为磁盘上的索引节点

在EXT2文件系统中,每个文件都有一个唯一的索引节点结构。在文件系统上,索引节点从inode_table块开始。每个磁盘包含

INODES_PER_BLOCK = BLOCK_SIZE / sizeof(INODE)

个索引节点。每个索引节点都有一个唯一的索引节点结构。在文件系统磁盘上,索引节点从inode_table块开始。每个磁盘块包含

INODES_PER_BLOCK = BLOCK_SIZE / sizeof(INODE)

个索引节点。每个索引节点都有一个唯一的索引节点号,ino = 1,2,...,从1开始线性计数。已知一个ino,如1234,那么哪个磁盘块包含该索引节点,以及哪个索引节点在该块中?我们需要知道磁盘块号,因为需要通过块来读/写一个真正的磁盘。

block = (ino -1) / INODES_PER_BLOCK + inode_table;
inode = (ino - 1) % INODES_PER_BLOCK;

同样,将EXT2文件系统中的双重和三重间接逻辑块号转换为物理块号也依赖于邮差算法。 将线性磁盘块号转换为CHS = (柱面、磁头、扇区)格式:软盘和旧硬盘使用CHS寻址,但文件系统始终使用线性块寻址。在调用BIOS INT13时,可用该算法将磁盘块号转换为CHS。

11.7 基本文件系统

11.7.1 type.h文件

包含ext2文件系统的数据结构类型 比如超块、组描述符、索引节点和目录条目结构

11.7.2 global.c文件

这类文件包含文件系统的全局变量

文件系统操作过程中,全局数据结构被视为系统资源,可灵活使用和释放

11.7.3 实用程序函数

  • util.c file:该文件包含文件系统常用的实用程序函数

  • get_block/put_block 将虚拟磁盘块读/写到内存的缓冲区中

  • iget(dev,ino) 返回一个指针,指向包含INODE(dev,ino)的内存minode

  • The input(INODE *mip) 释放一个mip指向用完的minode

  • getino() 实现文件系统树遍历算法

二、问题与解决思路

问题:书中提到超级块能容纳整个文件系统的消息,但它的作用依然不了解

解决:每一种文件系统都对应自己的超级块 Inode 数据块这三种块

inode块(读写权限、数据块的位置)、数据块(数据)除了上面这两个数据块,还有一个超级块。

超级块指的是文件系统的第一个块,存放文件系统本身的结构信息描述文件系统整体信息的数据结构,主要描述文件系统的目录和文件的静态分布情况,以及描述文件系统的各种组成结构的尺寸、数量等。是对一个文件系统的描述。超级块的对象除了提供文件系统的关键信息(块长度、最大文件长度等),超级块还包含了读、写操作inode的函数指针。

操作系统启动后,系统内核会把超级块中的内容复制到内存中,并周期性的利用内存中的最新内容去更新硬盘上超级块的内容。操作系统意外宕机会导致内存中的超级块没有及时保存到硬盘,轻则导致刚建立的丢失,重则导致文件系统瘫痪。

每个文件都会对应一个inode号码,每一种文件系统一个超级块多个inode也就是多个文件,多个数据块。这一个超级块里面保存有整个文件系统的信息。

超级块的作用是管理整个文件系统中的所有inode函数 。例如可以用alloc_inode分配inode,用destroy_inode删除inode。

参考链接:https://blog.csdn.net/weixin_42269817/article/details/115919817

三、实践内容与截图

通过mksf在一个名为vdisk的虚拟磁盘文件上创建一个EXT2文件系统,有1440个大小为1KB的块

 

 



posted @ 2022-10-03 18:58  20201322陈俊池  阅读(19)  评论(0编辑  收藏  举报