文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:文件系统的接口,对对象操纵和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。
在计算机中,文件系统(file system)是命名文件及放置文件的逻辑存储和恢复的系统。DOS、Windows、OS/2、Macintosh和UNIX-based操作系统都有文件系统,在此系统中文件被放置在分等级的(树状)结构中的某一处。文件被放置进目录(Windows中的文件夹)或子目录,在树状结构中你希望的位置中。
文件系统指定命名文件的规则。这些规则包括文件名的字符数最大量,哪种字符可以使用,以及某些系统中文件名后缀可以有多长。文件系统还包括通过目录结构找到文件的指定路径的格式。
NTFS文件系统NTFS(New Technology File System)是微软开发的具有较好容错性和安全性的文件系统。随着Windows操作系统的发展,基于NT平台的Windows NT4.0己经发展到5.0,其基本文件系统也升级为NTFS 5.0,己经全面取代了Windows 98的FAT32格式文件系统。在内核模式文件系统驱动程序的开发和内核相关程序的开发中,特别是不借助W32子系统提供的文件操作功能,而需要直接操作文件系统的情况下,往往需要掌握NTFS文件系统的结构。本文对NTFS文件系统的磁盘结构、故障恢复和日志系统进行了深入的分析。
NTFS的主要结构是卷,卷由硬盘上的逻辑分区组成。一个磁盘可能包含一个或多个卷。每个卷中又包含许多文件。在NTFS文件系统中,并没有特别为文件系统自身提供额外的空间。而将文件系统所需的全部数据,如记录卷的分配状态位图、文件、目录和系统引导程序等数据,像一般的文件一样储存在硬盘上。这些系统文件称为元文件(metafile),这些数据则称为元数据(metadata)磁盘上的文件使用簇链接在一起。一个簇的长度一定是物理扇区长度的整数倍,并总是2的幕。扇区对NTFS文件系统是透明的,因此它不限制扇区的大小(通常是512个字节)。簇的大小可因卷的大小而改变,一般是由NTFS格式化程序自动决定。
一个文件在磁盘上的位置是通过主控文件表MFT来定位的。主控文件表MFT是NTFS中最重要的系统文件,它是一个关系数据库,由文件记录的数组组成,磁盘卷上的每一个文件都有一个文件记录,当然大的文件可能有多重记录。MFT本身也有一条记录自己的记录。每个文件记录的长度是固定的(一般是1KB)。每个文件由一个文件引用号来标识,这是一个64位的数,它由文件号(低48位)和文件顺序号(高16位)所组成。文件号记录着文件的文件记录在MFT中的位置,文件顺序号则记录着文件记录位置被重复使用的次数,即MFT文件记录被重复使用一次,则文件顺序号加1,这样可以让NTFS完成一致性检查。MFT中的元文件记录的情况如图1所示。
图1
当目录的属性值存放在MFT表的基本文件记录中,该属性就称为常驻属性(resident attribute)。对于常驻属性,属性值存放在属性名的后面。如果一个目录的属性值太大,不能存放在一个文件记录中,那么NTFS将从Data区为该属性值分配存储空间。这些存储空间通常称为一个运行(run),用来存放属性值,存储在运行中的属性称为非常驻属性(non-re sident attribute) 。MFT中的基本文件记录有一个指针指向大小为 2KB的运行(4KB是对应着4KB的簇尺寸),那是一个非常驻索引缓冲区,包含着下一层的目录或文件。采用b+树结构储存目录信息,可以以很快的速度对目录进行查询,并且不需要去读文件自身的文件记录。在存储大量的小文件时,NTFS文件系统能节约存储空间,访问速度也比较快的主要原因即在此。MFT中的目录结构情况如图2所示1。
图2
Linux文件系统Linux系统的一个重要的特征就是支持多种不同的文件系统,如:EXT,FAT,EXT2,EXT3,SYSV等。目前,Linux主要使用的文件系统是EXT2和EXT3文件系统,也是Linux用户最常用的文件系统。各种Linux的系统发布都将EXT2作为操作系统的基础。EXT2文件系统支持标准UNIX文件类型:普通文件、目录文件、特别文件和符号链接。
EXT2磁盘布局EXT2和其他逻辑块文件一样,由逻辑块序列组成,根据用途划分,这些逻辑块通常有:引导块、超级块、mode区及数据区等。
EXT2将其所占的逻辑分区划分为块组,由一个引导块和其他块组组成,每个块组又由超级块、组描述符表、块位图、索引节点位图、索引节点表、数据区构成,如图3所示。
图3
每个块中保存的这些信息是有关EXT2文件系统的备份信息。当某个块组的超级块或mode受损时,这些信息可以用来恢复文件系统。
文件的目录结构Linux系统的目录结构采用了将文件名与文件描述信息分开的方法。文件目录由文件名和该文件的索引节点号构成,一个目录项共占16B。其中,文件名占14个字节,索引节点号(或索引节点指针)占2个字节。因此,1 KB的盘块中可以存放64(1K/16)个目录项,这样就节省了系统查找及访问文件的时间。在一个共有640个FCB的文件目录中查找一个文件时,平均只需启动磁盘5次,因此大大减少了系统开销。如表1所示为一个文件目录的实例。
表1
一个文件的磁盘索引节点占64个字节,主要包括文件标识符、文件存取权限、文件物理地址、文件长度、文件连接系数、文件存取时间等一些文件的重要信息。
文件的物理结构Linux系统文件的物理结构采用混合索引方式,对分配给文件的磁盘块进行管理。在Linux文件系统的索引节点中存在一项i.addr[14],用于存放该文件的磁盘块号。如图4所示为Linux系统的混合索引文件结构。
图4
Linux系统文件实现了按名查找。通过文件名访问文件的过程如下:通过文件名查找文件目录,找到该文件的索引结点号;通过索引结点号查找索引节点区,找到该文件的索引点;根据索引结点中提供a. addr,找到该文件在磁盘的相应的块号序列;根据块号,找到文件内容。
由于Linux系统的EXT2文件系统采用了合理巧妙的文件系统结构,以及目录结构,使得该文件系统多项性能得到优化。采用EXT2系统,能够大大改善磁盘I/O速度,提高I/O组织的灵活性及编程效率。因此,EXT2文件系统为开发嵌入式系统及实时应用系统提供了广泛的基础和手段。
FAT文件系统与NTFS文件系统目录的比较:FAT文件系统直接以文件控制块作为文件目录,这样文件系统目录相应较大,查询速度较慢。以索引结点作为文件目录,对于一些小的文件系统是可以的,但是对较大型的文件系统就不适用了。Linux系统的文件目录为:文件名、索引结点号。这使得Linux系统的文件目录更小,查询速度更快2。