《Unix/Linux系统编程》第十一章学习笔记

第11章 EXT2文件系统

1.EXT2文件系统数据结构

  在Linux下,命令mke2fs [-b blksize -N ninodes] device nblocks在设备上创建一个带有nblocks个块和ninodes个索引节点的EXT2文件系统。

默认块大小为1kb。未指定ninoides,将根据nblocks计算一个默认的ninodes数。

2.虚拟磁盘布局

  上述EXT2文件系统的布局如图:

《Unix/Linux系统编程》第十一章学习笔记

3.Block

  B0:引导块,文件系统不会使用它。它用于容纳从磁盘引导操作系统的引导程序。

  B1:超级块,用于容纳关于整个文件系统的信息。

    部分重要字段:

《Unix/Linux系统编程》第十一章学习笔记

 

  B2:块组描述符块。EXT2将磁盘块分为几个组。每个组有8192个块(硬盘上的大小为32k)。每组用一个块组描述符结构体描述。

 《Unix/Linux系统编程》第十一章学习笔记

 

  B8:块位图。位图用于分配和回收项。

  B9:索引节点位图。一个索引节点就是用于代表一个文件的数据结构。

  B10:索引(开始)节点块。

    主要索引节点字段:

《Unix/Linux系统编程》第十一章学习笔记

 

《Unix/Linux系统编程》第十一章学习笔记

    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。

上一篇:Linux 文件系统


下一篇:Pycharm开发Django项目模版结构优化