11章学习笔记
1|0第11章 EXT2文件系统
1|111.1 EXT文件系统

EXT2一直作为Linux的默认文件系统。EXT3是EXT2的扩展。EXT3中增加的主要内容是一个日志文件,他将文件系统的变更记录在日志中。日志可在文件系统崩溃时更快地从错误中恢复。没有错误的EXT3文件系统与EXT2文件系统相同。EXT3的最新扩展时EXT4。EXT4的主要变化是磁盘块的分配。在EXT4中,块编号为48位。EXT4是分配连续的磁盘块,称为区段 。
我们的重点是论述文件系统设计和实现的原则,强调简单性以及与Linux的兼容性。我们选择EXT2文件系统。
1|211.2 EXT2文件系统数据结构
11.2.1 通过mkfs创建虚拟磁盘
在Linux下,命令
在设备上创建一个带有nblocks个块(每个块大小为blksize字节)和ninodes个索引节点的EXT2文件系统。设备可以是真实设备,也可以是虚拟磁盘文件。如果未指定blksize,则默认块大小为1KB。
JS:
可在一个名为vdisk的虚拟磁盘文件上创建一个EXT2文件系统,有1440个大小为1KB的块。
11.2.2 虚拟磁盘布局

Block#0:引导块B0是引导块,文件系统不会使用它。它用来容纳一个引导程序,从磁盘引导操作系统。
11.2.3 超级块
Block#1:超级块在硬盘分区中字节偏移量为1024)B1是超级块,用于容纳整个文件系统的信息。下文说明了超级块的结构:
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文件可忽略
目录条目:目录包含dir_entry_2结构,即:
11.5.1 遍历EXT2文件系统树
遍历算法:
1.读取超级块
2.读取块组描述符
3.读取InodeBegin Block,以获取/的索引节点
4.将路径名标记为组件字符串
5.从3.中的跟索引节点开始搜索
6.使用索引节点号ino来定位相应的索引节点
7.重复第5第6步
11.6.1 文件系统结构
1.第一级别实现基本文件系统树
2.第二级别实现文件读/写函数
3.第三级别实现系统的挂载,卸载和文件保护

1|311.7 基本文件系统
type.h文件:包含ext2文件系统的数据结构类型
global.c文件:这类文件包含文件系统的全局变量
实用程序函数
util.c file:该文件包含文件系统常用的实用程序函数
get_block/put_block 将虚拟磁盘块读/写到内存的缓冲区中
iget(dev,ino) 返回一个指针,指向包含INODE(dev,ino)的内存minode
The put(INODE *mip) 释放一个mip指向用完的minode
getino() 实现文件系统树遍历算法
mkdir命令:创建一个带目录名的新路径
rmdir命令:可删除目录
2级文件系统由open,close,lseek,read,write,opendir和readdir组成
挂载操作命令: mount filesys mount_point 允许文件系统包含其他文件系统作为现有文件系统一部分
2|0实践
在一个名为vdisk的虚拟磁盘文件上创建一个EXT2文件系统,有1440个大小为1KB的块

问题与解决
Q: xattr的属性, 需要额外的block去保存(这样不是很浪费?)
A: 不是一个文件就对应一个block去保存xattr, 而是将xattr按链表的方式放在有限个(是1个吗?)block中, 相同xattr属性的文件共享xattr, 见ULK 18.2.4
Q: ext2的目录项的大小有限制吗? 存储位置在哪里? 和FAT32的有什么区别?
A: 目录也是inode, 就有相应的存储的block, block里面的数据就是存储的目录项, 大小限制和普通文件的限制是一样的.
__EOF__

本文链接:https://www.cnblogs.com/GanNy/p/15417724.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通