免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1255 | 回复: 0
打印 上一主题 下一主题

[操作系统] 一个文件系统的实现 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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 [file2] ... [filen]
        命令格式2:-r等效-R
                rm -rR dir1 [dir2] ... [dirn]
        命令概述:
                删除文件或者目录,rm不能删除.和..,同时rm不能删除任何磁盘的根,对于符号链接,rm会直接删除符号链接而非符号链接所指的文件或者目录
        返回值:
                成功返回0,失败返回-1

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

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

lcp命令:
        命令格式1:
                lcp file1 file2
        命令格式2:
                lcp file1 [file2] ... [filen] directory
        命令概述:
                将文件从unix/linux系统中复制到格式化为PFS的磁盘中,lcp会复制符号链接所指的文件
        返回值:返回值只与最后一次lcp操作有关
                成功返回0,失败返回-1
cat命令:
        命令格式:
                cat [files]
        命令概述:
                依次显示各个文件的内容,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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP