EXT2文件系统
通过mkfs创建虚拟硬盘
mke2fs [-b blksize -N ninodes] device nblock
创建一个nblocks个块和ninodes个索引节点EXT2文件系统。
虚拟磁盘布局
超级块
Block#1:超级块(在硬盘分区中字节偏移量为1024)
s_first_data_block:0表示4KB块大小,1表示1KB块大小。
s_log_block_size:确定文件块大小,为1KB
s_mnt_count:已挂载文件系统的次数。
s_magic:标识文件系统类型的幻数。
块组描述符
EXT2将磁盘块分成几个组,每个组上有8192个块,每组用一个块组描述符结构体来描述。
块和索引节点位图
Block#8:块位图:位图是用表示某种项的位序列,例如磁盘块或索引节点
Block#9:索引节点位图:一个索引节点就是用来代表一个文件的数据结构
索引节点
Block#10:索引(开始)节点 每个文件都用一个128字节的唯一索引节点结构体表示
i_block[15]数组包含指向文件磁盘块的指针
- 直接块:i_block[0]至i_block[11],直接指向磁盘块
- 间接块:i_block[12]指向一个包含256个块编号
- 双重间接块
- 三重间接块
邮差算法(gpt)
显示超级块
- 打开虚拟磁盘读取:
int fd=open("vdisk",O_RDONLY)
- 将超级块(Block#1或1KB的1024偏移量位量)读入char buf[1024]中
char buf[1024];
lseek(fd,1024,SEEK_SET);
int n = read(fd,buf,1024);
- 让ext2_super_block *sp结构体指向buf[]。然后,利用sp->field访问超级块结构体的各个字段。
struct ext2_super_block *sp = (struct ext_super_block *)buf;
printf("s_magic = @x\n", sp->s_magic)
printf("s_inodes_count = %d\n",sp ->s_inodes_count);
count
etc
11.1:编写一个C程序来显示设备上EXT2文件系统的块组描述符
显示根索引节点
在EXT2文件系统中,第二个索引节点是根目录"/"的索引节点。如果将索引节点读入内存中,就能显示模式、uid、gid、文件大小、时间字段、硬链接数和数据块编号等多个字段。
遍历EXT2文件系统树
已知一个EXT2文件系统和一个文件的路径名,如/a/b/c,问题是如何找到这个文件。
遍历算法
- 读取超级块。检查它确实是EXT2 FS
- 读取块组描述符块,以访问组0描述符。
- 读取InodeBeginBlock,获取/的索引节点,即INODE#2
- 将路径名标记为组件字符串,假设组件数量为n。
- 从(3)中的根索引节点开始,在其数据块中搜索name[0]。
- 使用索引节点号ino来定位相应的索引节点
- 由于(5)~(6)步将会重复n次,需要编写一个搜索函数
EXT2文件系统的实现
结构:
- 结构体
- 根指针
- openTable条目
- 内存索引节点
- 已挂载的文件系统表
级别: - 基本文件系统树
- 文件内容读/写函数
- 文件系统的挂载、卸载和文件保护
基本文件系统
type.h 包含EXTT2文件系统的数据结构类型,比如超块、组描述符、索引节点和目录条目结构。
global.c 包含文件系统的全局变量
实用程序函数
util.c file:该文件包含文件系统常用的实用程序函数
(1) get_block/put_block函数
(2) iget(dev,ino)函数
(3) The iput(INODE*mip)
(4) getino()函数
(5) getino()/iget()/iput()的使用
1级文件系统函数
- mkdir命令
mkdir pathname
创建了一个带路径名的新目录 - creat算法
mkdir-creat的实现 - link算法
- unlink算法
- symlink算法
- readlink算法
2级文件系统
- open算法
int open(char *filename,int flags);
- lseek
lseek(fd,position,whence);
- close算法
close(int fd)操作可关闭文件描述符。 - 读取普通文件
int read(int fd,char *buf,int nbyes); - 写普通文件
3级文件系统
- 挂载算法
- 卸载算法
- 交叉挂载点
- 文件保护
苏格拉底挑战