ext2文件系统的磁盘布局
Ext2是Linux在90年代事实上使用的文件系统。它原生支持Unix的所有权机制,符号链接和硬链接。Ext3和Ext4是对Ext2的增强,它们的核心设计都是一样的。
整体结构
从宏观上看,ext2文件系统由若干块组(Block Group)构成。
每个块组里块的数量是相同的,但最后一个块组内块的数量可能小于这个值。
块组=超级块+块组描述+保留GDT块+块位图+索引结点位图+索引结点表+数据块区
超级块 :记录了整个文件系统的信息,在0号块组上。其它块组上也可能有超级块,但都是0号块组上超级块的备份。
超级块上记录的重要信息有:总索引结点数,总块数,。。。
块组描述:记录了所有块组的信息,在0号块组上。块组描述在超级块后面出现在其它块组内,也像超级块一样是0号块组上块组描述的备份。
块组描述上记录了每个块组的:块组号,起始块号,超级块的块号(-1表示不存在),块组描述的块号范围(-1表示不存在),块位图的块号,索引结点位图的块号,索引结点表的块号
块位图:记录当前块组内每个块是否空闲。
索引结点位图:记录当前块组内每个索引结点是否分配。
索引结点表:由索引结点组成的表。
数据块:存放文件的内容。
块(Block)是ext2文件系统的最小单元,块大小相同,从0开始编号。
块的大小可以通过
sudo dumpe2fs <device> | grep "Block size:"
查到。这是在/etc/mke2fs.conf
指定的,也可以在执行mke2fs
使用-b <block-size>
指定。块的大小和数量在格式化后不能改变。
每个块最多只能保存1个文件的数据。
超级块
超级块在当前分区的1024字节处,其长度是1024字节。
1 | pub struct Superblock { |
块组描述
块组描述符表紧跟在超级块之后。
1 | pub struct BlockGroupDescriptor { |
索引结点
索引结点是从1开始编号的。而块是从0开始编号的。
从Ext2的版本1开始,第一个非保留的索引结点记录在超级块的0x54
偏移处。在保留的索引结点里最重要的应该是用于根目录的2号索引结点。
从Ext2的版本1开始,索引结点的大小记录在超级块的0x58
偏移处。查找索引结点的过程先是看它属于哪个块组,然后在该块组的索引结点表里对它进行索引。
Inode数据结构
1 | pub struct Inode { |
目录条目
目录属于一种索引结点,它的内容是目录条目组成的数组。
目录条目:
偏移 | 大小 | 字段描述 |
---|---|---|
0 | 4 | 索引结点 |
4 | 2 | 当前条目的大小 |
6 | 1 | 名字的长度的最低8个有效位 |
7 | 1 | 若超级块的0x60 偏移指定了“目录条目包含文件类型字节”,则此字节代表类型指示符;否则代表名字的长度的最高8个有效位 |
8 | N | 名字 |
目录条目的类型指示符:
值 | 类型描述 |
---|---|
0 | 未知类型 |
1 | 常规文件 |
2 | 目录 |
3 | 字符设备 |
4 | 块设备 |
5 | FIFO |
6 | 网络插座 |
7 | 符号链接 |
根目录
根目录在2号索引结点。