分享

Minix、linux及Solaris文件系统分析和对比 【转】

 mediatv 2012-10-24

文 件系统是操作系统中负责管理和存储文件的重要软件机构,它由三部分组成:与文件管理有关的软件、被管理的文件以及实施文件管理所需的数据结构。从系统角度 来看,文件系统是对文件存储器空间进行组织和分配,负责文件的存储并对存入的文件进行保护和检索的系统。本文分析了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.1   Minix文件系统概述

            Minix的名称取自英语Mini UNIX,是一个迷你版本的类Unix操作系统(约300MB),其它类似的系统还有Idris,Coherent,和Uniflex等。这些类Unix 操作系统都是重新发展的,并没有使用任何AT&T的程序码。
像所有文件系统一样,Minix3文件系统实现了第一节中文件系统的基本功 能,包括消息、文件分配和释放空间、块高速缓存、记录磁盘块和空闲空间、为用户提供使用接口等。但从本质上来看,Minix文件系统只不过是运行在用户空 间的一个大的C程序。主程序一直循环等待,直到读、写文件时,用户进程向文件系统发送一条消息,表明自己要、需要什么操作,而文件系统会完成相应的工作。
MINIX文件系统与标准的UNIX的文件系统基本相同,由6部分组成:引导块、超级块、i节点位图、区段位图、i节点、数据区。Minix文件系统布局图如下:



pic1.jpg

                         图1 Minix文件系统布局图
引 导块是计算机加电启动时可由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.2  Minix文件系统的实现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文件系统为用户提供了一系列的系统调用,例如创建、打开、关闭、管道等操作。

我也来说两句 查看全部回复
最新回复
云杉上的蝴蝶 (2009-1-27 06:38:37)
3 Linux文件系统
3.1 Linux文件系统概述Linux是一个性能稳定、功能强大、效率高的操作系统。它在功能特性方面与Unix系统相似,同时又具有多任务、多用户、多平台等若干特性
Linux 的第一个版本是基于Minix文件系统的。当 Linux成熟时,引入了扩展文件系统(Ext FS) ,它包含了几个重要的扩展,但提供的性能不令人满意。在 1994 年引入了第二扩展文件系统(secondExtended Filesystem,Ext2) 其特点为存取文件的性能极好,对于中小型的文件更显示出优势;它除了包含几个新的特点外,还相当高效和强健,经过逐步改进EXT3文件系统已成为广泛使用 的Linux文件系统。
Linux文件系统由两大模块组成:虚拟文件系统和实际的文件系统。虚拟文件系统为用户空间程序提供文件系统接口的调用,也是保证系统内核各种文件系统实现能够共存的抽象层。Linux文件系统框图如下:

                     

                  图2linux文件系统框图

VFS 使得Linux可以支持多个不同的文件系统,每个表示一个VFS 的通用接口。由于软件将Linux文件系统的所有细节进行了转换,所以Linux核心的其它部分及系统中运行的程序将看到统一的文件系统。Linux的虚 拟文件系统允许用户同时能透明地安装许多不同的文件系统。Linux 2.6 内核中,几乎支持所有现存的文件系统格式,例如ext3,ext2, xia, minix, umsdos, msdos, vfat, proc,smb, ncp, iso9660, sysv, hpfs, affs, ufs等等。

