四川建设厅网站 蒋app代理推广平台
资源下载地址:https://download.csdn.net/download/sheziqiong/85932109
资源下载地址:https://download.csdn.net/download/sheziqiong/85932109
仿 Linux Ext2 的用户级文件系统
目录
文章目录
- 仿 Linux Ext2 的用户级文件系统
- 目录
- 1. 课设要求
- 2. 完成情况
- 3. 系统设计
- 3.1. 整体设计
- 3.2. 实现文件系统的大致步骤
- 4. 工程实现
- 4.1. 工程结构
- 5. 测试
- 5.1. 编译生成可执行文件
- 5.2. 帮助及版本信息查看
- 5.3. 挂载及格式化
- 5.4. cd 和 ls 功能
- 5.5. 创建/删除文件或目录
- 5.6. 写入写出文件
- 5.7. 磁盘卸载
1. 课设要求
实现一个用户级文件系统。
- 以一个大文件作为虚拟磁盘,将其作为块设备进行读写;
- 通过 format 操作,将虚拟磁盘格式化成 Ext2 的文件卷格式;
- 实现系统调用
creat
open
read
write
lseek(seek)
close
mkdir
及其它 - 能够将文件写入虚拟磁盘,并可完好无损地取出
2. 完成情况
- 将一个大文件作为虚拟磁盘,当作块设备使用
- format 该虚拟磁盘使之成为 Ext2 磁盘卷的结构
- 使用磁盘缓存、superBlock 缓存和 inode 缓存加快访问速度
- 将外部文件写入虚拟磁盘,并完好取出
- 使用仿 Linux 的命令行对虚拟磁盘做文件操作
实现的系统调用功能:
- creat
- open
- read
- write
- lseek(seek)
- close
- eof
实现的用户命令功能:
支持的用户指令有:
-
【mount】
功能:挂载磁盘用法:mount
说明:任何一次程序执行,必须先执行 mount!!!
-
【unmount】
功能:卸载磁盘用法:unmount
说明:退出程序时可以手动执行,也可以由 exit 指令自动 unmount
-
【format】
功能:格式化磁盘用法:format
说明:一块虚拟磁盘 disk.img 使用前必须执行一次.(中途格式化可以将磁盘还原)
-
【mkdir】
功能:创建目录
用法:mkdir dirname
说明:目前仅支持在当前目录创建子目录,若有重名创建失败
-
【touch】
功能:创建新文件
用法:touch filename
说明:目前仅支持在当前目录创建新文件,若有重名创建失败
-
【rm】
功能:删除文件
用法:rm filename
说明:目前仅支持删除当前目录下的文件,注意要删除目录请使用 rmdir
-
【rmdir】
功能:删除目录,递归删除该目录下的所有子目录、文件
用法:rmdir dirname
说明:删除文件请使用 rmdir
-
【help】
功能:显示帮助信息
用法:help
-
【version】
功能:显示作品信息
用法:version
-
【man】
功能:显示命令使用说明(man 暂未支持)
用法:man
-
【exit】
功能:退出程序
用法:exit
说明:会自动卸载磁盘
-
【ls】
功能:显示目录下的所有文件
用法:ls path
说明:path 必须是目录的路径,支持相对地址和绝对地址
-
【cd】
功能:改变当前工作目录
用法:cd path
说明:path 必须是目录的路径,支持相对地址和绝对地址
-
【clear】
功能:清空命令行显示区
用法:clear
-
【store】
功能:高级功能,将外部文件存入虚拟磁盘
用法:store 外部文件路径 内部文件名
说明:仅支持存放到当前目录下,外部文件大小不可超过虚拟磁盘大小
-
【withdraw】
功能:将虚拟磁盘中的文件提取到外部
用法:store 内部文件名 外部文件路径
说明:仅支持提取当前目录下的文件
3. 系统设计
3.1. 整体设计
用户空间包含一些应用程序(例如,文件系统的使用者)和 GNU C 库(glibc),它们为文件系统调用(打开、读取、写和关闭)提供用户接口。系统调用接口的作用就像是交换器,它将系统调用从用户空间发送到内核空间中的适当端点。
VFS 是底层文件系统的主要接口。这个组件导出一组接口,然后将它们抽象到各个文件系统,各个文件系统的行为可能差异很大。有两个针对文件系统对象的缓存(inode 和 dentry)。它们缓存最近使用过的文件系统对象。
每个文件系统实现(比如 ext2、JFS 等等)导出一组通用接口,供 VFS 使用。缓冲区缓存会缓存文件系统和相关块设备之间的请求。例如,对底层设备驱动程序的读写请求会通过缓冲区缓存来传递。这就允许在其中缓存请求,减少访问物理设备的次数,加快访问速度。以最近使用(LRU)列表的形式管理缓冲区缓存。注意,可以使用 sync 命令将缓冲区缓存中的请求发送到存储媒体(迫使所有未写的数据发送到设备驱动程序,进而发送到存储设备)。
这就是 VFS 和文件系统组件的高层情况。
Linux 以一组通用对象的角度看待所有文件系统。这些对象是超级块(superblock)、inode、dentry 和文件。超级块在每个文件系统的根上,超级块描述和维护文件系统的状态。文件系统中管理的每个对象(文件或目录)在 Linux 中表示为一个 inode。inode 包含管理文件系统中的对象所需的所有元数据(包括可以在对象上执行的操作)。另一组结构称为 dentry,它们用来实现名称和 inode 之间的映射,有一个目录缓存用来保存最近使用的 dentry。dentry 还维护目录和文件之间的关系,从而支持在文件系统中移动。最后,VFS 文件表示一个打开的文件(保存打开的文件的状态,比如写偏移量等等)。
3.2. 实现文件系统的大致步骤
文件系统主要负责管理磁盘上的空间,磁盘上至少要包含三部分数据: superblock,inodes 和数据块。
(1) 首先得有一个创建文件系统的工具(如 ext2 文件系统的 mke2fs),用来将磁盘分区格式化成想要的格式,主要是初始化 superblock 和 root inode。
(2) 写一个内核模块,在里面注册自己的文件系统,并且初始化 mount 函数
(3) 当用户在应用层调用 mount 命令时,VFS 就会根据指定的文件系统类型找到我们写的内核模块,并且调用里面的 mount 函数
(4) 在 mount 函数里面读取磁盘上的 superblock 和 root inode
(5) 初始化 root inode 的 inode_operations 和 file_operations,然后返回给 VFS
(6) 这样 VFS 就能根据 root inode 里提供的函数一级一级的往下找到 path 对应文件的 inode
(7) 读取 inode 所指向的数据块(一个或者多个),根据文件的类型,解析数据块的内容。如果文件类型是普通文件,那么数据块里面就是文件的内容;如果文件类型是目录,那么数据块里面存储的就是目录下面所有子目录和文件的名称及它们对应的 inode 号;如果文件类型是软链接,那么数据块里面存储的就是链接到的文件路径。
总的来说,实现文件系统就是怎么在磁盘上组织文件,然后实现 VFS 所要求的 superblock,inode 以及 inode_operations 和 file_operations。
4. 工程实现
4.1. 工程结构
5. 测试
5.1. 编译生成可执行文件
使用 make 命令编译
清理编译中间文件
编译出的可执行文件 user_fs
在 termital 中输入 ./user_fs
执行 user_fs
5.2. 帮助及版本信息查看
输入
help
查看使用说明
输入
version
查看版本信息
5.3. 挂载及格式化
输入
mount
挂载磁盘
如果之前没有虚拟磁盘,会生成一个虚拟磁盘文件 disk.img
因为是新磁盘,需要输入下面的命令进行格式化
format
format 之后的磁盘,是 Ext2 文件卷的格式。并且已经建立了根目录、bin、etc、dev、home 目录。
5.4. cd 和 ls 功能
准备目录结构
为了实验,我们先建立测试用的目录树:
测试 cd 命令,支持相对地址和绝对地址
测试 ls 命令,支持相对地址和绝对地址
5.5. 创建/删除文件或目录
5.6. 写入写出文件
在外部准备好一个文件,这里以一张图片为例
通过 store 命令,将图片存入虚拟磁盘
store black_hole.jpg inner_black_hole.jpg
用 ls 指令查看,可以发现成功存入
为了验证写入写出是不是完好的,我们用 withdraw 命令,将虚拟磁盘中的文件再写出。
withdraw inner_black_hole.jpg black_hole_withdraw.jpg
用文件资源管理器查看可以发现,从虚拟磁盘中读出的文件(下图中红色框)和原本写入虚拟磁盘的文件(下图中绿色框),完全一样。
5.7. 磁盘卸载
输入指令
exit
可以退出程序,会自动卸载虚拟磁盘。
下图中的一系列数字表示卸载的时候从虚拟磁盘缓存中刷回虚拟磁盘。
重新加载磁盘,看看是不是持久化了。这回由于使用的之前的磁盘,不需要格式化,直接 mount 即可,然后 ls 命令查看目录中的文件,发现刚才写入虚拟磁盘的文件还在,持久化成功。
资源下载地址:https://download.csdn.net/download/sheziqiong/85932109
资源下载地址:https://download.csdn.net/download/sheziqiong/85932109