1.4.1 存取接口(2)

1.4.1 存取接口(2)

由于文件名的长度在实际的文件系统中都有限制,例如windows系统中文件名不能超过255个字符;另一方面,一个文件包含的数据集往往具有多种含义,这些又很难仅通过文件名表达。因此通过文件名对于数据集的含义进行描述是有限制的。

现在大部分文件系统可以为文件定义许多静态属性,如创建时间、文件大小和所有者等,但仍然无法描述文件的动态属性,例如,无法统计特定用户在特定时段内存取次数最多的文件。对于这些关系存储性能优化的动态属性统计和表达,现在的文件系统往往无能为力。另一方面,在现代文件系统中,文件寻址和表达文件含义的属性没有直接关系,系统主要仍然是通过绝对地址在文件目录树中进行寻址。由于用户往往按照数据集的含义记忆文件,随着系统中文件的增加和每个文件内涵的增加,用户越来越难以确定自己所需文件所在的位置,很多情况下依赖于对于文件目录树的关键字搜索。因此如何对于海量文件进行高效组织和基于内容的寻址是当前文件系统研究的重点之一。

文件目录是一种对大量数据集及其相关性的组织抽象,文件目录结构是存储系统展现给用户或者上层应用的逻辑视图,和线性块存储空间相比,一方面,树形的文件目录存储空间更容易让人们理解不同数据集之间的组织关系,方便对于数据集的组织和管理;另一方面应用程序或者用户对于文件和目录的操作无需了解所在存放存储设备的特性,也无需关心具体的存取过程。因此文件目录抽象容易被用户理解和操作。

另外,由于在文件目录树中两个子树在路径上是逻辑无关的,因此可以把多个子树通过挂接到所设置连接点构造成一个更大的逻辑树,这一特性使得文件目录树非常方便扩展,例如NAS存储系统通过输出的文件目录结构给用户使用。

IEEE制定的POSIX(Portable Operating System Interface)是应用程序访问文件系统的API标准,也就是前面提到的文件级存取接口及其操作集。POSIX虽然最早为UNIX操作系统设计,但目前几乎所有的文件系统都遵守这一标准或者能够与之兼容。最早的POSIX标准制定于1988年,之后又修订过多次,最新的标准为(IEEE Std 1003.1-2008),其中对于文件和目录操作部分几乎没有改动,这也成为事实上的标准文件操作语义集。

3. 文件地址到块地址的映射

上面两节,分别讨论了块接口和文件接口。存储设备通过块接口给上层展现出基于块的线性地址空间;而文件目录结构给应用和用户提供了一种具有树结构的文件组织视图。事实上经常认为文件目录接口为高层存取语义,而数据块接口为低层存取语义,相对于数据块存取语义,文件目录存取语义具有更丰富的内涵,更容易让人操作和理解。现在的问题是如何实现文件逻辑地址到存储设备物理地址的对应关系和具体操作过程。

文件系统对于文件的物理存取由两次映射完成,一是从用户的文件视图到文件系统的逻辑卷,二是从逻辑卷到具体的物理存储设备。这种映射是建立在系统的核心数据结构和相关的存取操作基础之上的,核心数据结构构成了系统的静态组织结构,包括文件分区表、MFT表、i节点、super 节点等等,每种文件系统可能都有不同的结构方式。另一个方面是加之在这些数据结构上操作,例如从inode结构中获取每个文件数据块的磁盘逻辑地址,又如文件通过系统调用方式存取文件分区表。通过这些核心数据结构和相应的操作完成文件目录到物理设备之间的映射关系。

作为本地存储系统的组织管理者,主机文件系统实现依赖于相应的操作系统平台,呈现出不同的组织结构和操作形式。在WINDOWS平台的FAT类型文件系统中,文件系统通过FAT表来管理和分配磁盘的存储空间,在NTFS文件系统中使用MFT结构来管理磁盘的存储空间。而在UNIX平台的系统中使用inode作为在磁盘组织文件的重要数据结构。

下面我们以FAT32为例,看文件如何映射到物理地址之中。

FAT文件系统将一个逻辑分区划分为四部分,每个逻辑分区可以看成独立的逻辑卷,整个分区依次包括引导区(BOOT区)、文件分配表区(FAT区)、根目录区域(ROOT区)和数据区(DATA区)。引导区和文件分配表区又合称为系统区。引导区从第一扇区开始,使用了三个扇区,定义了该分区每扇区字节数,每簇对应的扇区数等重要参数和引导记录。这些记录之后还留有若干保留扇区。而FAT16文件系统的引导区只占用一个扇区,没有保留扇区。区共保存了两个相同的文件分配表,以保证在一个损坏时,另一个依然可以工作。文件分配表实际上是数据区中所有簇的位图文件,文件系统对数据区的存储空间是按簇进行划分和管理的,簇是空间分配和回收的基本单位。每簇的使用情况用32位二进制填写,未被分配的簇相应位置为零;坏簇相应位置填入特定值;正常已分配的簇相应位置具有非零值,如果该簇是文件的最后一簇,填入的值为FFFFFF0FH,如果该簇不是文件的最后一簇,填入的值为该文件占用的下一个簇的簇号,这样,正好将文件占用的各簇构成一个簇链,保存在FAT表中。0000000H、00000001H两簇号不使用,其对应的两个DWORD位置(FAT表开头的8个字节)用来存放该盘介质类型编号。FAT表的大小就由数据区共有多少簇所决定,取整数个扇区。FAT16文件系统的根目录区(ROOT区)是从FAT区之后紧接着的32个扇区,最多保存512个目录项,作为系统区的一部分。根目录区在FAT32系统中存在分区中的任何位置,因为根目录已改为根目录文件,采用与子目录文件相同的管理方式,可看作是数据区的一部分。一般情况下从第二簇开始使用,大小视需要增加,因此根目录下的文件数目不再受最多512的限制。目录表作为文件的寻址入口,记录文件的第一个簇地址。