3.2Linux虚拟文件系统3.2.1VFS概述虚拟文件系统是在内核实现的一个软件层,它既为用户空间程序提供文件系统接口的调用,也是保证系统内核各种文件系统实现能够共存的抽象层。
VFS系统调用如open(2),stat(2), read(2), write(2), chmod(2)等在进程上下文中被调用。文件系统锁在文档Documentation/filesystems/Locking中描述。
1、目录结构缓存(dcache)
VFS 实现了open(2),stat(2), chmod(2)以及其它类似的系统调用。VFS利用传递给这些调用的文件路径参数在目录入口缓存(dcache 或者目录机构缓存)中进行查找。通过一种快速的转换机制将文件路径转化为特定的目录入口。目录结构缓存只存在在RAM中而从不写入磁盘,他们只是为了提高 性能而创建的。
目录结构缓存是整个文件空间的视图,但是绝大多数计算机并没有足够的空间将所有的目录结构同时放在RAM中,因此某些缓存将会丢弃。为了解决目录结构中的路径,VFS也许需要按照路径结构重新创建该缓存,并加载inode节点。这通过查找inode节点实现。
2、Inode节点对象
一 个独立的目录结构通常会有一个指向一个inode的指针。Inodes是文件系统的对象,例如普通文件,目录,FIFO等。他们或者存在于磁盘上(快设备 文件系统)或者内存中。被请求访问的inode从磁盘加载道内存,在修改后再写入磁盘。一个独立的inode可以同时作为多个目录结构的指针目标(如硬链 接时会出现这种情况)。
查找一个inode时,需要通过VFS对inode的父目录inode调用looup()方法。该方法在inode所属的 具体文件系统中实现。一旦VFS请求了目录结构(同时inode),我们就可以通过open(2)打开文件,或者stat(2)查看inode数据。 stat(2)操作很简单,一旦VFS获得了目录结构,它就察看inode数据,并将其中某些数据传给用户空间。
3、文件对象
打开一个文 件还需要其它的操作:获取文件结构(内核实现的文件描述表)。最新分配的文件结构被初始化为一个指向目录结构的指针和一组文件操作函数集合。这些数据从 inode获得。然后调用特定的文件系统实现的open()文件操作执行相关的任务。这是VFS交换功能的一个实现。文件结构被加入进程的文件表述表。
读、写和关闭文件(以及其它相关的VFS操作)通过用户空间的文件描述表获取对应的文件结构,然后调用请求的文件结构来实现需要得功能。一旦文件被打开,目录结构将保持在使用状态,表示VFS inode处于被访问状态。

3.2.2VFS关键数据结构为了为提供统一的文件系统接口,VFS提供一系列的数据结构实现抽象。本文介绍几个关键的数据结构。
l       一个super_operations结构描述了VFS操作文件系统的方式,代表了一个挂载的文件系统。
struct super_operations {
structinode *(*alloc_inode)(struct super_block *sb);
void(*destroy_inode)(struct inode *);
void(*read_inode) (struct inode *);
void(*dirty_inode) (struct inode *);
int(*write_inode) (struct inode *, int);
void(*put_inode) (struct inode *);
void(*drop_inode) (struct inode *);
void(*delete_inode) (struct inode *);
void(*put_super) (struct super_block *);
void(*write_super) (struct super_block *);
int(*sync_fs)(struct super_block *sb, int wait);
void(*write_super_lockfs) (struct super_block *);
void(*unlockfs) (struct super_block *);
int(*statfs) (struct dentry *, struct kstatfs *);
int(*remount_fs) (struct super_block *, int *, char *);
void(*clear_inode) (struct inode *);
void(*umount_begin) (struct vfsmount *, int);
int(*show_options)(struct seq_file *, struct vfsmount *);
int(*show_stats)(struct seq_file *, struct vfsmount *);
#ifdef CONFIG_QUOTA
ssize_t (*quota_read)(struct super_block *,int, char *, size_t, loff_t);
ssize_t (*quota_write)(struct super_block *,int, const char *, size_t, loff_t);
#endif
};
l       file_system_type结构对文件系统进行描述
struct file_system_type {
const char *name;
intfs_flags;
int(*get_sb) (struct file_system_type *, int,
        const char *, void *, struct vfsmount *);
void(*kill_sb) (struct super_block *);
struct module *owner;
struct file_system_type * next;
struct list_head fs_supers;
struct lock_class_key s_lock_key;
struct lock_class_key s_umount_key;
};

