mc_nns 发表于 2015-08-12 15:20

一个文件系统的实现

链接:
      pfs发布在sourceforge,pfs的网址为sourceforge.net/projects/pfspfs,如果有兴趣的可以去站点下载源代码

概述:
      pfs提供了一个文件系统的抽象,文件系统的类型为PFS,pfs提供用户和组的概念,不支持进程概念
      pfs支持unix/linux系统,不支持其他系统,另外由于本人经济问题,所以仅仅测试了32位环境,对于64位我不知道pfs能否正常工作

简介:
      pfs是一个个人编写的软件,因为我自身能力的不足,pfs难免存在bug(可能存在让程序崩溃或者毁坏整个pfs文件系统的bug),如果您发现任何设计上的不
足和bug都请联系我,本人电话13812708015(我姓颜)。另外如果您是有能力编写vi这样编辑器的大神,也请联系我,我需要您的智慧。
      最后pfs的实现的命令不多而且很多命令都是阉割版,所以pfs提供的功能并不多

设计目的:pfs设计的目的是个人的自娱自乐
      通过阅读pfs源代码,文件系统爱好者和想要学习文件系统的人可以比较深入的学习文件系统的一些知识,pfs支持了文件系统应该有的大部分特性,
      所有阅读pfs的代码可以大概的了解基于inode文件系统的一些设计思路和思想

PFS文件系统:
      PFS文件系统是一个基于inode的文件系统

PFS支持相关: PFS支持以下系统调用,具体函数的意义参考INTERFACE文档
      int   getuid(void);
      int   getgid(void);
      int   dup(int fd);
      int   close(int fd);
      int   umask(int umask);
      int   dup(int fd, int fd2);
      int   ftruncate(int fd, int length);
      int   truncate(const char *pathname, int length);
      int   creat(const char *pathname, int mode);
      int   access(const char *pathname, int mode);
      int   open(const char *pathname, int flags, ...);
      int   lseek(int fd, int offset, int whence);
      int   read(int fd, void *buf, uint bytes);
      int   write(int fd, const void *buf, uint bytes);
      int   unlink(const char *pathname);
      int   link(const char *oldpath, const char *newpath);
      int   rename(const char *oldpath, const char *newpath);
      int   symlink(const char *oldpath, const char *newpath);
      int   fstat(int fd, struct stat *stp);
      int   stat(const char *pathname, struct stat *stp);
      int   lstat(const char *pathname, struct stat *stp);
      int   fchmod(int fd, int mode);
      int   chmod(const char *pathname, int mode);
      int   fchown(int fd, int user, int group);
      int   chown(const char *pathname, int user, int group);
      int   lchown(const char *pathname, int user, int group);
      int   umount(const char *pathname);
      int   mount(const char *source, const char *target, int flags);
      int   chdir(const char *pathname);
      int   rmdir(const char *pathname);
      int   mkdir(const char *pathname, int mode);
      int   mknod(const char *pathname, int mode, int dev);
      int   closedir(mc_DIR *dp);
      int   telldir(mc_DIR *dp);
      void    seekdir(mc_DIR *dp, int loc);
      char    *getcwd(char *buf, int size);
      DIR   *opendir(const char *pathname);
      struct dirent   *readdir(DIR *dp);

IO:
      pfs从unix/linux的标准输入读取数据然后输出到unix/linux的标准输出

安装说明:
      pfs的安装特别简单,在shell中输入make即可,之后用户便可输入./pfs使用pfs

使用说明:
      为了使用pfs,用户首先需要虚拟磁盘,虚拟磁盘可以用dd if=/dev/zero of=xxx.img bs=?? count=??来建立
      然后用户需要调用mkfs来格式化一个虚拟磁盘,最后用户需要调用login命令来进入pfs系统,mkfs和help是唯一两个不需要登录系统就能使用的命令

用户:
      pfs默认提供了root,robin和tom三个用户,分别的密码为空,123456和111111。pfs暂时没有提供添加,删除用户和修改密码的命令

pfs命令介绍: pfs包括以下与文件系统相关的实用命令

su命令:
      命令格式:
                su user
      命令概述:
                切换到指定的用户user
      返回值:
                成功返回0,失败返回-1

