文件系统是操作系统中负责管理和存储文件的重要软件机构,它由三部分组成:与文件管理有关的软件、被管理的文件以及实施文件管理所需的数据结构。从系统角度来看,文件系统是对文件存储器空间进行组织和分配,负责文件的存储并对存入的文件进行保护和检索的系统。本文分析了Minix、Linux和Solaris文件系统,并对三者的文件系统特性进行了比较。


1文件系统概述1.1文件系统简介文件系统是操作系统的一个重要组成部分,是负责存取和管理文件信息的软件机构,通过对操作系统所管理的存储空间的抽象,向用户提供统一的、对象化的访问接口,屏蔽对物理设备的直接操作和资源管理。
文件系统由三部分组成:与文件管理有关的软件、被管理的文件以及实施文件管理所需的数据结构。从系统角度来看,文件系统是对文件存储器空间进行组织和分配,负责文件的存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。
文件系统具有以下特点:
(1) 友好的用户接口,用户只对文件进行操作,而不管文件结构和存放的物理位置。
(2) 对文件按名存取,对用户透明。
(3) 某些文件可以被某个用户或进程所共享。
(4) 文件系统大都使用磁盘、磁带、和光盘等大容量存储器作为介质,因此,可存储大量信息。

1.2文件的逻辑结构文件的逻辑结构是用户可见结构。逻辑文件从结构上分成二种形式:
l       一种是无结构的流式文件,是指对文件内信息不再划分单位,它是依次的一串字符流构成的文件。
l       一种是有结构的记录式文件, 是用户把文件内的信息按逻辑上独立的含义划分信息单位,每个单位称为一个逻辑记录(简称记录)。所有记录通常都是描述一个实体集的,有着相同或不同数目的数据项,记录的长度可分为定长和不定长记录两类。
显然,对于字符流的无结构文件来说,查找文件中的基本信息单位,例如某个单词,是比较困难的。但反过来,字符流的无结构文件管理简单,用户可以方便地对其进行操作。所以,那些对基本信息单位操作不多的文件较适于采用字符流的无结构方式,例如,源程序文件、目标代码文件等。除了字符流的无结构方式外,记录式的有结构文件可把文件中的记录按各种不同的方式排列,构成不同的逻辑结构,以便用户对文件中的记录进行修改、追加、查找和管理等操作 。


1.3文件的物理模型  文件系统往往根据存储设备类型、存取要求、记录使用频度和存储空间容量等因素提供若干种文件存储结构。用户看到的是逻辑文件,处理的是逻辑记录,按照逻辑文件形式去存储,检索和加工有关的文件信息,也就是说数据的逻辑结构和组织是面向应用程序的。然而,这种逻辑上的文件总得以不同方式保存到物理存储设备的存储介质上去,所以,文件的物理结构和组织是指逻辑文件在物理存储空间中存放方法和组织关系。
在文件系统中,文件的存储设备通常划分为若干个大小相等的物理块,每块长为512字节或1024字节。与此相对应,为了有效地利用存储设备和便于系统管理,一般把文件信息也划分为与物理存储设备的物理块大小相等的逻辑块。从而,以块作为分配和传送信息的基本单位。文件的物理结构分为一下三类:
  连续文件:将一个文件中逻辑上连续的信息存放到存储介质的依次相邻的块上便形成顺序结构,这类文件叫连续文件,又称顺序文件。
   链接文件:一个文件的信息存放在若干不连续的物理块中,各块之间通过指针连接,前一个物理块指向下一个物理块.
   索引文件:一个文件的信息存放在若干不连续物理块中,系统为每个文件建立一个专用数据结构----索引表,表中每一栏目指出文件信息所在的逻辑块号和与之
对应的物理块号。索引表的物理地址则由文件说明信息项给出。

1.4文件系统对用户的访问接口文件系统以系统调用方式或命令方式为用户提供下列几类服务:
(1)关于设置和修改用户对文件的存取权限的服务;
(2)关于建立健全、改变和删除目录的服务;
(3)关于文件共享、设置访问路径的服务;
(4)创建、打开、读写、关闭,以及撤消文件的服务。
这些服务的调节器用名和参数都因系统不同而异。有关对文件操作的命令都基于操作系统提供的系统调用。这些系统调用包括建立文件用的creat,读文件用的read,关闭文件用的close,以及撤消文件用的delete等
2 Minix文件系统2.1Minix文件系统概述Minix的名称取自英语Mini UNIX,是一个迷你版本的类Unix操作系统(约300MB),其它类似的系统还有Idris,Coherent,和Uniflex等。这些类Unix操作系统都是重新发展的,并没有使用任何AT&T的程序码。
像所有文件系统一样,Minix3文件系统实现了第一节中文件系统的基本功能,包括消息、文件分配和释放空间、块高速缓存、记录磁盘块和空闲空间、为用户提供使用接口等。但从本质上来看,Minix文件系统只不过是运行在用户空间的一个大的C程序。主程序一直循环等待,直到读、写文件时,用户进程向文件系统发送一条消息,表明自己要、需要什么操作,而文件系统会完成相应的工作。
MINIX文件系统与标准的UNIX的文件系统基本相同,由6部分组成:引导块、超级块、i节点位图、区段位图、i节点、数据区。

       引导块是计算机加电启动时可由ROMBIOS自动读入的执行代码和数据。但并非所有盘都用作引导设备,所以对于不用于引导的盘片,这一盘块中可以不含代码。但任何盘片必须要含有引导块空间,以保持MINIX文件系统格式的统一。如果内核文件放在文件系统中,那么就可以在文件系统所在的设备的第一个块(引导块空间)存放实际的引导程序,并由它来取得和加载文件系统中的内核映象文件。
