ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:454.73KB ,
资源ID:5128638      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5128638.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统大作业ufs文件系统.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

操作系统大作业ufs文件系统.docx

1、操作系统大作业ufs文件系统操作系统课程设计一个用户级文件系统的设计目录1、课程设计的主要目的-32、相关的技术背景-3 2.1. 文件系统简介-3 2.2. FUSE简介-3 2.3. 解压FUSE-4 2.4. 编译并安装FUSE-53、主要思想和技术路线-5 3.1. 数据结构定义-53.2. 主要函数定义-5 3.2.1.u_fs函数-6 3.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文件系统文件系统是一种用来存储和组织计算机文件、目录及其包含的数据的方法,它使文件、目录以及数据的查找和访问得到简化。文件系统能提供丰富的扩展能力。它可以编写成底层文件系统的一个封装程序,从而对其中的数据进行管理,并提

3、供一个增强的、具有丰富特性的文件系统。2.2FUSE简介FUSE是linux平台下使用用户空间的文件系统。我们不需要了解linux内核模块的编程知识,只要利用FUSE提供的文件系统框架,就可以创建自己的功能完备的文件系统。FUSE主要是由以下的三部分构成: 内核模块FUSE 用户空间库libfuse 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) 从

5、设备文件/dev/fuse中读取来自内核模块的请求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 包含了与 FU

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

7、安装 FUSE在 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_

8、fs文件系统使用一个镜像文件(本机测试为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 目录应看做文件。每个目录下包含一个

9、u_fs_directory_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 si

10、ze; /该块用了多少字节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 (*

11、mkdir) (const 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 *);

12、 int (*flush) (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

13、_dirh_t, fuse_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,

15、 off_t, struct 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 或出现错误,否则 w

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

17、常用处不大。*/int (*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)

18、;/往块中写入内容int 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测试结

20、果注意: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文件夹,发现在位置一栏新增了“cy”盘。./u_fs cy4. 查看cy文件夹内容,发现为空ls al cy4.2文件夹测试5. 进入文件系统cd cy6. 创建超长文件

21、夹,操作不允许mkdir abcdefighijk7. 创建普通文件夹mkdir rootdir8. 进入刚创建的dir文件夹cd rootdir9. 创建子文件夹,操作不允许mkdir leftdir4.3文件测试10. 退回到根目录,查看不存在的文件,提示错误cd .cat file11. 创建并编辑文件,添加“Hello,world!”内容gedit hello12. 查看hello文件cat hello13. 测试获取文件列表的功能ls al14. 删除不存在的文件 nofilerm nofile15. 删除存在的文件 hello,并查看rm hellols al4.4格式化功能测试16. 回到文件系统父目录,查看已有文件ls al cy17. 格式化./u_fs_init18. 再次查看,发现已经清空ls al cy4.5卸载文件系统19. 卸载文件系统fusermount u cy文件系统已经卸载5源代码的目录结构及存放位置源码包含:u_fs.h包含数据结构定义及各种常数u_fs_inti.c提供格式化操作bottom.c对bottom.h的底层函数进行定义bottom.h提供底层函数供u_fs.c调用u_fs.c文件系统的主函数makefile提供编译、卸载的功能6运行环境系统: Ubuntu9.04编译器: gcc附加库: fuse-2.7.0

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1