# OS实验课作业 **Repository Path**: dyldw/os-experiment-homework ## Basic Information - **Project Name**: OS实验课作业 - **Description**: 这是一个基于libfuse的简单的文件系统,cpp。 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-10-08 - **Last Updated**: 2022-05-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # OS实验课作业 #### 介绍 10月23要交orz,写不完了qaq,呜呜呜呜呜。 还有深度学习作业,计算机图形作业orz,人没了。 这是一个简单的文件系统。 基于libfuse,目标是可以挂载本地或远程的文件系统,直接通过系统调用使用。 #### 进度 v1.0 一个可以用的简易的本地文件系统完成了 [2021-10-20 17:02] #### 软件架构 莫得架构,写完了作业再说。 ##### 设想中的架构 myFs文件系统程序在(ip,端口)监听连接。 myFs客户端是一个fuse接口(适配器?),通过连接(ip,端口)与myFs文件系统通信。连接后就可以通过系统调用操作myFs文件系统。 接着就用正常的系统调用写个实验要求适配器,通过共享内存与shell交互。共享内存上建立两个队列,一个多生产者单消费者队列,一个广播队列。shell和实验要求适配器通过这两个队列交互。 一条线:磁盘文件<->文件映射<->myFs文件系统<->网络适配器<->网络<->myFs客户端<->挂载<->系统调用 ​ 磁盘文件<->文件映射->myFs文件系统<->fuse适配器<->挂载<->系统调用 另一条线:系统调用->myShell服务端->共享内存上的两个队列->myShells(虽然没有任何用处的,但是因为课设要求所以不得不加上这条线) ##### 实际的架构 自底向上 1. IO:文件映射内存。 2. FScomponent: 就是基础组件啦 1. Meta : 用来重建文件系统的元信息 2. Bitset:bitmap的基类,提供基础能力。Bitmap : 位图。InodeBitmap, BlockBitmap。 3. Inode, Block, DirEntry 3. FSbasic:把组件组一起啦 1. 提供之后的会用到的基础能力(就是把FScomponent合在一起简单封装,然后写了几个后面能用到的接口) 4. Buf类:将inode离散的block抽象成连续的内存空间,并再次基础上提供read,write接口。 5. SimpleFSHelper:参数都是inode号。(就是利用FSbasic的接口实现文件系统的功能逻辑)。 6. SimpleFS:继承了接口FSinterface。参数都是路径字符串。利用helper层的接口实现自己的功能。 7. fuseAdaptor: 需要用SimpleFS初始化。 1. fuse接口与SimpleFS接口的适配,数据结构转换,C,C++互转。成员函数转普通的静态函数。 2. 加锁,并发安全(qaq,我知道这里加锁很奇怪,但是课设时间紧,这样弄最简单了orz,不要吐槽)。 3. 为什么这个是单例而文件系统不是单例呢?因为写文件系统的时候不是单例,后来写的多了就不想改了....所以文件系统不是单例orz。因为我太懒了,不想改了。 6. Fuse_oper接口 ``` .getattr = FuseAdaptor::getattr, .mknod = FuseAdaptor::mknod, .mkdir = FuseAdaptor::mkdir, .rmdir = FuseAdaptor::rmdir, .rename = FuseAdaptor::rename, .read = FuseAdaptor::read, .write = FuseAdaptor::write, .statfs = FuseAdaptor::statfs, .readdir = FuseAdaptor::readdir, .open = FuseAdaptor::open, .unlink = FuseAdaptor::unlink ``` #### 构建过程 个人只在`wsl2 ubuntu18.04`和`wsl2 ubuntu20.04`编译测试过没有问题,其他平台不知道可不可以。 windows 一定不可以。 如果愿意做如下安装可以忽略3rdParty。以下是忽略3rdParty的安装方法 ##### 安装cmake ``` sudo apt-get install cmake ``` cmake版本 >= 3.10 版本不够可以从源码编译,[参考网站](https://cmake.org/download/) ##### 安装clang ``` sudo apt install clang ``` 我在`clang version 6.00`和`clang version 10.0.0`下编译过,都OK ##### 安装doxygen ``` sudo apt install doxygen sudo apt install graphviz graphviz-doc ``` ##### 安装spdlog sudo apt-get install libspdlog-dev `bin`目录下是可执行程序,`build/doc/index.html`下是doxygen文档 ##### 编译 在项目根目录下 ``` $ ./autogen.sh ``` 查看文档 ``` cd ./build/docs/html python3 -m http.server 8080 ``` 如果在wsl下,使用 ``` ifconfig ``` 找到正确的ip地址 #### 使用说明 bin目录下就是可执行文件 ##### 查看使用帮助 `./bin/myFsDemo -h` 推荐 ``` $ ./autogen.sh $ dd if=/dev/zero of=./bin/dumpfile bs=100M count=1 $ cd bin $ mkdir test $ ./myFsDemo test/ -d #加 -d打印日志,不想看的话可以不加 ``` ##### 查看挂载 `df -ahT | grep testDir`或者`mount | grep testDir` ##### 取消挂载 `umount test` 失败时使用这个`sudo umount -f test`