/SCFS

仿Linux下ext2结构的文件系统,提供目录挂载模式和命令行交互模式两种使用方式。

Primary LanguageC

SCFS

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为命令行交互主程序,支持指令包括:clearexitlscdmkdircattouchrmcpchmodpasswduseradduserdelgroupaddgroupdelgpasswdvi,和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
  • 在命令行交互模式下运行:
    • 编译运行:
      make test_screen && ./out/test_screen
    • 清空数据:
      make clean && rm ./test.img

结构

  • 1G大小的文件模拟磁盘,磁盘上分为262144个4K扇区,其中
    • 0号扇区:superblock 超级块
    • 1-2048号扇区:inode 索引节点
    • 2049-2050号扇区:inode_bitmap 索引位图
    • 2051-2058号扇区:block_bitmap 数据块位图
    • 2059-262143扇区:block 数据块
  • 具体结构图: SCFS.svg

参考资料