操作系课程设计:一个用户级的文件系统的设计
华南理工大学 07 计算机科学与技术 2 班 钟志豪 200734473222
操作系统课程设计
题目:一个用户级文件系统的设计
姓名:钟志豪
学号:200734473222
班级:07 计算机科学与技术 2 班
电话:15014225XXX
电子邮件:hotrhino@qq.com
QQ:4194880XX
操作系课程设计:一个用户级的文件系统的设计
华南理工大学 07 计算机科学与技术 2 班 钟志豪 200734473222
如需快速使源代码跑起来 请跳到第六部分(第 10 页)
一、课程设计主要目的:
了解用户级文件系统的概念以及其应用,加深对文件系统的了解和设计思路,能够构建一个微型的
用户级文件系统。
二、相关技术背景:
fuse(http://fuse.sourceforge.net/)是一款 linux 核心拓展,允许用户用其提供的接口实现用户级文件系
统程序与操作系统调用相关联,从而用户可以开发出自己的文件系统。本课程设计正是基于 fuse 进行开
发的。
三、主要思想以及技术线路:
1、虚拟磁盘。
为了实现我们的文件系统,我们建立一个 diskimg 的文件作为我们的虚拟磁盘,文件系统的目录
和文件均保存在该虚拟磁盘上。
命令:dd bs=1K count=10K if=/dev/zero of=/tmp/diskimg
则建立一个 10M 空间的虚拟磁盘。每个数据块为 512 字节,则我们拥有了 20480 块数据块。
以下是磁盘组织图:
sb 块 1 块 Inode 节点位图块 2 块 整个磁盘块位图(5 块)
。。。。。
。,。。。
。。
以上每个数据块大小为 512 字节。以下是各个部分数据组织形式:
sb 块(1 block):
struct sb{
int fs_size; // 磁盘共有多少个数据块 20480
int first_blk; // 根目录的开始数据块 这里是521
int bitmap; // 数据位图数量 20480=5*512*8 (5个数据块储存所有数据块的位图)
};
sb 块里保存了上面结构的一个变量,是整个磁盘的基本信息。
inode 节点位图块 (2 block):
这 2 块保存了 inode 节点块空闲信息。对于这 2 块中每一个 2 进制位,若为 0 则表示该位置没有保存
inode 节点,为 1 则表示该位置已被占据。
2*512*8 = 8192
这里可以看出我们的文件系统最多支持 8192 个文件夹和文件。
inode 节点块(512 块)
数据块
(剩余全部)
操作系课程设计:一个用户级的文件系统的设计
华南理工大学 07 计算机科学与技术 2 班 钟志豪 200734473222
整个磁盘块位图(5 block):
这 5 块保存了整个磁盘数据块的空闲信息。对其中每一个 2 进制位,若为 0 则表示该位置的数据块可
用,为 1 则表示该位置的数据块已被占据。
5*512*8 = 20480 刚好是我们的数据块总和。
初始化时,可以看到 1+2+5+512=520,前面 520 个数据块均设为不可用,即这 5 个数据块的前 520 位
均为 1;
inode 节点块(512 block):
struct u_fs_file_directory{
char fname[MAX_FILENAME+1];
char fext[MAX_EXTENSION+1];
size_t fsize; // 若为文件 则保存该文件的大小
int nStartBlock; //第一个数据块
int flag; //0 保留 1 为文件 2为文件夹
};
上面结构为32个字节,保存在512个数据块中; 512*512/32=8192,可以看出,这512块分成了
8192份,每份对应一个上面inode位图位。
数据块(约 19960 block)
数据块保存 2 种不同类型信息。
第一种是文件数据:
struct u_fs_disk_block{
size_t size; //该数据块实际保存了多少文件数据(单位字节)
int nNextBlock; // 下一个数据块 对文件最后一个数据块该项为-1
char data[MAX_DATA_INBLOCK]; // 文件数据区 最多360字节
};
每个数据块会保存这样的一个结构体的数据,剩余16位可以储存较检信息(实现)。
inode节点中,nStartBlock对应于文件的第一个数据块号,文件数据是由这些数据块连起来存储
的,不同数据块存储位置任意。
第二种是文件夹数据:
struct dir_sb{
int nNextBlock; //下一个数据块
unsigned int bitmap; //4*8=32 = 512/sizeof(struct inode_map)
};
struct inode_map{
int inode;
char fname[MAX_FILENAME+1];
};
每个数据块分成512/16=32份。
第一份保存该块的头 一个dir_sb的变量。
dir_sb 中 bitmap 为unsigned int 类型 共32位,每位对应该数据块的一个位置,表示该位
置是个空闲,为0表示空闲,为1 表示已经占用。 初始化时 第一位因保存头而置为占用。
其余31份每份可以保存一个inod_map的结构体,表示该文件夹下的一个子文件或子文件夹的
inode映射,如想查该文件夹下是否存在在一个叫abc的文件或文件夹,则找到一个fname为abc的
inode_map即表示存在,inode为该子文件或子文件夹信息所在的inode位置。
文件夹的目录信息时由一个或几个数据块组成的,数据块同上述文件的数据块一样,不一定是连续
的。
2、实现的接口。
获取文件或文件夹信息
static int u_fs_getattr(const char *path, struct stat *stbuf);
列举目录和文件:
static int u_fs_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
off_t offset, struct fuse_file_info *fi);