超级块主要功能是给出文件系统各个部分的大小,其中包含描叙文件系统布局的信息,和引导块一样,超级块的大小也是固定的1024字节。如果给出块的大小和i节点数,我们可以很容易地算出i节点位图的大小和存放i节点所需的快数。
i节点位图用于说明i节点是否被使用,每个位代表一个i节点,其中第0号i节点为被使用。在内存的超级块表中,有一个字段直接指向第一个空闲的i节点,当新创建的文件需要i节点时,将第一个空闲节点分配出去,修改位图中相应的位,同时将指针指向下一个空闲节点。当一个节点被释放时,需要检查,看这个节点是否位于当前所指向的空闲节点的前面,若是则修改指针,然后将位图中对应的位清零。
区段位图用于说明区段的使用情况,同样是每个位代表一个区段,其中第0号区段未使用。区段是磁盘的一种基本分配单位,其大小和块的大小一样。使用区段的目的是,确保同一个文件的磁盘块位于同一个柱面上,从而提高文件顺序读取时的性能。区段的分配和释放跟i节点类似。


i节点部分存放着文件系统中文件和目录名的索引节点,每个文件或目录名都有一个i节点。每个i节点结构中存放着对应文件的相关信息。


文件中的数据是存放在磁盘块的数据区中的,而一个文件名则通过对应的i节点与这些数据磁盘块相联系,这些盘块的号码就存放在i节点的逻辑块数组中。


另外,对于/dev/目录下的设备文件来说,它们并不占用磁盘数据区中的数据盘块,即它们的文件长度是0。设备文件名的i节点仅用于保存其所定义设备的属性和设备号。设备号被存放在设备文件i节点的逻辑块数组0中。

2.2Minix文件系统的实现2.2.1表格管理对于每一个主要的表格,如块、i节点、超级块等,都有一个相关的文件,该文件包含了该表格的各种管理的函数。这些函数被大量调用,并成为表格与文件系统之间的主要接口。本文进对i节点的管理函数进行简单介绍。
i节点相关数据结构如下:
/*
* This is the originalminix inode layout on disk.
* Note the 8-bit gid andatime and ctime.
*/
struct minix_inode {
      __u16 i_mode;
      __u16 i_uid;
      __u32 i_size;
      __u32 i_time;
      __u8  i_gid;
      __u8  i_nlinks;
      __u16 i_zone[9];
};

/*
* The new minix inode hasall the time entries, as well as
* long block numbers and athird indirect block (7+1+1+1
* instead of 7+1+1). Also,some previously 8-bit values are
* now 16-bit, The inode isnow 64 bytes instead of 32.
*/
struct minix2_inode {
      __u16 i_mode;
      __u16 i_nlinks;
      __u16 i_uid;
      __u16 i_gid;
      __u32 i_size;
      __u32 i_atime;
      __u32 i_mtime;
      __u32 i_ctime;
      __u32 i_zone[10];
};

struct minix_dir_entry {
      __u16 inode;
      char name[0];
};
/*
* minix super-block data ondisk
*/
struct minix_super_block {
      __u16 s_ninodes; inode总数
      __u16 s_nzones; 16位数据块总数
      __u16 s_imap_blocks;inode表位图块数
      __u16 s_zmap_blocks; 数据块位图块数
      __u16 s_firstdatazone; 数据块的起点
      __u16 s_log_zone_size; 数据块长指数
      __u32 s_max_size; 最大文件字节长度
      __u16 s_magic; 版本特征值
      __u16 s_state; 安装状态
      __u32 s_zones; 32位数据块总数
};
i节点的管理函数列表:

  函数
  
  功能
  
  get_inode
  
  将一个i节点读入内存
  
  put_inode
  
  返回不再需要的i节点
  
  alloc_inode
  
  为新文件分配一个i节点
  
  wipe _inode
  
  清除i节点中的某些字段
  
  free_inode
  
  释放一个i节点
  
  update_time
  
  修改i节点中的时间字段
  
  rw_inode
  
  在内存和磁盘之间传送一个i节点
  
  old_icopy
  
  把i节点内容转换为要写入的V1磁盘的i节点
  
  new_icopy
  
  转换V1文件系统的磁盘i节点中读入的数据
  
  dup_inode
  
  表明他人正在使用一个i节点
  
2.2.2主程序文件系统的主循环包含在文件main.c中,在调用fs_init进行初始化后,就进入主循环。它调用get_work等待下一条请求消息的到来,然后转到执行相应操作的例程。
2.2.3文件操作Minix文件系统为用户提供了一系列的系统调用,例如创建、打开、关闭、管道等操作。