传统文件系统结构对于文件间的关联以及基于内容的元数据支持度不足,通常都是将面向文件的元数据信息保存在单独的数据库或者磁盘上,要受到结构上固有的限制,并且无法支持用户自定义的文件关联信息。为了解决这个问题,提出了一种新型文件系统Linking File System(LiFS),能够支持用户定义或者应用程序定义的属性,以及文件间的属性连接。为了保证访问连接及属性时的性能,将元数据保存在非易失性内存中。
当前,利用Web在数十亿文件中查找一个 目标文档远比在本地文件系统中来的容易,这是由于在Web端的文档都是被嵌入在超链接结构中。例如google就利用Web文档间的连接,使用PageRank算法来传递查询结果的排序信息等等。然而,传统文件系统的查询工具能够利用的信息仅包括层次目录结构和文件权限,远远无法满足需求。
传统文件系统的元数据管理开销很大,这是由于内存的易失性导致大量的外存交互。然而,新型的非易失性内存能够有效的保证数据的持久性,尽管它并不能明显的加速一般操作的效率,但是它使得文件系统的设计者可以不必考虑磁盘访问速率,而只需专注用户的需求。
LiFS能够分派属性,并建立文件间的属性连接。有效的优化了查询效率,并扩展了层次目录结构,支持更加友好的、个性化的文件组织结构。文件连接的权重还可以用来记录访问模型,优化后面的预取,索引和查询结果排序等功能。
LiFS的设计模型概要
LiFS的特点在于支持文件间的连接以及这些文件和连接的属性。为了保证LiFS的性能和可靠性,使用非易失性和低延迟的MRAM。在文件系统的最底层,查询请求需要遍历一系列的元数据连接,即使利用缓存,对磁盘上inode的随机访问都显得过于缓慢。然后低延迟的MRAM可以保证近似于实时的元数据操作和查询效率。
连接特性
LiFS中的每一个连接都包括一个源文件,一个目标文件以及一个包含键值对的非空属性集。LiFS连接与POSIX连接的区别在于它包含对文件间关系的描述,而不仅仅是对文件的引用。连接的属性表示了文件间关系的特性。
每一个文件都潜在的包含了与其他任意文件的连接,因此,每一个文件都像是一个目录,文件与目录间的差异被消除了。连接最大的优势在于能够为文件关系提供原生支持,而现有的文件系统只能通过额外的应用程序或者操作系统来提供。除了包含关系,连接还能传递其他一些有效的信息,如父目录,创建者等等。连接根据类型不同,还能够支持动态可定制的文件系统视图。
属性特性
在我们最初的设计中,所有的文件和连接都包含许多属性,每一个键值对的大小都是不受限制的。然而我们在最终的实现中,对键值对的大小提前设置一个合理的上限值,以避免过长的键值对对性能的影响。
属性的键值成员都可以包含任意格式的数据,包括二进制数据,这使得上层应用可以利用丰富的元数据类型。通过文件和连接属性实现元数据的共享,为应用程序的集成提供了强有力的基础支撑。
属性最大的作用在于允许用户、应用程序和系统本身对文件和连接进行注释,从而支持快速而有效的文件搜索、分类、分区、处理和为其他模块提供基础支撑。它还能提供用户和应用程序需要使用的,丰富的属性信息,例如:数据来源,预期用途,创建者,修改历史等等。
我们允许属性能够被执行,一个可执行文件属性的特例就是文件触发。文件触发指定了一个模式/行动对,模式指定了文件上某个操作关联的可执行属性,而行动则指定了关联操作被触发后的代码。文件触发能够有效的简化各类文件操作的执行,例如版本控制,镜像等等。
接口
LiFS提供了一种增强版的POSIX接口,在这里我们列举一些重要的API接口。
连接创建:我们设计了一种新的系统调用——rellink,可以创建关系型连接。创建链接需要源文件、目标文件和一个或多个属性。rellink 调用需要包含属性,否则标准的POSIX就足以胜任了。例如,创建文件夹mkdir,只需源文件和目标文件,不需要属性,这就无法使用我们的rellink。当然,rellink 也可以通过隐含源文件,将其默认值作为属性值来调用mkdir。rellink 创建了一个从源文件的inode 到目标文件的硬链接(hard link)。从源文件到目标文件路径的每一个对象都必须识别,而不能直接使用Inode号。我们也提供了一种类似的调用relsyslink,它创建的是一种类似POSIX接口的软链接(soft link),但是添加了对属性的赋值,这就允许用户创建对象和名字间的关系,此外还可以直接创建对象间的关系型连接。
多重连接和认证: