Skip to content

About

基于Ext2的思想和算法,设计一个类Ext2的文件系统,实现Ext2文件系统的一个功能子集。并且用现有操作系统上的文件来代替硬盘进行硬件模拟。

Resources

Stars

8 stars

Watchers

1 watching

Forks

Latest commit

 

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 

Repository files navigation

类Ext2文件系统

基于Ext2的思想和算法,设计一个类Ext2的文件系统,实现Ext2文件系统的一个功能子集。并且用现有操作系统上的文件来代替硬盘进行硬件模拟。

代码主要思路

一些概念和理解

  • 文件系统存储结构
image
  • 文件访问权限
image
  • 多级索引:直接索引6块,一级索引512/2=256块,二级索引256x256=65536块
image
  • 三种时间:

    • CreateTime:目录或文件创建时的时间
    • LastAccessTime:上一次目录列出所有项,文件读出的时间
    • ModifyTime:目录创建新文件或目录、删除子目录或文件,文件写入的时间
  • 命令层操作准备:

    Void Fun() {
        fp=fopen(PATH"rb+");//文件打开权限不同函数可能不同
        ext2_inode cur_inode;
        reload_inode_entry(currentdir_inode&cur_inode);//获取当前目录的索引结点
        ...
        fclose(fp);
    }
    

功能测试结果

1.初始化及输入密码登陆

image

初始密码为666,若输入错误有一次重新输入密码的机会,两次输入都错误则退出文件系统

2.下面是通过help命令显示出的该文件系统可以实现的功能以及相应的命令

image

3.ls:列出当前目录下所有项

image
  • 当前目录为根目录,且初始化后没有创建文件或目录,因此只有两个目录项。
  • 目录的size表示目录下所有目录项的大小之和,文件的size表示文件内容的大小所占的字节数。
  • 文件或目录新创建时默认权限都为r_w_x,可以使用命令进行修改。由于此处并没有不同类型的用户,因此imode只设置了一组值。

4.mkdir+dir_name:在当前目录下创建一个目录

image

成功创建目录dir1,并且可以看到根目录的modifytime修改为了dir1的createtime。

5.mkf+file_name:在当前目录下新建一个文件

  • 成功创建文件file1,并且再次ls可以看到lastaccesstime被修改为上一次使用ls命令访问根目录的时间
  • 可以看出,在同一目录下不允许存在同名文件或同名目录,也不允许文件和目录同名。 下面进行一些文件和目录的创建以便进行后面的测试。

root/

├── dir1/

│ ├── dir11/

│ └── file11

├── file1

├── file2

├── dir2/

│ ├── dir21/

│ └── file_a

└── dir3

创建好后访问根目录如下:

image

6.cd+dir_name/path:改变当前目录路径

进入当前目录下的子目录dir1:

image

返回上级目录,再使用相对路径进入dir1下的目录dir11:

image

在任意目录下使用绝对路径可进入另一路径下的目录:

image

使用cd /命令可直接返回根目录:

image

7.chmod+name+rwx:修改当前目录下名为name的目录或文件的访问权限,rwx为包含想要设置权限字符的字符串

image
  • 测试x权限:
image
  • 测试w权限:
image
  • 测试r权限:
image

8.rmdir+dir_name:删除空目录,若目录不为空则不能删除

image
  • dir1不为空所以不能删除
  • 当前目录下不存在dir所以不能删除
  • dir3为空目录被成功删除

9.rmdir+-r+dir_name:删除目录及目录下所有目录和文件

image

10.open+file_name:打开文件,close+file_name:关闭,read+file_name:读出write+file_name+>/>>+...:>为写入时覆盖原文件,>>为写入时追加内容到文件末尾

(1)测试打开文件和读文件

image
  • 文件未打开时不能进行读写操作
  • 成功打开file1,未写入时读取文件显示文件为空

(2)测试两种写入文件的方式

image image

(3)测试写入过程中数据块的分配及文件的访问时间和修改时间

image image
  • 第一次输入103个a覆盖文件原有内容,再追加103x4个字符,总共515个字符,一个数据块存不下,需要在写入时分配数据块,可以从文件大小及读出结果看出成功分配了数据块。
  • 从ls的结果可以看出,file1的modifytime在写入文件时被修改,lastaccesstime在读文件时被修改

(4)测试文件的关闭

image

(5)测试文件的访问权限

image

11.password:修改密码

image
  • 修改访问权限时需要输入密码,这里使用这个功能来验证密码是否成功被修改

12.login:登录 logoff:登出

image
  • 未登出时不能重复登录
  • 登出后重新登录文件系统内容保持不变

13.若输入不存在的命令,系统会给出提示

image

14.退出文件系统

image

15.format:格式化

image

16.测试多级索引

image image image

输入两次2500个字符,共5000个字符,需要10个数据块来存储(如果没有索引文件是无法分配这么多块的)。从运行结果可以看出,文件成功分配了5000字节空间并能读出5000个a(太长了,没有放全),之后成功删除文件并在删除时关闭了文件。

遇到的问题和困难

1.用来模拟磁盘的文件始终为空

原因:使用fopen打开文件时未正确设置权限,每次打开时都使用wb+清空了文件

解决方法:通过查阅资料设置了正确的权限 (https://blog.csdn.net/qq_37037348/article/details/130563950)

2.输出的同一个结点的三个时间始终相同

原因:localtime函数实现的时候采用的是一块固定buffer,因此如果多次调用此函数,结果值会是最后一次的结果值

解决方法:在localtime函数调用后直接将buffer内容拷贝出来 (https://blog.csdn.net/cleanfield/article/details/6224804)

3.每次需要从磁盘中读出一整个块,如何从读出的数据块缓冲区中分离出需要的目录项结构体

解决方法:使用memcpy函数可以在不同类型的变量之间进行拷贝 (https://blog.csdn.net/GoodLinGL/article/details/114602721?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170124371616800222899886%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170124371616800222899886&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-114602721-null-null.142^v96^pc_search_result_base3&utm_term=memcpy&spm=1018.2226.3001.4187)

About

基于Ext2的思想和算法,设计一个类Ext2的文件系统,实现Ext2文件系统的一个功能子集。并且用现有操作系统上的文件来代替硬盘进行硬件模拟。

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages