文档章节

一个文件系统的实现-PFS

mc_robin
 mc_robin
发布于 2015/08/12 09:22
字数 1984
阅读 491
收藏 13

链接:
        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

© 著作权归作者所有

mc_robin
粉丝 4
博文 5
码字总数 7507
作品 1
苏州
私信 提问
加载中

评论(2)

mc_robin
mc_robin 博主

引用来自“徐飞”的评论

现在不都github上玩起吗?
我比较怀旧把
flygogo
flygogo
现在不都github上玩起吗?
PFS文件系统虚拟化工具发布

我设计了一个文件系统,文件系统名为PFS,我还特地为PFS编写了一个能够在unix/linux环境下操作PFS的一个工具,我将其命名为pfs,pfs发布在sourceforge,链接为sourceforge.net/projects/pfsp...

mc_robin
2015/08/12
2
0
Pfs —— 为 Docker 提供的分布式文件系统

Pfs (Pachyderm File System) 是用于 Docker 世界的一个类似 Git 的分布式文件系统。你需要通过 Docker 来使用它。该系统目前还处于 Alpha 阶段。...

oschina
2014/12/12
150
0
apache http server 开启ssl 与tomcat交互

最近做的项目要求使用https访问。在网上看了些资料,又看了看apache http server的文档(有中文版的,而且翻译的很好)。 先说下原理:浏览器 到 http server 使用https加密通信,http serv...

被钓的小鱼
2016/12/27
17
0
一拳超人—写给码农看的数据库优化方法:everything is a file

Everything is a file是UNIX世界中的名言,指的是将系统中各种资源都认为是文件,通过字符串读写方式实现统一接口调用。 起这个标题仅为蹭一下名言热度,我们真正要聊的是数据库世界中的“e...

咩叔
2018/06/29
0
0
ICDE:POLARDB定义云原生数据库

4月17日(巴黎时间)阿里云POLARDB走出国门,亮相ICDE2018,并同步举办阿里云自有的POLARDB技术专场。在会上,阿里云进行了学术成果展示,从而推动Cloud Native DataBase成为行业标准。 以下...

信雪蕊
2018/04/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
24分钟前
2
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部