第11章 EXT2文件系统
1. EXT2文件系统数据结构
1 通过mkfs创建虚拟硬盘
命令:mke2fs [-b blksize -N ninodes] device nblocks
2 虚拟磁盘布局
Block#0:引导块
B0是引导块,文件系统不会使用,他用来容纳一个引导程序,从此盘引导操作系统。
3 超级块
Block#1:超级块
B1是超级块,用于容纳整个文件系统的消息。
重要字段:
s_first_data_block:0表示4KB块大小,1表示1KB块大小。它用于确定块组描述符的起始块,即s_first_data_block + 1。
s_log_block_size:确定文件块大小,为1KB*(2s_log_block_size)
s_mnt_count:已挂载文件系统的次数。当挂载次数达到max_mnt_count时,fsck会话将被迫检查文件系统的一致性。
s_magic:标识文件系统类型的幻数。EXT2/3/4文件系统的幻数是0xEF53。
4 块组描述符
Block#2:块组描述符块(硬盘上的s_first_data_block+1)
EXT2将磁盘块分成几个组。每个组有8192个块(硬盘上的大小为32K)。每组用一个块组描述符1结构体来描述。
5 块和索引节点位图
Block#8:块位图(Bmap)位图是用来表示某种项的位序列。在位图中,0位标识对应项处于FREE状态,1位表示对应项处于IN_USE状态。一个软盘有1440个块,但是Block#0未被文件系统使用。所以,位图只有1439个有效位。无效位被视作IN_USE,设置为1。
Block#9:索引节点位图(Imap)一个索引节点就是用来代表一个文件的数据结构。EXT2文件系统是使用数量有限的索引节点创建的。各索引节点的状态用B9的Imap中的一个位表示。在EXT2 FS中,前十个索引节点是预留的。所以,空EXT2 FS的Imap以十个1开头,然后是0.无效位再次设置为1。
6 索引节点
Block#10:索引(开始)节点(bg_inode_table) 每个文件都用一个128字节(EXT4中是256字节)的唯一索引节点结构体表示。
在索引节点结构体中,i_mode为u16或2字节无符号整数。
前四位:文件类型
中间三位:ugs表示文件的特殊用法
最后九位:用于文件保护的rwx权限位
i_size字段表示文件大小(以字节为单位)。每个时间字段都是一个非常大的无符号整数。可借助
库函数将他们转换为日历形式。
i_block[15]数组包含指向文件磁盘块的指针,这些磁盘块有:
7 数据块
紧跟在索引节点块后面的是文件存储数据块。
8 目录条目
目录包含dir_entry结构,即
dir_entry是一种可扩充结构。名称字段包含1到255个字符,不含终止NULL。所以dir_entry的rec_len也各不相同。
苏格拉底挑战