第11章 EXT2文件系统
1.EXT2文件系统数据结构
在Linux下,命令mke2fs [-b blksize -N ninodes] device nblocks在设备上创建一个带有nblocks个块和ninodes个索引节点的EXT2文件系统。
默认块大小为1kb。未指定ninoides,将根据nblocks计算一个默认的ninodes数。
2.虚拟磁盘布局
上述EXT2文件系统的布局如图:
3.Block
B0:引导块,文件系统不会使用它。它用于容纳从磁盘引导操作系统的引导程序。
B1:超级块,用于容纳关于整个文件系统的信息。
部分重要字段:
B2:块组描述符块。EXT2将磁盘块分为几个组。每个组有8192个块(硬盘上的大小为32k)。每组用一个块组描述符结构体描述。
B8:块位图。位图用于分配和回收项。
B9:索引节点位图。一个索引节点就是用于代表一个文件的数据结构。
B10:索引(开始)节点块。
主要索引节点字段:
i_block[15]数组包含指向文件磁盘块的指针,这些磁盘块有:
直接块:i_block[0]至i_block[11],指向直接磁盘块;
间接块:i_block[12]指向一个包含256个块编号生物磁盘块,每个块编号指向一个磁盘块;
双重间接块:i_block[13]指向一个指向256个块的块,每个块指向256个磁盘块;
三重间接块:i_block[14],可以忽略。
4.邮差算法
一个城市有M个街区,编号从0到M-1.每个街区有N座房子,编号从0到N-1.每座房子有一个唯一的街区地址,用(街区,房子)表示。已知某个街区地址BA=(街区,房子),怎么把他转换为线性地址LA。
Linear_address LA=N*block + house;
Block_address BA=(LA/N,LA%N)。
相关应用:
(1) C语言中的Test-Set-Clear位;
(2) 将索引节点号转换为磁盘上的索引节点。
5.遍历EXT2文件系统树
遍历算法:
(1) 读取超级块,验证它确实是EXT2 FS;
(2) 读取块组描述符块,以访问组0描述符;
(3) 读取InodeBeginBlock,获取/的索引节点;
(4) 将路径名标记为组件字符串,假设组件数量为n;
(5) 从(3)中的根索引节点开始,在其数据块中搜索name[0];
(6) 使用索引节点号ino来定位相应的索引节点。
(5) (6)步将重复n次。
将路径名转换为索引节点:
INODE *path2inode(int fd, char *pathname)
返回一个指向文件索引节点的INODE指针;如果文件不可访问,则返回0。