3.3 ext2/ext3文件系统ext2是linux文件系统类型,它很好地继承了Unix文件系统的主要特色,如普通文件的三级索引结构,目录文件的树型结 构和把设备作为特别文件等。ext2文件系统是一个逻辑的自包含的实体,它含有节点,目录和数据块。将整个磁盘划分成若干分区,每个分区被当做独立的设备 对待;一般需要一个主分区和一个交换分区主分区用于存放文件系统,交换分区用于虚拟内存。主分区内的空间又分成若干个组。每个组内都包含有一个超级块的拷 贝,以及i节点和数据块等信息。如下图所示,ext文件卷的逻辑块大小可到1K、2K、4K三种,当块大小为1K时,每组内包含1024*8个逻辑块。文 件卷逻辑块的磁盘存储空间安排如下:

        

             图3 ext2文件系统的布局


Linux缺省情况下使用的文件系统为Ext2,ext2文件系统的确高效稳定。但是,随着Linux系统在关键业务中的应用,Linux文件系统的弱点也渐渐显露出来了:其中系统缺省使用的ext2文件系统是非日志文件系统。

Ext3 文件系统是直接从Ext2文件系统发展而来,目前Ext3文件系统已经非常稳定可靠。它完全兼容Ext2文件系统。用户可以平滑地过渡到一个日志功能健全 的文件系统中来。Ext3文件系统即日志文件系统则是在非日志文件系统的基础上,加入了文件系统更改的日志记录。在Ext3文件系统中,所有的文件系统的 添加和改变都被记录到metadata即元数据中。每隔一定时间,文件系统会将更新后的metadata及文件内容写入磁盘,之后删除这部分日志。重新开 始新日志记录。在对metadata做任何改变以前,文件系统驱动程序会向日志中写入一个条目,这个条目描述了它将要做些什么。然后,它继续并修改元数 据。通过这种方法,日志文件系统就拥有了近期metadata被修改的历史记录,当检查到没有彻底卸载的文件系统的一致性问题时,只要根据数据的修改历史 进行相应的检查即可了。也即日志文件系统除了存储数据和元数据(metadata)以外,它们还保存有一个日志,我们可以称之为元元数据(关于元数据的元 数据)。

3.4文件操作Linux文件系统为用户提供了一系列的系统调用,例如创建、打开、关闭、管道等操作。
4 Solaris/OpenSolaris中的ZFS文件系统被称作“史上最后一个文件系统”的ZFS,作为Solaris10和OpenSolaris的 新特性引进后,吸引了开源社区里无数人的关注,Linux之父Linus Torvalds公开表示对Solaris软件的ZFS(Zettabyte文件系统)特别感兴趣,苹果公司也宣称Mac OS X采用ZFS文件系统。

作 为Solaris10的下一代文件存储解决方案,ZFS(ZettabyteFile System),也叫动态文件系统Dynamic File System,是第一个128位的文件系统,存储量级是Zetta级,1Z=1024的3次方个T,而一个T又等于1024个G,我们可以看出zfs是一 个海量级的文件系统。无限容量、自优化、永远数据一致、管理简单无限容量,对于应用来说,ZFS像一个标准的POSIX文件系统,无需移植,对于系统管理 员来说,ZFS彻底摒弃了卷管理的概念,提供了存储池的模型。
4.1基于存储池的管理方式

图4 ZFS的池存储与传统卷管理的对比

传 统的VolumeManager不管是用硬件,firmware还是操作系统的软件实现,volume都是预先设定好的,文件系统建立在单个volume 上,不同的volume之间的空间不能动态共享,这样文件系统就局限于一个设备,因此文件系统自身会受到该volume大小的限制。而ZFS文件系统不限 于任何特定的设备或volume,而是将所有可能的设备都放入一个存储池中,文件系统的大小根据其实际需要在这个池中进行分配,这有点类似于系统对 systemmemory的管理方法,基于这样的管理方法,ZFS文件系统可以充分的利用存储池中的所有存储设备。更可贵的是,所有这一切对用户是透明 的,用户可以像创建和删除目录一样,来动态的管理ZFS文件系统,当一个文件系统被创建的时候,它会自动的mount到系统的文件目录树下,这大大简化了 ZFS管理的难度。同时,存储池中的设备可以动态的加入,删除或替换,同一个ZFS文件系统还可以在不同的系统之间移植。


