操作系统大作业-ufs文件系统_第1页
操作系统大作业-ufs文件系统_第2页
操作系统大作业-ufs文件系统_第3页
操作系统大作业-ufs文件系统_第4页
操作系统大作业-ufs文件系统_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、操作系统课程设计一个用户级文件系统的设计目录1、课程设计的主要目的-32、相关的技术背景-32.1. 文件系统简介-32.2. FUSE简介-32.3. 解压FUSE-42.4. 编译并安装FUSE-53、主要思想和技术路线-53.1. 数据结构定义-53.2. 主要函数定义-53.2.1.u_fs函数-63.2.2.base函数-84、测试结果-94.1. 创建文件系统-94.2. 文件夹测试-104.3. 文件测试-114.4. 测试格式化功能-124.5. 卸载文件系统-125、源代码的目录结构及存放位置-136、运行环境-131课程设计的主要目的更加深入地理解文件系统的原理和设计,了解

2、在linux平台下的编程,加强学生动手能力,丰富代码经验。实现两层目录系统,有以下的要求和限制:1.根目录可以包含子目录和普通文件2.子目录只能包含普通文件,不能包括其他子目录3.所有文件都能可读写(改变模式0666),忽略权限4.许多文件属性如创建和修改时间不需要准确地储存, 5.文件不能被截断6.目录看成是文件2.相关的技术背景2.1文件系统文件系统是一种用来存储和组织计算机文件、目录及其包含的数据的方法,它使文件、目录以及数据的查找和访问得到简化。文件系统能提供丰富的扩展能力。它可以编写成底层文件系统的一个封装程序,从而对其中的数据进行管理,并提供一个增强的、具有丰富特性的文件系统。2.

3、2FUSE简介FUSE是linux平台下使用用户空间的文件系统。我们不需要了解linux内核模块的编程知识,只要利用FUSE提供的文件系统框架,就可以创建自己的功能完备的文件系统。FUSE主要是由以下的三部分构成:l 内核模块FUSEl 用户空间库libfusel mount/umount程序fusermount 在 FUSE 中创建一个文件系统,先安装一个 FUSE 内核模块,然后使用 FUSE 库和 API 。用户空间进程在执行操作文件的系统调用的时候,在内核空间,VFS就会调用各文件系统定义的对应操作函数。FUSE内核模块中被定义的操作函数把和它对应的请求送到实现文件系统的用户空间进程(

4、FUSE文件系统,也就是后台程序),并等待回应。FUSE内核模块和FUSE文件系统间的通信是通过设备文件/dev/fuse进行的。FUSE文件系统把定义的FUSE操作函数群的地址登录到fuse_operations结构体中,并通过把fuse_operations的地址作为参数,调fuse_main()函数以下的图指出在example/hello的例子中,文件系统调用的路径。1. 打开设备文件/dev/fuse2. 挂载FUSE文件系统3. 做成FUSE文件系统句柄4. 登录FUSE操作函数到FUSE文件系统句柄中5. 登录信号处理器6. 执行事件循环A) 从设备文件/dev/fuse中读取来自

5、内核模块的请求B) 执行和这个请求对应的操作函数C) 写入返回给内核模块的应答到设备文件/dev/fuse中7. 卸载FUSE文件系统在库函数fuse_main()中,执行以下的动作。 API库里定义的接口如getattr, mknod,mkdir,unlink等包含在./include/fuse.h头文件里。2.3解压 FUSE要开发一个文件系统,首先请下载 FUSE 的源代码并展开这个包:tar -zxvf fuse-2.7.0.tar.gz。这会创建一个 FUSE 目录,其中保存的是源代码。fuse-2.7.0 目录的内容如下: ./doc 包含了与 FUSE 有关的

6、文档。现在,这只有一个文件 how-fuse-works。 ./kernel 包含了 FUSE 内核模块的源代码(对于使用 FUSE 开发文件系统来说,您当然不用懂得这些代码的机制)。 ./include 包含了 FUSE API 头,您需要这些文件来创建文件系统。您现在唯一需要的就是 fuse.h。 ./lib 中存放的是创建 FUSE 库的源代码,您需要将它们与您的二进制文件链接在一起来创建文件系统。 ./util 中存放的是 FUSE 工具库的源代码。 ./example 当然包含的是一些供您参考的例子,例如 fusexmp.null 和 hello 文件系统。 2.4编译并安装 FUS

7、E在 fuse-2.7.0 目录中运行 configure 脚本: ./configure。这会创建所需要的 makefile 等内容。运行 ./make 来编译库、二进制文件和内核模块。查看 kernel 目录中的文件 ./kernel/fuse.ko 这是内核模块文件。还要查看 lib 目录中的 fuse.o、mount.o 和 helper.o。运行 ./make install 完成 FUSE 的安装。 重要提示:在编译 FUSE 时,系统中需要有内核头文件或源代码。为了简单起见,请确保将内核源代码放到 /usr/src/ 目录中。3主要思想和技术路线3.1数据结构定义u_fs文件系统

8、使用一个镜像文件(本机测试为ufs_iso文件),空间分配如下。Super block(1 block)Bitmap block(1280 blocks)Data block(all the rest blocks)测试时分配了1K * 5K = 5M空间,共10240块。超级块 super block超级块一定是文件系统的第一块,描述了整个文件系统,结构定义如下:struct sb long fs_size; /整个文件系统的块数long first_blk;/根目录所在的第一块long bitmap; /位图块大小目录 Directory目录应看做文件。每个目录下包含一个u_fs_dire

