Unix文件系统实验报告.docx_第1页
Unix文件系统实验报告.docx_第2页
Unix文件系统实验报告.docx_第3页
Unix文件系统实验报告.docx_第4页
Unix文件系统实验报告.docx_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

浙江工业大学计算机学院模拟Unix文件系统实 验 报 告姓 名 傅攀 学 号 201426810803 班 级 计自1402 教 师 李波 22目录一、 实验介绍1二、 实验环境3三、 实验设计31.文件系统的磁盘结构的设计32.如何表示目录33.如何表示文件44.关于超级块55.空闲盘块和空闲索引节点管理5四、 数据结构61.基本数据结构62.超级块SuperBlock63.索引节点 DINode74.目录及目录项Dentry、DentryTable85.其他数据结构9五、 模块详解101.目录查找模块102.文件创建模块113.目录创建模块134.文件或目录删除模块135.文件读取模块14六、 实验演示156.实验完成功能列表157.各功能合并展示15七、 实验总结211.问题与解决212.实验体会22一、 实验介绍本次实验要求完成一个 UNIX文件系统的子集的模拟实现。即通过文件模拟磁盘,在该“磁盘”上通过模拟UNIX文件系统创建文件、分配磁盘块的方式实现一个模拟的UNIX文件系统的子集。它可以完成文件或目录的创建、拷贝、修改、重命名等一系列操作。主要目的是学习操作系统是如何在磁盘上创建一个文件的,如何控制文件类型及权限的,并学习相关的一些数据结构及其作用,了解掌握成组链接法等一些资源相关管理办法。下面是实验具体要求与预期功能:(1) 文件卷结构设计l 盘块管理采用成组链接法。l 0#块可省略l I节点栈及空间为20项l 块大小为512字节l 卷盘块数大于100l I节点盘块数大于10块(2) I节点结构设计l 文件大小l 文件联接计数l 文件地址l 文件拥有者l 文件所属组l 文件权限及类别l 文件最后修改时间l 其中文件地址为六项:四个直接块号,一个一次间址,一个两次间址(3) 目录结构l 用16字节表示,其中14字节为文件名,2字节为I节点号(4) 用户及组结构l 用户信息中包括用户名、口令,所属组,用户打开文件表(文件树结构应与用户相对应:有每个用户的HOME目录)组信息中可只包含组名(5) 文件树结构l 除(4)要求外,适当考虑UNIX本身文件树结构(6) 实现功能l ls显示文件目录l chmod改变文件权限l chown改变文件拥有者l chgrp改变文件所属组l pwd显示当前目录l cd改变当前目录l mkdir创建子目录l rmdir删除子目录l mv改变文件名l cp文件拷贝l rm文件删除l ln 建立文件联接l cat连接显示文件内容l passwd修改用户口令(7) 可考虑构造一个简单的编辑器,用于创建文件根据上述实验要求明确开发目标,预期实现上述所有功能,但函数具体功能与Unix系统功能可能存在差异。争取完成实验要求的功能(或简单或复杂)。由于所给实验要求较高,所以要实现这样的功能所需的代码量肯定很大,逻辑也不简单,所以在编写代码的时候采用整体思路是逐层次编写,比如先写最底层的块分配等操作,最后编写文件操作等,然后功能逐个添加,包括权限控制等方面。二、 实验环境本次实验的开发环境信息如下:l 操作系统:Window 10 专业版 64位操作系统l 开发环境:Microsoft Visual Studio Community 2013l 开发语言:C+l 程序类型:Win32 控制台应用程序三、 实验设计1. 文件系统的磁盘结构的设计现在已知,磁盘的第0块为系统的引导块,一般用于系统引导或空闲。第1块为超级块,用于存放文件卷的资源管理信息,包括整个文件卷的盘块数、磁盘索引结点的盘块数、空闲盘块号栈和空闲盘块号栈指针、空闲盘块号栈锁、空闲索引结点栈和空闲索引结点栈指针、空闲索引结点栈锁等。从第2块起存放磁盘索引结点,直到第K块。从第K+1块起及其以后各块,都存放文件数据,直到文件卷的最后一块。所以磁盘结构如下:图1 文件系统磁盘逻辑结构本次实验中要通过文件来模拟磁盘,那么对应的文件所需的数据结构宏观上看可以是连续的block128。至于详细的数据结构如何和对应到块呢,这个只需要使用对应的数据结构的类型指针指向对应位置那么内部指针自然就对齐了。2. 如何表示目录提到目录那么必须清楚两个概念目录文件和目录项。目录其实对应着一个文件也就是目录文件,而目录文件又是有目录项组成的好比目录文件是一张表,目录项是一个一个的表项。而目录项对应着一个文件,要是这个文件是目录文件(就是前面提到的那张表)那这个目录项就是一个目录,否则它就是文件。这个问题用文字还是比较难以表达的,还是用图来说明吧。图2 目录文件与目录项可以发现目录项与目录文件存在相互依赖关系,目录项指向目录文件,目录文件又包含目录项。那么最初的目录怎么知道呢?所以就需要一个根目录项“/”,而这个目录项就应当存储在超级块中。3. 如何表示文件如何表示目录只是抽象的描述了一下目录的结构,可以发现创建目录的过程其实已经包含了创建文件,比如建立一个目录(或者说是文件夹)A,那么就必须创建一个目录文件。那么文件又是如何表示的呢?在我们的印象中,文件是由文件名和文件内容即文件数据组成的。那么在磁盘中文件是如表示、存储的呢?在图2中我们可以看到目录项C指向了一个普通文件,其实仅凭目录项是无法直接定位出磁盘中的文件数据的,但是目录项C中存储了文件名和可以指向文件的数据信息。依然是用一张图来说明这个问题。图3 根据目录项取出文件4. 关于超级块上面抽象的介绍了一些结构,下面细化介绍一下超级块内的主要数据及其功能。首先,对于磁盘这种存储介质,我们可以根据默认约定“第0块是引导块,第1块是超级块”定位读取相关信息。但是不同的磁盘大小有所不同,那么索引节点个数与空闲盘块个数就有所不同,而这些又是文件系统所必须的数据,还有根目录信息等。所以这些信息都必须存在于超级块中。本次实验中简化了超级块的结构去除了超级块锁、设备信息等数据,保留磁盘块信息及索引节点信息。主要是存储空闲块栈和空闲索引节点栈,以及根目录。这些数据或者说空间在文件系统中起着非常重要的作用。5. 空闲盘块和空闲索引节点管理下面介绍超级块中两栈的管理方式,首先是空闲盘块栈。空闲盘块栈的管理方式是成组链接法,用于管理磁盘中可用的盘块包括使用与回收。图4 成组链接法管理空闲盘块栈上图是个人对成组链接法管理磁盘块的理解,当栈满时仍有块号要压入时则将当前站内所有数据拷贝到即将入栈的盘块号对应的盘块中,随后将栈指针重置,块号入栈。当栈底盘块号弹出时,则将该盘块号对应的盘块中的数据取出填入栈中,并将栈指针置于栈顶。当创建或删除文件时只需要重栈中弹出或向栈中压入盘块号即可。空闲索引节点栈的管理与空闲盘块的管理有所不同,空闲索引节点栈在初始化完毕后,一般只有出栈的情况,当栈空时,则从索引节点区取出相应个数的空闲索引节点号(根据索引节点内的引用计数判断该节点是否空闲)。四、 数据结构1. 基本数据结构首先介绍一些基本的数据结构:struct BlockBYTE byte512;struct MyFileSystemBlock block128;typedef unsigned short INodeIndex;/i节点索引号 16位typedef unsigned short BlockIndex;/块号16位Block代表盘块由512个字节组成,而MyFileSystem代表整个磁盘共128块,所以整个模拟文件占64KB。2. 超级块SuperBlock超级块数据结构如下:struct SuperBlockBlockIndex dataBlockIndex;/数据区第一个盘块号 12 inode占10块BlockIndex sizeOfBlocks;/盘块数INodeIndex stackOfINode20;/空闲INode栈BlockIndex stackOfBlock50;/空闲block栈BYTE blockStackPointer;/block栈指针BYTE iNodeStackPointer;/iNode栈指针BlockIndex freeBlocksNum;/当前空闲block总数INodeIndex freeINodesNum;/当前空闲Inode总数Dentry root;/根目录信息BYTE fill344;/填充至512byte;其中stackOfINode20即空闲索引节点栈,对应栈指针iNodeStackPointer,栈大小为20。stackOfBlock50即空闲盘块栈,对应栈指针blockStackPointer,栈大小50。根目录项Dentry root表示保存根目录信息。3. 索引节点 DINode又一个至为重要的结构索引节点,起着文件控制的作用,包括文件类型与用户权限等。其中INode还管理着文件数据所在盘块。/i节点 64bytestruct DINodeunsigned short mode; /文件类型及访问权限标志unsigned short owner; / 文件拥有者的用户标识unsigned short group; / 文件拥有者的组标识unsigned int linkCount;/硬连接计数 判断INODE是否空闲unsigned int size;/ 文件大小BlockIndex blockCount; / 文件块数unsigned int visitTime;/ 文件最近一次访问时间unsigned int modifyTime; / 文件最近一次修改时间unsigned int createTime; / 文件创建时间BlockIndex directBlock4;BlockIndex singleIndirect;BlockIndex doubleIndirect;BYTE fill20;/保证iNode区 iNode连续存放;这里要说明的主要是变量mode文件类型及访问权限和变量linkCount。mode的作用有二,其一区分文件类型,是目录文件还是可执行文件或者是普通文件。再者mode保存了用户的操作权限包括拥有者、同组用户、其他用户的读、写、执行权限。本次实验中权限设置对应关系如下,与实际Unix系统有所差异,而这次文件类型主要用到目录类型与普通类型。图5 mode各位含意然后linkCount,也就是硬链接数。在系统中可以创建多个硬链接,也就是多个目录项对应同一个INode。INode中含有记录实际数据块的存储位置的信息,所以通过上述任意一个文件名对INode的指向的数据块进行修改,都会对其他也会生效,因为它们是共享这一个数据内容的,所以创建新的硬链接也不会消耗实际的存储空间。如果删除文件,那INode会不会被释放呢?那就需要看INode的linkCount的值了。当链接数为0时就会被释放,否则不会。directBlock4,4个直接地址,直接存放文件数据所在的磁盘块号。singleIndirect一次间接地址,存放用于存放磁盘块号的磁盘块的块号,有些绕口。4. 目录及目录项Dentry、DentryTable/目录项 用16字节表示,其中14字节为文件名,2字节为I节点号struct DentryINodeIndex inodeIndex;char name14;Dentry() inodeIndex = 0;Dentry(INodeIndex _index, string _name) inodeIndex = _index; strcpy(name, _name.c_str(); ;struct DentryTableint count;Dentry* head;DentryTable() count = 0; head = null; DentryTable() if (head != null&count!=0)delete head; ;Dentry即之前提到的目录项结构,包含目录名或文件名以及对应文件的INode的索引号。同时Dentry是文件系统按名存取的关键结构,定位文件的关键都是找出Dentry然后定位INode及数据。DentryTable这个是抽象出来的目录文件结构,当然在存储的时候head指针对应的数据区会紧跟count(目录项个数)。5. 其他数据结构然后还有一些其他数据结构,下面简单介绍一下。/下一组空闲盘块 大小为一个blockstruct BlockIndexTabBlockIndex blockIndex50;BYTE fill412; ;struct singleIndirectBlockBlockIndex addr256;struct myFileint size;BYTE* head;myFile() size = 0; head = null; myFile() if (head != null&size!=0)deletehead; ;struct Userunsigned short uid;unsigned short ugroup;char name20;char pwd20;void initUser(unsigned short _uid, unsigned short _ugroup, string _name, string _pwd)uid = _uid;ugroup = _ugroup;strcpy(name, _name.c_str();strcpy(pwd, _pwd.c_str();struct UserTabint count;User * user;UserTab() if (user != null&count != 0) delete user; ;其中BlockIndexTab用于成组链接法保存一组空闲块栈内容,singleIndirectBlock一次间接地址块,这些结构都是为了快速定位或存储内容。然后myFile作为一个起着类似接口作用的数据结构,在进行“磁盘”存储文件时所有的“文件”都通过函数转成myFile类型进行数据块分配。从INode获取文件时的到的也都是myFile类型的文件,随后转换成对应类型的文件。最后User结构和UserTab结构分别表示用户和用户表。五、 模块详解该部分介绍几个主要模块的执行流程,其实各个模块之间的依赖程度还是蛮高的,在各个模块介绍时需要假定某个功能已经实现,就是这种情况“目录查找需要建立在文件读取功能之上,文件读取又需要在文件创建之后,而创建文件又需要目录查找的功能”。1. 目录查找模块目录查找就是操作目录文件和目录项,最终目的是定位出目标目录的目录项。寻找过程大致如下:获取寻找目标路径,比如“/A/B”;判断是否是绝对路径,是;将当前寻找目录设为根目录/;截取外层目录“A”,目标路径变为“B”;在根目录下查找A目录项;若找到这将当前寻找目录设为“A”,继续寻找“B”。而在一个目录中寻找目录的过程实际上是根据目录项A的索引节点号寻找索引节点,并加载文件,随后在文件中查找目标名称的目录项“B”。而根据目录项对应索引节点加载文件的过程在后面将详细描述。而在目录文件中查找目标目录项的过程是一个遍历的过程,从前往后逐个比对名称,若找到目标目录项则介绍查找,否则继续查找直至最后一个目录项。随后返回结果。下面给出目录查找流程图:图6 目录查找流程图2. 文件创建模块文件创建功能建立在目录寻找之后,根据输入的父级目录、文件名、文件数据分配或修改目录项、索引节点、空闲盘块。比如在A目录下创建文件C(A目录下原本没有C),首先定位到目录项A,创建新的目录项C,并分配空闲索引节点,将索引节点号写入目录项C。根据目录项A,载入A对应的目录文件,修改目录文件内容后重新写会对应文件,即重新为A对应的INode分配磁盘块。然后为C对应的索引节点分配空闲盘块,随后将数据写入盘块。下面是文件创建过程简单流程图:图7 文件创建简单流程图3. 目录创建模块目录创建模块实际上与文件创建过程一样,只不过创建的文件的数据是一个目录文件。下面描述如何创建一个目录文件,比如在“/A/”目录下创建目录B,首先获取父级目录项A,取出其索引节点号A_index。随后创建目录项B并分配空闲索引节点,节点号B_index。然后创建另外两个目录项“.”,“.”它们的索引号分别为B_index和A_index,随后将这两个目录项组成目录表文件。最后将目录项B写入A的目录文件中,将B的目录文件分配到其索引节点对应的磁盘块中。4. 文件或目录删除模块文件的删除过程和目录的删除过程可以合并,只不过目录的删除过程更为复杂,需要递归将其下的目录或文件删除。删除一个文件(硬链接为1的)实际上是删除它所在的父目录的目录文件中的目录项,释放目录项对应的索引节点(重置索引节点硬链接数),然后释放索引节点中指向的数据盘块号(盘块号入空闲盘块号栈)。还是举例说明,删除“/A/B”(假设存在),获取父目录“/A/”及目标名称“B”,找到“/A/”对应的索引节点判断是否有权限操作目录A,假设有,找到A对应目录文件中的目录项B,将其在A目录文件中除去。判断目录项B对应索引节点硬链接数是否为1,若不是则无需释放索引节点,只需将索引节点中链接数减一即可。若其硬链接数为1,则需释放索引节点及其对应的数据块。此外还需判断B是文件还是目录,如果B是目录,那还需要递归的向下释放所有B下的目录或文件。而目录的最终直接释放即递归终止条件是目录对应的目录文件下只包含“.”、“.”两个目录项。下面是删除文件的大致过程:图8 删除文件大致过程5. 文件读取模块对于文件读取,显然需要先找到对应文件的目录项,随后定位其索引节点,然后根据索引节点内的信息(文件大小、文件占用盘块数、文件对应盘块号),进行文件数据拼接或者叫读取。六、 实验演示6. 实验完成功能列表l 用户及权限控制l 显示目录下文件或目录l 改变文件权限l 改变文件拥有者或所属组l 显示、改变当前目录l 创建子目录l 删除子目录l 创建文件、修改文件l 改变文件或目录名l 文件拷贝l 文件删除l 建立硬链接l 显示文件内容l 修改用户口令7. 各功能合并展示图9 用户登录图10 显示当前目录下的文件、切换当前目录图11 通过文件输入在磁盘中创建文件图12 文件创建成功、显示文件内容图12 复制文件图13 重命名及删除文件图14 建立文件硬链接图15 创建子目录、重名子目录、修改目录权限图16 修改文件内容图17 权限控制图18 系统所有命令七、 实验总结1. 问题与解决a) 去哪找根目录?回顾一下整个开发过程中遇到的一些麻烦。从接到具体任务书后,在老师的将解下大致了解了磁盘结构和成组链接法的这么一个概念。通过查阅各种博客或者文档然后陪PPT发现成组链接法并不是很难。那么接下来就是实现老师提示过的以及任务书内的数据结构。在这部分前几个数据结构实现并不是很难,因为这方面的博客也不少。很快便实现了SuperBlock 和DINode、Dentry、Block这些结构,但是问题就出现在这由于SuperBlock是参考其他资料的,很多资料里面都没有提到SuperBlock里面有根目录的信息,所以也不敢妄自添加或者因为思维定式就没想过去添加。那么要实现按名存取,不知道根目录怎么找,然后是各种百度,由于这问题描述也比较难,所以百度的结果不尽人意。一直寻找根目录信息是如何获取的方法,这个问题阻挡了

温馨提示

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

评论

0/150

提交评论