第11章 EXT2文件系统
11.1 EXT2文件系统
Linux一直将EXT2作为默认文件系统。EXT3是EXT2的扩展。EXT3中增加的主要内容是一个日志文件,他将文件系统的变更记录在日志中。日志可在文件系统崩溃时更快地从错误中恢复。没有错误的EXT3文件系统与EXT2文件系统相同。EXT3的最新扩展时EXT4。EXT4的主要变化是磁盘块的分配。在EXT4中,块编号为48位。EXT4是分配连续的磁盘块,称为区段。
我们的重点是论述文件系统设计和实现的原则,强调简单性以及与Linux的兼容性。我们选择EXT2文件系统。
11.2 EXT2文件系统数据结构
11.2.1 通过mkfs创建虚拟磁盘
在Linux下,命令
mke2fs [-b blksize -N ninodes] device nblocks
在设备上创建一个带有nblocks个块(每个块大小为blksize字节)和ninodes个索引节点的EXT2文件系统。设备可以是真实设备,也可以是虚拟磁盘文件。如果未指定blksize,则默认块大小为1KB。
举例:
dd if=/dev/zero of=vdisk bs=1024 count=1440
mke2fs vdisk 1440
可在一个名为vdisk的虚拟磁盘文件上创建一个EXT2文件系统,有1440个大小为1KB的块。
11.2.2 虚拟磁盘布局
Block#0:引导块 B0是引导块,文件系统不会使用它。它用来容纳一个引导程序,从磁盘引导操作系统。
11.2.3 超级块
Block#1:超级块(在硬盘分区中字节偏移量为1024)B1是超级块,用于容纳整个文件系统的信息。下文说明了超级块的结构:
11.2.4 块组描述符
Block#2:块组描述符块(硬盘上的s_first_data_block+1)EXT2将磁盘块分成几个组。每个组有8192个块(硬盘上的大小为32K)。每组用一个块组描述符结构体来描述。
11.2.5 块和索引节点位图
Block#8:块位图(Bmap)(bg_block_bitmap)位图用来表示某种项的位序列,例如:磁盘块或索引节点。位图用于分配和回收项。
Block#9:索引节点位图(bg_inode_bitmap)一个索引节点就是用来表示一个文件的数据结构。EXT2文件系统是使用有限数量的索引节点创建的。各索引节点的状态用B9的Imap中的一个位表示。
11.2.6 索引节点
Block#10:索引(开始)节点(bg_inode_table)每个文件都用一个128字节(EXT4中是256字节)的唯一索引节点结构体表示。
i_block[15]数组包含指向文件磁盘块的指针,这些磁盘块有:
- 直接块:i_block[0]至i_block[11]指向直接磁块盘
- 间接块:i_block[12]指向一个包含256个块编号的磁盘块,每个块编号指向一个磁盘块
- 双重间接块:i_block[13]指向一个指向256个块的块,每个块指向256个磁盘块
- 三重间接块:i_block[14]对于小型EXT2文件可忽略
11.2.7 数据块
11.2.8 目录条目
目录包含dir_entry结构,
11.3 邮差算法
11.3.1 C语言中的Test-Set-Clear位
11.3.2 将索引节点号转换为磁盘上的索引节点
在EXT2文件系统中,每个文件都有一个唯一的索引节点结构。在文件系统上,索引节点从inode_table块开始。每个磁盘包含
INODES_PER_BLOCK = BLOCK_SIZE / sizeof(INODE)
个索引节点。每个索引节点都有一个唯一的索引节点结构。在文件系统磁盘上,索引节点从inode_table块开始。每个磁盘块包含
INODES_PER_BLOCK = BLOCK_SIZE / sizeof(INODE)
个索引节点。每个索引节点都有一个唯一的索引节点号,ino = 1,2,...,从1开始线性计数。已知一个ino,如1234,那么哪个磁盘块包含该索引节点,以及哪个索引节点在该块中?我们需要知道磁盘块号,因为需要通过块来读/写一个真正的磁盘。
block = (ino -1) / INODES_PER_BLOCK + inode_table;
inode = (ino - 1) % INODES_PER_BLOCK;
同样,将EXT2文件系统中的双重和三重间接逻辑块号转换为物理块号也依赖于邮差算法。
将线性磁盘块号转换为CHS = (柱面、磁头、扇区)格式:软盘和旧硬盘使用CHS寻址,但文件系统始终使用线性块寻址。在调用BIOS INT13时,可用该算法将磁盘块号转换为CHS。
11.4 编程示例
sudo apt-get install ext2fs-dev
问题:wsl安装的Ubuntu并不能找到这个包。