cd命令:
      命令格式:
                cd directory
      命令概述:
                切换到指定的目录directory
      返回值:
                成功返回0,失败返回-1

rm命令:
      命令格式1:
                rm file1 ...
      命令格式2:-r等效-R
                rm -rR dir1 ...
      命令概述:
                删除文件或者目录,rm不能删除.和..,同时rm不能删除任何磁盘的根,对于符号链接,rm会直接删除符号链接而非符号链接所指的文件或者目录
      返回值:
                成功返回0,失败返回-1

cp命令:
      命令格式1:
                cp file1 file2
      命令格式2:
                cp file1 ... directory
      命令概述:
                复制文件,cp命令会复制符号链接所指的文件
      返回值:
                成功返回0,失败返回-1

mv命令:
      命令格式1:
                mv file1 file2
      命令格式2:
                mv file1 ... directory
      命令概述:
                移动文件,mv命令会移动符号链接所指的文件
      返回值:返回值只与最后一次mv操作有关
                成功返回0,失败返回-1
ls命令:
      命令格式:
                ls [-aciltuAULR]
      命令概述:
                显示目录下的文件
      返回值:
                成功返回0,失败返回-1

lcp命令:
      命令格式1:
                lcp file1 file2
      命令格式2:
                lcp file1 ... directory
      命令概述:
                将文件从unix/linux系统中复制到格式化为PFS的磁盘中,lcp会复制符号链接所指的文件
      返回值:返回值只与最后一次lcp操作有关
                成功返回0,失败返回-1
cat命令:
      命令格式:
                cat
      命令概述:
                依次显示各个文件的内容,cat会显示符号链接所指的文件的内容而非符号链接自身的内容
      显示格式1:如果只有一个文件
                内容
      显示格式2:如果存在多个文件
                file1:
                        内容
                .
                .
                .
                filen
                        内容
      返回值:cat的返回值只与最后一个要显示的文件有关
                成功返回0,失败返回-1

pwd命令:
      命令格式:
                pwd
      命令概述:
                输出当前目录
      返回值:
                成功返回0,失败返回-1

help命令:
      命令格式:
                help
      命令概述:
                打印帮助信息
      返回值:
                该命令总是返回0

quit命令:
      命令格式:
                quit
      命令概述:
                退出pfs
      返回值:
                无

mkfs命令:
      命令格式:
                mkfs pathname blocks_size swap_size inode_count
      命令概述:
                格式化命令,将磁盘格式化为文件系统PFS
      参数意义:
                pathname为要格式化的磁盘 - 例如1.img
                blocks_size为PFS数据块的大小 - 可选的值为512, 1024, 2048, 4096, 8192
                swap_size为交换区的大小 - 交换区大小最少为10
                inode_count为inode的数目 - inode的数目最少为100,PFS的inode数目是在格式化时就固定的,然后可以修改策略使inode动态分配,
                不过这样要增加一些代码
      返回值:
                成功返回0,失败返回-1

login命令:
      命令格式:
                login device
      命令概述:
                登录命令,执行该命令后pfs会将device作为根磁盘然后初始化系统,然后提示用户登录,最后进入系统
      返回值:
                成功返回0,失败返回-1

mkdir命令:
      命令格式:
                mkdir directory
      命令概述:
                创建一个空目录
      返回值:
                成功返回0,失败返回-1

rmdir命令:
      命令格式:
                rmdir directory
      命令概述:
                删除一个空目录
      返回值:
                成功返回0,失败返回-1

mount命令:
      命令格式:
                mount [-r] device dir
      命令概述:
                将磁盘device挂载置目录dir
      参数意义:
                device为unix/linux中的虚拟磁盘的路径名,dir为PFS文件系统中的空目录,-r表示只读挂载
      返回值:
                成功返回0,失败返回-1

umount命令:
      命令格式:
                umount dir
      命令概述:
                卸载挂载在目录dir的磁盘
      返回值:
                成功返回0,失败返回-1

logout命令:
      命令格式:
                logout
      命令概述:
                退出登录状态
      返回值:
                成功返回0,失败返回-1
页: [1]
查看完整版本: 一个文件系统的实现