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]数组包含指向文件磁盘块的指针

  1. 直接块:i_block[0]至i_block[11],直接指向磁盘块
  2. 间接块:i_block[12]指向一个包含256个块编号
  3. 双重间接块
  4. 三重间接块
邮差算法(gpt)

显示超级块

  1. 打开虚拟磁盘读取:
    int fd=open("vdisk",O_RDONLY)
  2. 将超级块(Block#1或1KB的1024偏移量位量)读入char buf[1024]中
char buf[1024];
lseek(fd,1024,SEEK_SET);
int n = read(fd,buf,1024);
  1. 让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,问题是如何找到这个文件。    

遍历算法

  1. 读取超级块。检查它确实是EXT2 FS
  2. 读取块组描述符块,以访问组0描述符。
  3. 读取InodeBeginBlock,获取/的索引节点,即INODE#2
  4. 将路径名标记为组件字符串,假设组件数量为n。
  5. 从(3)中的根索引节点开始,在其数据块中搜索name[0]。
  6. 使用索引节点号ino来定位相应的索引节点
  7. 由于(5)~(6)步将会重复n次,需要编写一个搜索函数

EXT2文件系统的实现

结构:

  1. 结构体
  2. 根指针
  3. openTable条目
  4. 内存索引节点
  5. 已挂载的文件系统表
    级别:
  6. 基本文件系统树
  7. 文件内容读/写函数
  8. 文件系统的挂载、卸载和文件保护

基本文件系统

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级文件系统函数

  1. mkdir命令
    mkdir pathname
    创建了一个带路径名的新目录
  2. creat算法
    mkdir-creat的实现
  3. link算法
  4. unlink算法
  5. symlink算法
  6. readlink算法

2级文件系统

  1. open算法
    int open(char *filename,int flags);
  2. lseek
    lseek(fd,position,whence);
  3. close算法
    close(int fd)操作可关闭文件描述符。
  4. 读取普通文件
    int read(int fd,char *buf,int nbyes);
  5. 写普通文件

3级文件系统

  1. 挂载算法
  2. 卸载算法
  3. 交叉挂载点
  4. 文件保护
    苏格拉底挑战