图 1.6为UNIX的文件inode索引结构[6],通过这种结构文件内的连续地址空间可以映射到逻辑分区中的块地址区域,除外inode还记录文件的属性。图 1.7为FAT的文件索引结构[7],它是FAT文件系统管理文件和磁盘的核心结构,保存所有文件的分配信息(通过簇链表示)。

除了建立核心数据结构之外,文件系统还建立cache用于缓存元数据和文件数据、存储空间的分配和回收等管理机制。

在实际运行中,文件系统的核心元数据(如FAT表,Superblock)记录存储系统的全局逻辑视图,是所有存取过程所共享的,因此其访问频率是极高的。为了提高这些数据结构的存取性能必须对其进行cache;但另一个方面它们如果不可访问或者不一致,整体存储系统中的数据都不能正常存取,因此保证其完整性也是至关重要的。而cache数据在掉电后丢失,这样就造成最近的元数据和磁盘保存的元数据不一致的问题,原因主要是cache中保存的元数据没有及时更新到磁盘。但另一个方面,如果每次更新强制写磁盘,考虑到元数据操作往往涉及很多小的I/O读写,如目录查询等操作,因此带来很多额外开销,特别是在具有较高延迟时间的网络存储环境中。在NAS系统中文件组织的元数据是存放在NAS设备端,当用户读写NAS中的数据时,必须通过网络获得NAS中的元数据。当涉及到大量的文件创建和删除操作时,命令通过网络传输,性能会严重下降。因此元数据的组织对于系统整体性能和可用性是极其重要的。

另一方面,一般系统初始化是构建核心的数据结构(如FAT表)建立文件目录视图到逻辑卷块线性地址的映射,这些核心的存储结构一旦在系统运行时发生改变,整个系统就会崩溃。另外部分系统的元数据往往受限于设计容量,其扩展性较差,例如FAT32就限制文件的大小。逻辑卷管理层的引入在一定程度上增加了系统的在线扩展性,例如在线的分区扩充,这已不需要系统重新启动,又如使用活动磁盘的概念可以在线的扩展存储容量。又如使用VFS接口和iFS可安装文件系统可以在文件系统级进行适当在线扩充,而且能够融合更多的异构文件系统。但这种扩充性是在不改变本地文件系统结构的前提下完成的。

4. OSD协议

随着数据结构和应用负载的多样化,为了高效使用底层存储设备和系统的特性,必须为存储系统设计新的接口模式满足性能优化的要求。块和文件存取接口分别为应用访问块设备和文件系统提供标准的存取操作语义,一直是存储系统最为流行和通用的接口标准。它充分屏蔽了不同存储系统内部结构和应用程序的差异。然而现有的接口标准不能充分表达应用程序的特殊I/O需要,也不能反映存储设备和系统的许多特性。事实上具有不同存取模式的应用,例如连续流媒体点播(大的连续读)和联机事务处理(小读小写)应用在使用两个接口时不能反映各自的特性;而应用也无法区分底层磁盘阵列是采用的RAID1模式还是RAID0组织模式。

另一个方面,正如前面提到的,文件逻辑地址到块设备物理地址映射的文件分配元数据信息由文件系统维护,而随着存储系统中文件和目录数量的急剧增加,大量用户的并发访问产生更加密集的元数据操作,对于文件系统提出了巨大的挑战;而同时现在存储设备具有越来越强的处理能力,那么把文件的元数据操作放到底层设备上进行处理有效减少主机文件系统的负担。但是在原有两种接口体系下,无法实现这种机制。

一方面为了扩展现有标准接口语义的不足;另一方面也使得存储系统上下层能够更加充分的交换数据的属性,进而实现数据存储的自管理、共享和安全性;同时把数据对象的空间管理移到底层存储设备负责,以便于更好的提高存储服务质量,基于对象的存储接口协议因此被提出,具有以下的特性:

提高设备和数据的共享能力:通过设计平台无关的元数据组织格式,把数据空间管理功能移到设备;系统仅仅需要建立所有存储对象的命名空间,通过唯一的名字访问数据对象;

提供扩展性和安全性:存储设备可以直接处理客户的请求;数据对象可以建立用户级粒度的安全存取策略;

提高性能:应用程序可以提供额外信息用于优化数据存取过程,并能够建立满足服务质量策略;同时存储设备也能够对于不同数据类型进行优化放置。

提高存储管理能力:存储设备能够对于内部的数据对象进行自管理,为不同的数据对象建立相应的存储策略,使得数据管理更加智能化,减少管理员负担。

1995年卡内基梅隆大学的NASD项目首次提出了存储对象的概念,随后标准草案于1999年提交给存储网络工业协会(SNIA ,Storage Networking Industry Association),并于2004成为ANSI标准。对象存储设备(OSD,Object-based Storage Device)标准对现有SCSI协议进行了扩展,集成低层存储、空间管理和安全功能到存储设备,以保证可扩展、自管理,可保护异构共享存储系统;OSD对象包含数据和属性,包括用户数据在设备上的空间信息,并增加了对象ID、对象属性及其操作和对象存取密钥等。事实上这一标准还在不断增加新的内容,例如异常处理和恢复能力以及引入信息生命管理等。