Linux? 在文件系统领域不断创新。它支持任何操作系统上的众多不同文件系统。它还提供尖端文件系统技术。Linux 最近又引入两种新的文件系统,它们是 NiLFS(2) 日志结构文件系统和 exofs 基于对象的存储系统。探索这两种文件系统背后的动机和它们的优点。
一种新的 Linux 文件系统的公布总是令人既兴奋又恐惧。兴奋是因为文件系统意味着新的发展空间。恐惧是因为文件系统在早期还是试验性的,尚未迎来黄金时期。但是有时候,新文件系统的公布也意味着对 Linux 未来的投资,而最近 2.6.30-rc1 的公布确实标示着令人感兴趣的前景。在过去几个季度,Linux 主要公布了三种文件系统。2008 年底引入了 B-Tree File System(Btrf),最近又引入了两种独特的文件系统:NiLFS(2) 和 exofs。
文件系统背景知识
我们首先了解这些非传统文件系统,然后探索 NiLFS(2) 和 exofs 的细节。
日志结构文件系统
|
日志结构文件系统在现代计算系统中有丰富的历史。第一个日志结构文件系统由 John Ousterhout 和 Fred Douglis 在 1988 年提出,随后由 Sprite 操作系统在 1992 年实现。顾名思义,日志结构文件系统将文件系统视为一个循环日志,将新的数据和文件系统元数据写到日志的头部,并且从尾部回收空闲空间(如图 1 所示)。这意味着数据可能在日志中出现两次或更多次,但是由于日志是按时间先后顺序发展的,最近的数据被视作活动数据。日志中保留数据的多个副本可以带来一些有趣的优点,后面将详细谈到这些优点。
图 1. 日志结构文件系统的示意图
与其说日志结构方法是一个卖点,不如说它是体系结构上的一个细节,不过这种方法确实有一些独特的优点。一个关键的优点在于系统崩溃后的数据恢复,当使用日志结构方法时,这种恢复更简单。
另一个优点是利用底层存储系统挖掘性能。您也许还记得,连续写到硬盘比随机 I/O 要快得多。如果所有的写都是连续的,那么查找的开销随之减少,从而可以获得更快的硬盘 I/O,进而得到更快的文件系统。
基于对象的存储系统
传统存储系统依赖于磁盘驱动器和它们的本地接口持久地存储数据。这些接口依赖于块存储语义,大小固定的数据小块与它们的映射(文件系统元数据)相关联。对象存储系统则采用截然不同的方法:它们不是管理大小固定的数据块,而是管理大小可变的对象以及相关联的元数据(提供关于对象的系统级信息)。
|
对象存储系统是解决包含多租户和安全性的可伸缩存储的唯一途径。构建作为一种标准的 OSD(见侧边栏)的方式有很多种。例如可以使用遵从 OSD 的组件(例如 OSD 驱动器和启动器)或更高级的组件(在传统驱动器上构建 OSD 行为的目标系统)。但是,基于块的存储系统与基于对象的存储系统之间的根本区别在于,在基于块的存储系统中,是从块集合创建对象的,块中既包括数据,又包括使用某种协议与块通信的元数据。而在基于对象的存储系统中,是与对象和它们的关联元数据通信的(如图 2 所示)。于是,对象存储设备成为对象的平面名称空间(flat namespace),必要时,在存储系统栈中的更高层建立层次结构。
图 2. 基于块的存储系统与基于对象的存储系统
本文探索基于对象的存储系统上的一种文件系统的实现。
日志结构文件系统的一种新的实现:NiLFS(2)
NiLFS(2) 是日本 Nippon Telegraph and Telephone(NTT)开发的一种日志结构文件系统的第二次迭代。该文件系统的开发非常活跃,最近已进入主流 Linux 内核(另外还有 NetBSD 内核)。第一版的 NILFS(version 1)出现于 2005 年,这个版本没有任何形式的垃圾收集。在 2007 年,第 2 版首次发布,其中包括一个垃圾收集器,并且可以创建和维护多个快照。今年(2009),NiLFS(2) 文件系统进入主流内核,可通过安装它的可装载模块方便地启用它。
NiLFS(2) 一个有趣的方面是,它支持连续快照(continuous snap-shotting)技术。由于 NILFS 是基于日志结构的,新数据被写到日志的头部,而旧数据仍然保留(直到需要对旧数据进行垃圾收集)。由于旧数据仍被保留,因此可以在时间线上回滚,以检查文件系统的不同时期(epoch)。在 NiLFS(2) 中,这些时期被称作检查点,它们是文件系统中不可或缺的一部分。每当发生改变时,NiLFS(2) 都会创建这些检查点,但是也可以强制创建检查点。
|
可以在快照中查看和更改检查点(恢复点)。可以像其他文件系统一样将快照挂载到 Linux 文件系统空间中,但是目前它们还是只读的。这一点非常有用,因为可以挂载快照,然后恢复之前删除的文件,或者检查之前版本的文件。
除了连续快照外,NiLFS(2) 还具有很多其他的优点。从可用性的角度看,最重要的优点是快速重启。如果当前检查点失效,文件系统只需回滚到上一个有效的检查点,重新获得有效的文件系统。这显然好于 fsck 进程。
NiLFS(2) 的挑战
|
虽然连续快照是一个很好的特性,但是也有一定的副作用。前面已经提到,它的优点在于它是日志结构的,采用连续写的方式(减少物理磁盘的查找行为),因此非常快。而缺点在于,它是日志结构的,所以需要垃圾收集,以便清理旧的数据和元数据。一般情况下,这种文件系统非常快,但是一旦需要进行垃圾收集,性能就会慢下来。
探索 NiLFS(2)
我们来看看 NiLFS(2) 的实际应用。这个演示展示如何在循环设备上创建一个 NiLFS(2) 文件系统(测试文件系统的一种简单方法),然后看看 NiLFS(2) 的一些特性。首先安装 NiLFS(2) 内核模块:
$ sudo modprobe nilfs2 |
接下来,创建一个文件,该文件将包含文件系统(主机操作系统上的一个区域,可通过循环设备将它挂载为操作系统本身的文件系统),然后使用 mkfs
在其中构建 NiLFS(2) 文件系统(如图 1 所示)。
清单 1. 准备 NiLFS(2) 文件系统
|
现在,您有了自己的以 NiLFS(2) 文件系统格式初始化的磁盘镜像。接下来,使用循环设备将该文件系统挂载到一个挂载点上(如清单 2 所示)。注意,当挂载文件系统时,会启动一个用户空间程序 nilfs_cleanerd
,以提供垃圾收集服务。
|
现在,在该文件系统中添加一些文件,然后使用 lscp
命令列出当前可用的检查点(如清单 3 所示)。使用 mkcp
命令定义一个快照,然后再次查看检查点。第二次执行 lscp
命令时可以看到新创建的快照(所有检查点和快照都有一个 CNO,或检查点号)。
清单 3. 列出检查点和创建快照
|
现在有了一个快照,接下来同样使用 touch
命令再将一些文件添加到当前文件系统中(如清单 4 所示)。
|
现在,挂载快照作为一个只读文件系统。这和之前的挂载类似,但是需要指定挂载的快照。为此可以使用 cp
选项。从之前的 lscp
命令中可以看出,快照是 CNO=2
。在 mount
命令中使用这个 CNO 挂载只读文件系统。挂载后,首先使用 ls
命令列出挂载的读/写文件系统,然后查看所有的文件。在只读快照中,只能看到两个文件,这两个文件是创建快照时存在的两个文件(如清单 5 所示)。
清单 5. 挂载只读 NiLFS(2) 快照
|
注意,一旦将检查点转换为快照,这些快照将持久存在。当需要清理出空间时,检查点会被从文件系统中回收,而快照可以持久存在。
该演示展示了用于 NiLFS(2) 的两个命令行实用程序:lscp
(列出检查点和快照)和 mkcp
(创建检查点或快照)。有一个名为 chcp
的实用程序,用于将检查点转换为快照,或者将快照转换为检查点;还有一个 rmcp
实用程序,用于使检查点或快照无效。
鉴于这种文件系统是临时性的,NTT 已经为将来考虑了一些非常有创新性的工具 — 例如,tls
(临时 ls
)、tdiff
(临时 diff
)和 tgrep
(临时 grep
)。下一步引入基于时间的功能似乎是合乎情理的。
Extended Object File System(exofs)
Extended Object File System(exofs)是构建在对象存储系统上的一种传统的 Linux 文件系统。exofs 最初由 IBM 的 Avnishay Traeger 开发,当时被称作 OSD 文件系统,或称作 osdfs。然后,Panasas(一家构建对象存储系统的公司)接管该项目,并将它重新命名为 exofs(因为它的祖先来自 ext2 文件系统)。
对象存储系统上的文件系统
从概念上讲,对象存储系统可以视作对象的平面名称空间和它们的关联元数据。而在基于块的传统存储系统,元数据要占用一些块,以提供语义黏合剂。图 3 显示 exofs 的架构图。Virtual File System Switch(VFS)为 exofs 提供一条途径,在其中,exofs 通过一个本地 OSD 启动器与对象存储系统通信。OSD 启动器实现 OSD T-10 标准 SCSI 命令集。
图 3. exofs/OSD 生态系统架构图
exofs 背后的思想是在 OSD 后备存储上提供一个传统文件系统。这样一来,就更容易迁移到对象级存储,因为提供的文件系统本身是传统的文件系统。
文件系统映射
OSD 中的每个对象由平面名称空间中一个 64 位的标识符表示。为了将标准 POSIX 接口叠加到对象存储系统上,需要一个映射。exofs 提供一个简单的映射,这种映射还是可伸缩、可扩展的。
文件系统中的文件由 inode 唯一地表示。exofs 将 inode 映射到对象系统中的对象标识符(OID)。在对象系统中,使用对象表示文件系统的所有元素。文件被直接映射到对象,目录也是文件,只不过是引用目录中所含文件的文件(采用文件名和 inode-OID 对的形式)。图 4 简明地阐释了这一点。另外还有一些其他的对象,用于支持 inode 位图(用于 inode 分配)等。
图 4. OSD 表示法示意图
用于表示对象空间中的对象的 OID 长度为 64 位,因此支持非常多的对象。
为什么选择对象存储?
对象存储是一个有趣的思想,可大幅提高系统的可伸缩性。它将文件系统的一些部分从主机转移到存储子系统中。为此需付出一定的代价,但是通过将文件系统的一些部分分布到多个端点,可以分散工作负载,使基于对象的方法更易于伸缩到更大的存储系统。主机操作系统不再需要考虑块到文件的映射,存储设备本身会提供这种映射,因此主机可以在文件级进行操作。
对象存储系统还提供查询可用元数据的能力。这可以带来更多的好处,因为搜索能力可以分布到端点对象系统。
最近,对象存储在云存储领域回归。云存储提供商(将存储作为服务出售)以对象的形式提供他们的存储,而不是以传统的块 API 的形式提供存储。这些提供商实现用于对象传输、管理和元数据管理的 API。
结束语
虽然 NiLFS(2) 和 exofs 将成为现有 Linux 文件系统的令人感兴趣的、有用的补充,但是还有更多的文件系统相继涌现。我们看到了最近引入的 Btrfs(来自 Oracle),它为 Sun Microsystems 的 Zettabyte File System(ZFS)提供 Linux 选择。另一个最近出现的文件系统是 Ceph,它提供一个可靠的基于 POSIX 的分布式文件系统,这种文件系统没有单点故障。今天,我们发现一种新的日志结构文件系统,并看到一个文件系统被引入到对象存储上。Linux 不断证明它是一流的研究平台,也是企业级的操作系统。
参考资料
学习
访问 NiLFS(2) 文件系统项目网站 获得最新的信息。在这个网站上,可以找到 FAQ、链接和该文件系统的示例演示,包括检查点和快照。
Exofs 最初由 IBM 开发,后来 Panasas 提供后续的开发。请访问 open-osd.org 上的 Exofs 项目网站 获得详细信息。
在 Btrfs wiki 和 “Linux 内核的发展”(developerWorks,2009 年 3 月)中了解更多关于 Btrfs 的信息。
阅读 “The Design and Implementation of a Log-Structured File System”(PDF),这是 Sprite LFS 的作者撰写的影响巨大的论文,从历史的角度阐述日志结构文件系统。这篇论文介绍了日志结构文件系统背后的思想和挑战。
访问 Wikipedia,查看对 日志结构文件系统 和 对象存储设备 的介绍。除了对现状的阐述外,这些参考还从历史的角度阐述这些技术。
访问 NILFS 站点,获得关于如何将 NiLFS(2) 和用户空间工具安装到 pre-2.6.30 内核中的说明。可以找到用于各种不同 Linux 发行版的说明。
Linux 内核树中的 Documentation/filesystems 子目录中有 NiLFS(2) 和 exofs 的相关注释。它提供了用于特定内核版本的丰富的信息。
Samsung Electronics 的演示 “About SSD”(PDF)对各种不同文件系统,包括 NILFS 使用 SSD 驱动器的 SSD 的性能进行了有趣的评论。Phoronix 还提供了一份 文件系统性能的最新分析,它比较了 EXT4、Btrfs、EXT3、XFS 和 NiLFS(2)。
来自 Seagate 的白皮书 “The Advantages of Object-Based Storage—Secure, Scalable, Dynamic Storage Devices” 出色地介绍了对象存储设备。通过 Storage Networking Industry Association (SNIA) 提供的 “Object Storage and Applications”(PDF)和 “OSD Architecture and Systems”(PDF)这两个演示,还可以了解更多关于对象存储的信息。
Seagate 开发了一个原型 Fibre Channel 驱动器,它实现了 OSD 命令集。这种驱动器由 IBM 和 Emulex 在对象存储系统的上下文中进行了 演示。IBM 提供元数据服务器,Seagate 提供支持 OSD 的驱动器,而 Emulex 则提供具有 OSD 支持的 FC 主机总线适配器。
在 developerWorks Linux 专区 寻找为 Linux 开发人员(包括 Linux 新手入门)准备的更多参考资料,查阅我们 最受欢迎的文章和教程。
在 developerWorks 上查阅所有 Linux 技巧 和 Linux 教程。
随时关注 developerWorks 技术活动和网络广播。
获得产品和技术
用可直接从 developerWorks 下载的 IBM 产品评估试用版软件 构建您的下一个 Linux 开发项目。
关于作者
M. Tim Jones 是一名嵌入式固件架构师,他是 Artificial Intelligence: A Systems Approach, GNU/Linux Application Programming(现在已经是第 2 版)、AI Application Programming(第 2 版)和 BSD Sockets Programming from a Multilanguage Perspective 等书的作者。他的工程背景非常广泛,从同步宇宙飞船的内核开发到嵌入式系统架构设计,再到网络协议的开发。Tim 是位于科罗拉多州 Longmont 的 Emulex Corp. 的一名顾问工程师。