ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

学习笔记 5

2021-10-17 23:01:32  阅读:156  来源: 互联网

标签:EXT2 文件系统 笔记 学习 索引 磁盘 节点 name


学习笔记 5

第十一章 EXT2文件系统

11.1 EXT2 文件系统

Linux使用EXT2作为默认文件系统。
EXT3是EX2的拓展,增加了一个日志文件,将文件系统的变更记录在日志中。
EXT4是EXT3的最新拓展,主要变化是磁盘块的分配。

11.2 EXT2文件系统数据结构

  1. 通过mkfs创建虚拟磁盘
    在Linux下,命令
    make2fs [-b blksize -N ninodes] device nblocks
    在设备上创建一个带有nblocks个块(每个块大小为blksize字节)和ninodes个索引节点的EXT2文件系统。
    若未指定blksize,则默认块大小为1KB
    若未指定ninoides,mke2fs将根据nblocks计算一个默认的ninodes数。

  2. 虚拟磁盘布局


  3. Block#0:引导块文件系统不会使用它,用来容纳一个引导程序,从磁盘引导操作系统
    Block#1:超级块(在硬盘分区中字节偏移量为1024),用于容纳整个文件系统的信息。
    Block#2:块组描述符块 EXT2将磁盘块分成几个组。每个组有8192个块(硬盘上的大小为32K)。每组用一个块组描述符结构体来描述。
    Block#8:块位图(Bmap)(bg _ block _ bitmap)位图用来表示某种项的位序列,例如,磁盘块或索引节点。位图用于分配和回收项。在位图中,0位表示对应项处于FREE状态,1位表示对应项处于IN _ USE状态。一个软盘有1440块。
    Block#9:索引节点位图(Imap)(bg _ inode _ bitmap)一个索引节点就是用来代表一个文件的数据结构。EXT2文件系统是使用有限数量的索引节点创建的。各索引节点的状态用B9中Imap中的一个位表示。在EXT2 FS中,前10个索引节点是预留的。
    Block#10:索引(开始)节点块(bg_inode_table)每个文件都用一个128字节(EXT4中的是256字节)的独特索引节点结构体表示。

  • 磁盘块
    直接块:i _ block[0]至i _ block[11]指向直接磁块盘
    间接块:i _ block[12]指向一个包含256个块编号的磁盘块,每个块编号指向一个磁盘块
    双重间接块:i _ block[13]指向一个指向256个块的块,每个块指向256个磁盘块
    三重间接块:i _ block[14]对于小型EXT2文件可忽略
  • 数据块:紧跟在索引节点块后面的是文件存储数据块。
  1. 目录条目
    目录包含dir _ entry_2结构,即:

     struct ext2 _ dir _ entry _ 2 {    
     u32 inode;    
     u16 rec _ len;  
     u8 name _ len;    
     u8 file _ type;    
     char name[EXT2 _ NAME _ LEN];    
     };  
    

11.3 邮差算法

Linear _ address LA = N*block + house;  
Block _ address BA = (LA / N,LA %N);  

11.5 遍历EXT2系统文件树

  1. 遍历算法
    (1)读取超级块。检查幻数s_ magic ( 0xEF53),验证它确实是EXT2 FS。
    (2)读取块组描述符块(1 +s_ firt data_ block), 以访问组0描述符。从块组描述符的bg_ inode_ table 条目中找到索引节点的起始块编号,并将其称为InodesBeginBlock。
    (3)读取InodeBeginBlock,获取/的索引节点,即INODE #2。
    (4)将路径名标记为组件字符串,假设组件数量为n。例如,如果路径名=/a/b/c, 则组件字符串是“a”“b”“c", 其中n= 3。用name[0], name[1], ... name[n-1] 来表示组件。
    (5)从(3)中的根索引节点开始,在其数据块中搜索name[0]。 为简单起见,我们可以假设某个目录中的条目数量很少,因此一个目录索引节点只有12个直接数据块。有了这个假设,就可以在12个(非零)直接块中搜索name[0]。目录索引节点的每个数据块都包含以下形式的dir_ entry 结构体:

     [ino rec_ len name _len NAME] [ino rec_ len name 1en NAME]  
    

其中NAME是一系列nlen字符,不含终止NULL。对于每个数据块,将该块读人内存并使用dir entry *dp指向加载的数据块。然后使用name len 将NAME提取为字符串,并与name[0]进行比较。如果它们不匹配,则通过以下代码转到下一个dir_ entry:

	dp = (dir_ entry *)((char *)dp + dp->rec_ len);  

继续搜索。如果存在name[0],则可以找到它的dir_ entry, 从而找到它的索引节点号。
(6)使用索引节点号ino来定位相应的索引节点。
(7)重复(5)~ (6)步。

11.6 EXT2文件系统的实现

文件系统的级别:
分为三个级别:

  • 第一级别实现了基本文件系统树
  • 第二级别实现了文件内容读/写函数
  • 第三级别实现了文件系统的挂载、卸载和文件保护

11.7 基本文件系统

type.h文件:这类文件包含EXT2文件系统的数据结构类型,比如超块、组描述符、索引节点和目录条目结构。此外,它还包含打开文件表、挂载表、PROC结构体和文件系统常数。
global.c文件:这类文件包含文件系统的全局变量。
util.c文件:该文件包含文件系统常用的实用程序函数。最重要的实用程序函数是读/写磁盘块函数iget()、iput()和 getino()。
mount-root.c文件:该文件包含mount_root()函数,在系统初始化期间调用该函数来挂载根文件系统。它读取根设备的超级块,以验证该设备是否为有效的EXT2文件系统。然后,它将根设备的根 INODE ( ino = 2)加载到minode中,并将根指针设置为根minode。它还将所有进程的当前工作目录设置为根minode。分配一个挂载表条目来记录挂载的根文件系统。根设备的一些关键信息,如inode和块的数量、位图的起始块和inode,表,也记录在挂载表中,以便快速访问。

标签:EXT2,文件系统,笔记,学习,索引,磁盘,节点,name
来源: https://www.cnblogs.com/Kylin0/p/15418651.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有