一种模拟文件系统的设计与分析

  • 格式:doc
  • 大小:36.50 KB
  • 文档页数:8

一种模拟文件系统的设计与分析 摘要:在深入研究了多个实用文件系统的功能和实现原理的基础上,用一个文件模拟硬盘,采用多级目录结构,对文件实行按名存取,利用超级块对系统资源进行管理,利用对i节点的操作来实现对文件的各种操作,从而实现了一个小型文件系统。 关键词:文件系统;索引节点;超级块 1系统设计的基本思想 如同一般的文件系统,这个模拟的文件系统也由一个超级块(super_block)来管理。超级块包含文件系统中的基本信息,如系统的容量,数据块的大小,文件名的最大长度,可用块表,可用i节点表,省去了一些不重要的数据成员,如超级块上锁标志等。超级块用来管理文件系统资源,而i节点则使用这些资源,每个文件或目录都对应一个i节点,但两者的i节点属性并不完全相同,鉴于此,系统并没有把文件和目录区别对待,在i节点的属性中有文件类型这一数据成员,对于类型为目录的文件,只需简单地将其数据块地址设为空。显然,这样简化了系统的设计。每个文件或目录都对应一个系统中独一无二的i节点编号。有了超级块和i节点,就可以在此基础上实现用户的操作命令,例如创建目录,只需超级块为之分配一个可用的i节点,并在当前工作目录的文件入口栏一项中添加这个i节点编号。文件系统的工作流程与流程描述如图1所示。 图1文件系统的工作流程 2文件系统的具体设计 2.1超级块的设计与实现 超级块的数据结构设计如下: 超级块(super_block) class super_block{ public: super_block(); ~super_block(); const int get_fs_size() const;//返回文件系统大小,即“硬盘”大小 const int get_block_size() const;//返回块的大小 const int get_max_file_num() const;//返回最大文件数 const int get_max_fn_len() const;//返回文件名的最大长度 int get_free_block();//取一个未用块 int get_free_inode() ;//分配一个i节点 const bool get_modified() const;//超级块是否被修改,本系统未用 void change_modified();//设置修改标志 const bool get_lock() const;//超级块是否上锁,本系统未用 void change_lock();//改变上锁标志 void add_free_inode(int inode_num);//回收i节点 void add_free_block(int block_num);//回收块 int get_bt_size();//返回系统中可用块的数目 int get_it_size();//返回系统中未用i节点的数目 void print();//显示文件系统相关信息,供调试用 private: const intFS_SIZE;//文件系统的容量,即“硬盘”大小 const intBLOCK_SIZE;//块(用于存放文件数据)大小 const intMAX_FILE_NUM;//最多可容纳的文件数 const intMAX_FN_LEN;//文件名的最大长度 vector<int>free_block_table;//存储可用的块编号 vector<int>free_inode_table;//存储可用的i节点号 boolis_modified;//文件系统修改标志 boolsuper_lock;//文件系统上锁标志} 超级块中包含了文件系统的基本信息,如文件系统的容量、块大小、最多可容纳的文件数等。磁盘空间的管理也是通过超级块来实现的,当新建一个文件或者目录时,超级块为新建的文件或目录分配一个新的i节点号,如果是正规文件,还要为其分配一定的数据块,而如果是目录则不用分配数据块。分配过后,从vector中删除已经分配的i节点号与数据块编号。删除文件或目录时则刚好与其相反,收回原有文件或目录的i节点号与数据块编号,这样就完成了简单的磁盘管理。 超级块作为系统资源的管理者,包含了文件系统的基本信息:如表1所示。 2.2i节点的设计与实现 本文件系统包含的文件分为两类,正规文件与目录文件。 表1超级块属性 为了对文件实现良好的操作,在设计时决定了为每个文件都分配一个独一无二的i节点项,这个i节点项中包含了两个大的方面即:i节点号与文件属性。 i节点项的数据结构设计如下: i节点(inode) class inode{ public: inode(); inode(const inode& in); ~inode(); const int get_id() const;//获取i节点号 void set_id(int new_id);//设置i节点号 const string get_owner() const;//取文件属主void set_owner(string new_owner);//设置文件属主 const string get_fn() const;//取文件名 void set_fn(string new_fn);//设置文件名 const char get_file_type() const;//取文件类型 void set_file_type(char new_file_type);//设置文件类型 const vector<char>& get_privilege() const;//取文件存取权限 void set_privilege(vector<char>& new_privilege);//设置文件存取权限 const struct tm get_lw_time() const;//获取最后修改时间 void set_lw_time(struct tm new_lw_time);//设置最后修改写入时间 const vector<int>& get_address() const;//获取存放数据的块号 void set_address(vector<int>& new_address);//设置数据块号 const vector<string>& get_data() const;//取文件数据 void set_data(vector<string>& new_data);//设置文件数据 const int get_file_size() const;//取文件大小 void set_file_size(int new_file_size);//设置文件大小 const int get_link_id() const;//取链接文件指向的文件inode,未用 void set_link_id(int new_link_id);//设置 const int get_link_num() const;//取文件被链接的次数,未用 void set_link_num(int new_link_num);//设置文件被链接的次数,未用 void set_protect();//设置保护标志,本系统未用 void unset_protect();//撤销保护标志,本系统未用 friend ostream& operator<<(ostream& os, const inode& node);//输出文件信息 protected: intid;//文件i节点号,唯一 stringowner;//属主 stringfn;//文件名 charfile_type;//类型,常规:f,目录:d,链接:l vector<char>privilege;//存取权限:读,写,执行P struct tm lw_time;//最后修改时间 vector<int>address;//存放数据的块号,只对常规文件有用 vector<string>data;//文件数据 intfile_size;//文件大小 intlink_id;//被链接文件的inode号 intlink_num;//被链接的次数 boolprotect;//保护位} i节点号是一个文件的主要标识,是查找和对该文件进行操作时的关键字。为每个文件分配一个独一无二的i节点号,这样就可以方便地找到文件,对文件进行想要的操作。 通过对i节点的操作,实现本文件系统的用户基本操作,如创建目录、复制文件等。创建目录时,即通过超级块为新的目录分配一个可用的i节点,并在当前的工作目录的文件入口栏添加这个i节点编号。用到了i节点数据结构中的文件i节点号等参数。 每个文件都有文件名和数据,此外,所有操作系统还给文件赋以其它信息,如最近修改时间、文件长度等等,这些额外的项即文件属性(attribute)。本系统中的文件或目录属性如表2所示。 表2文件目录属性 2.3用户操作命令的设计与实现 在以上设计的基础上,就可以实现用户操作命令了。本系统选用C++编程语言,在Linux下实现了Linux下用户对文件系统的一般操作命令和用户管理命令。前者包括,cd,chmod,chown,cp,df,dir,du,les,locate,ls,mkdir,mv,pwd,rm,vi,后者包括password,useradd,userdel。如表3所示。 表3用户命令 为了方便用户使用这些命令,系统还提供了两个用于提供帮助信息的命令help和man,前者用于列出用户可用的所有命令,后者显示特定命令的帮助信息。系统还实现了一个shell来解释执行这些命令。为了方便各个命令的实现,还有一些全局变量需要在此说明,如表4所示。 表4全局变量说明 3结语 本次模拟文件系统的设计完成了一个简单文件系统和基本操作命令的实现,但在很多方面还存在着不足,可以从以下几个方面来改进:①程序运行要占用较大的内存;②实际的文件系统虽然是一个独立的功能模块,但在操作系统这样一个大的系统中,必须和其它模块交互作用,所以,本系统改进的第一步即可加入内存高速缓冲功能;③系统采用文件模拟硬盘的方式运行,由于文件的格式定义很严格,所以当稍有偏差即可能出错,为提高可靠性,可在这方面加以改进,例如提供备份功能。 参考文献: [1]姜斌,张君.一种Linux平台下的可执行文件防篡改方法[C].浙江省电子学会2011学术年会论文集,2011.