9、ctory_entry结构的表。在本文件系统没有对目录个数作出限制,但要注意文件名不得超过8字节,拓展名不超过3字节。struct u_fs_file_directory char fnameMAX_FILENAME + 1; /文件名char fextMAX_EXTENSION + 1; /拓展名size_t fsize;/大小long nStartBlock; /起始块int flag;/类型:0-未使用 1-文件 2-目录文件 Files文件存储在单一、预分配的虚拟磁盘上,每个虚拟块大小为512字节。struct u_fs_disk_block size_t size; /该块用了多少字

10、节long nNextBlock; /下一块的指针char dataMAX_DATA_IN_BLOCK;/可用的虚拟存储空间;3.2主要函数定义3.2.1.u_fs函数定义 fuse_operation 结构中用到的函数struct fuse_operations int (*getattr) (const char *, struct stat *);int (*readdir) (const char *, fuse_dirh_t, fuse_dirfil_t); int (*mknod) (const char *, mode_t, dev_t); int (*mkdir) (const

11、 char *, mode_t); int (*unlink) (const char *); int (*rmdir) (const char *); int (*open) (const char *, struct fuse_file_info *); int (*read) (const char *, char *, size_t, off_t, struct fuse_file_info *); int (*write) (const char *, const char *, size_t, off_t,struct fuse_file_info *); int (*flush)

12、 (const char *, struct fuse_file_info *); int (*truncate) (const char *, off_t); int (*init) (struct fuse_conn_info *);int (*getattr) (const char *, struct stat *);/*这个函数与 stat() 类似。st_dev 和 st_blksize 域都可以忽略。st_ino 域也会被忽略,除非在执行 mount 时指定了 use_ino 选项。*/int (*readdir) (const char *, fuse_dirh_t, fuse

13、_dirfil_t);/*这个函数会读取一个目录中的内容。这个操作实际上是在一次调用中执行 opendir()、readdir()、closedir() 序列。对于每个目录项来说,都应该调用 filldir() 函数。*/int (*mknod) (const char *, mode_t, dev_t);/*这个函数会创建一个文件节点。此处没有 create() 操作;mknod() 会在创建非目录、非符号链接的节点时调用。*/int (*mkdir) (const char *, mode_t);int (*rmdir) (const char *);/*这两个函数分别用来创建和删除一个目

14、录。 */int (*unlink) (const char *);/*这个函数用来删除一个文件。 */int (*open) (const char *, struct fuse_file_info *);/*这是文件的打开操作。对 open() 函数不能传递创建或截断标记(O_CREAT、O_EXCL、O_TRUNC)。这个函数应该检查是否允许执行给定的标记的操作。另外,open() 也可能在 fuse_file_info 结构中返回任意的文件句柄,这会传递给所有的文件操作。)*/int (*read) (const char *, char *, size_t, off_t, struc

15、t fuse_file_info *);/*这个函数从一个打开文件中读取数据。除非碰到 EOF 或出现错误,否则 read() 应该返回所请求的字节数的数据;否则,其余数据都会被替换成 0。一个例外是在执行 mount 命令时指定了 direct_io 选项,在这种情况中 read() 系统调用的返回值会影响这个操作的返回值。*/int (*write) (const char *, const char *, size_t, off_t, struct fuse_file_info *);/*这个函数将数据写入一个打开的文件中。除非碰到 EOF 或出现错误,否则 write() 应该返回所请

16、求的字节数的数据。一个例外是在执行 mount 命令时指定了 direct_io 选项(这于 read() 操作的情况类似)。*/int (*flush) (const char *, struct fuse_file_info *);/*这表示要刷新缓存数据。它并不等于 fsync() 函数 也不是请求同步脏数据。每次对一个文件描述符执行 close() 函数时,都会调用 flush();因此如果文件系统希望在 close() 中返回写错误,并且这个文件已经缓存了脏数据,那么此处就是回写数据并返回错误的好地方。由于很多应用程序都会忽略 close() 错误,因此这通常用处不大。*/int (

17、*truncate) (const char *, off_t);/*这个函数用来修改文件的大小。*/int (*init) (struct fuse_conn_info *);/*这个函数用来对加载的文件系统初始化,如:获得文件系统的大小。*/3.2.2.base函数定义为u_fs的FUSE用户操作提供底层操作,在base.c定义供u_fs调用。int op_read_blk(long blk,u_fs_disk_block * content);/读取块中的内容int op_write_blk(long blk,u_fs_disk_block * content);/往块中写入内容int

18、op_search_free_blk(int num,long* start_blk);/寻找空闲块,采用首次匹配法int op_set_blk(long blk,int flag);/设置块的flag位int op_create(const char *, int flag);op_create( )/函数把创建目录和文件统一起来。int op_open(const char * org_path, u_fs_file_directory *attr);op_open( )/*返回要打开的目录或文件的u_fs_file_directory记录,根据此记录可以知道目录或文件所在的数据块,大小等

19、属性,以备调用的函数使用。*/int op_setattr(const char* org_path, u_fs_file_directory * attr);op_setattr( )/*更改文件或目录的u_fs_file_directory记录。在删除文件或目录,使用此函数可使flag设为0。在写文件时,调用此函数可以更改文件的大小。*/int op_rm(const char *path,int flag);op_rm( )/*函数把删除目录和文件统一起来。删除时,要把对应的数据块释放;把u_fs_file_directory记录的flag标记为0。*/4测试结果注意:cy采用宏定义,即在u_fs.h里对路径进行定义。现定义为#define UFS_ISO “/home/chenyue/aimao/ufs_iso” 此值应根据不同系统改成对应的绝对路径。4.1创建文件系统1. 分配磁盘空间dd bs=1K count=5K if=/dev/zero of=./ufs_iso2. 格式化磁盘空间./u_fs_init3. 创建装载位置mkdir cy 装载ufs_iso文件系统到cy文件夹,发现在位置一栏新增了“c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论