4.2 snapshot快照

在 基于ufs的Solaris系统中,可以使用ufsdump和ufsrestore命令来备份和恢复文件系统(必须先卸载文件系统),使用fssnap来 创建文件系统的在线快照从而实现在线文件系统的备份。在ZFS文件系统时使用snapshot来进行系统的备份和恢复。两种方法相比,使用 snapshot的优点是:snapshot是一种在线文件系统备份方案,不需要先卸载文件系统;同时,snapshot实际使用多少空间就占用多少,而 不是占用和整个文件系统同样大小的空间。

什么是snapshot呢?它就是在线文件系统的一个快照,它把 文件系统的数据存储在一个备份恢复文件里。快照文件是一个bit-mapped文件,会一直占用磁盘直到删除快照,其大小会随着被拍照的文件系统的活动次 数而改变,主要取决于一上次拍照以来该文件系统有多少数据发生改变。一旦创建snapshot后,就可以像对待其他设备一样对其进行备份操作。如果我们强 行卸载一个活跃的文件系统,就会自动删除其快照(在快照存在的情况下)。

OpenSolaris 2008.11在ZFS自动快照服务之上,引进了时间滑块服务,并将这些功能整合进GNOME桌面环境。这些创新使得我们能轻松使用GNOME文件管理器,来管理ZFS自动快照服务。

4.3 混合存储池从OpenSolaris 2008.05发布版开始,Sun在ZFS中引进了对Intel? High-Performance Solid State Drives(SSDs)的支持,提供混合存储池(Hybrid Storage Pools)。

5 分析和对比Minix文件系统与Linux文件系统的最大区别就是Linux支持虚拟文件系统。VFS使得Linux可以支持多个不同的文件系统,每个表 示一个VFS的通用接口。由于软件将Linux文件系统的所有细节进行了转换,所以Linux核心的其它部分及系统中运行的程序将看到统一的文件系统。 Linux的虚拟文件系统允许用户同时能透明地安装许多不同的文件系统。

Minix文件系统是Linux最早的文件系统,它受限甚大且性能低下。其文件名最长不能超过14个字符(虽然比8.3 文件名要好)且最大文件大小为64M字节。而linux默认的ext2/ext3文件系统则没这方面的限制。

由 于Minix 文件系统实际是教学用操作系统Minix 所使用的文件系统,其功能很不完备并且性能欠佳。Ext2是一个可扩展的、功能强大的文件系统,在Linux中,Ext2是迄今为止最为成功的文件系统之 一,而且作为基本上所有Linux发行版本的基本文件系统。Ext2完全具备了高级文件系统的特点,性能也非常好。在这之后,又出现了现在普通使用的 Ext3,它在Ext2的基础上加入了日志功能,可以使文件系统的操作与存储更加安全。

被称作终极文件系统的ZFS,相比传统文件系统,有许多优秀的地方:
(1) 以前,文件系统被局限于一个设备,因此文件系统自身会受到该设备大小的限制。由于存在大小限制,因此创建和重新创建传统文件系统很耗时,有时候还很难。由 于 ZFS 文件系统不局限于特定设备,因此可以轻松、快捷地创建。在为存储池分配的空间内,ZFS 文件系统可以自动增长。

(2)ZFS 建立在池存储概念的基础上。与典型文件系统映射到物理存储器不同,池中的所有 ZFS 文件系统都共享该池中的可用存储器。因此,即使文件系统处于非活动状态,实用程序(例如 df)报告的可用空间也会发生变化,因为池中的其他文件系统会使用或释放空间。

(3)ZFS 中的所有元数据都是动态分配的。其他大部分文件系统都会预分配其大量元数据。ZFS 是事务性文件系统。大部分文件系统修改都捆绑到事务组中,并异步提交至磁盘,从而保证了数据的安全性和完整性。

(4)采用快照进行系统的备份和恢复。文件系统的快照开销很小,并且很容易在 ZFS 中创建。在大多数ZFS 环境中,快照很可能是通用的。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多