Simple and Crude FileSystem.
仿Linux下ext2结构的文件系统,提供目录挂载模式和命令行交互模式两种使用方式。
- Linux 环境
- libfuse 3
- root 用户默认密码
toor
; - root 用户 uid 和 gid 为 0,目录挂载模式下登录前用户 uid 和 gid 为 2000,相当于访客身份,新建用户 uid 从 2001 开始递增,新建用户组 gid 从 3001 开始递增;
- 目录挂载模式下通过运行 bin 目录下可执行程序进行用户登录,新建用户,修改密码等操作,原理是脚本程序获取用户输入后向
/.run_command
文件写入内容,文件系统在sc_write()
函数内拦截对该文件的写入操作,并执行相应指令; test_debug
程序用于查看虚拟磁盘文件源数据,如超级块信息,索引节点信息,数据块十六进制数据等,输入h
可查看使用帮助;test_fuse
为目录挂载模式主程序,由于部分函数未实现线程安全,如用到的strtok()
,运行时需要指定单线程模式;test_screen
为命令行交互主程序,支持指令包括:clear
,exit
,ls
,cd
,mkdir
,cat
,touch
,rm
,cp
,chmod
,passwd
,useradd
,userdel
,groupadd
,groupdel
,gpasswd
,vi
,和scfsviewer
,其中vi
是一个十分简单的编辑器,scfsviewer
是集成进来的test_debug
功能;- bitmap 查找未使用的位时每次读取
unsigned long
长度(64位),假设 1G 大小的虚拟磁盘文件,块大小为 4K,则共2^30/2^12 = 2^18 = 262144
个块,每个块对应一位,则共相当于262144/64 = 4096
个无符号长整形,查找速度可以接受; - inode 下 block 块号存储区预留16个直接,2个间接,1个双间接,一共可以指向
16+2*1024+1*1024*1024 = 1050640
个有效block,即单个文件最大约为4G。
- clone仓库源码:
git clone https://github.com/whoisnian/SCFS.git
cd SCFS
mkdir out mnt
- 在目录挂载模式下运行:
- 编译运行并挂载到./mnt目录(-s表示单线程,-d表示debug模式):
make test_fuse && ./out/test_fuse -s -d ./mnt
- 取消挂载:
fusermount -u ./mnt
- 清空数据:
make clean && rm /tmp/test.img
- 编译运行并挂载到./mnt目录(-s表示单线程,-d表示debug模式):
- 在命令行交互模式下运行:
- 编译运行:
make test_screen && ./out/test_screen
- 清空数据:
make clean && rm ./test.img
- 编译运行: