级别: 初级 Abhidnya P. Chirmule, 系统软件工程师, IBM Chinmay Soman, 助理软件工程师, IBM
2009 年 3 月 16 日 为了在同时出现多个 NFS 版本导出时有效地实现统一装载,您必须具备一个 NFS 装载工具。了解通用 NFS 装载工具如何帮助减少多个 NFS 版本的处理,并简化这些版本的管理。本文描述通用 NFS 装载的概念,并且概括地介绍这个系统的优势及其应用。此外,本文还给出一些总体设计细节。
网络文件系统(Network File System,NFS)是一个常用的分布式文件系统,它使远程客户机能够在服务器上执行文件操作。通过使用 export 操作,服务器就使外部机器能够访问它的目录和文件系统。为了访问这些目录,客户机将导出的目录或文件系统 mount(装载)到它的本地目录结构中。在已装载的目录内部,客户机能够像访问本地文件一样访问远程文件。到目前为止,NFS 在导出和装载目录或文件系统方面支持 3 个版本:版本 2、3 和 4。
在本文中,我们演示如何使用通用 NFS 装载工具将所有现有的 NFS 版本的导出和装载合并到一个无缝的机制中。让我们考虑这样一个场景:服务器为 3 个版本的 NFS 导出目录项。目前,如果客户机要访问所有这些项,它必须在不同的装载点分开装载每个项。尽管 NFS 版本 4 提供的伪树(pseudo-tree)机制能够一次装载所有 NFSv4 导出项,但它仅适用于由该版本生成的项。虽然版本 4 能够进行一次性装载(存在伪树时),但是客户机必须分开装载版本 2 和 3 的项。
通用 NFS 装载工具实际上是 mount 命令的包装器,它使用户能够通过一个命令从特定服务器装载所有导出项。因为改动 NFS 服务器不太好,所以这个包装器在客户机(对用户是透明的)内部分别执行不同的 mount。
看看 NFS 服务器上的目录结构,如图 1 所示:
图 1. 服务器上的目录结构
在这个场景中,需要在客户机中执行以下 mount:
- 一个 NFSv4 mount:装载 NFSv4 伪树(Fileset1 和 Fileset2)。NFSv4 伪树特性允许 NFSv4 客户机在伪树中对所有导出的项仅执行一个
mount 操作。
- 两个 NFSv3 mount:装载 Tools 和 Docs。
- 一个 NFSv3 mount:装载 Binaries。
使用 NFS 装载工具可以将这些装载合并为一个装载。使用命令:
gennfsmount <NFS server> <mountpoint>
|
使用通用 NFS 装载工具有以下优点:
- 用户仅需进行一次装载就能访问服务器上的所有信息;以前不支持这个功能。
- 假如有这样一个服务器,它不仅导出版本 2 和 3 的旧文件集,还导出版本 4 的新文件集。客户机能够通过一个操作访问所有这些文件集并执行安装。
- 使用这个通用工具改善了在特定服务器或特定导出目录/文件系统中的搜索。
- 因为这个工具能够自动隔离基于版本的 NFS 导出,所以用户不再需要管理这些不同的装载点。
- NFS 管理员能够在服务器上保留旧的 NFS 版本导出,因为仅需使用
mount 命令就可以像访问新版本数据项一样访问它们。
使用 automount 工具也能够获得类似的结果,但它需要管理员对 automount 进行许多配置才能获得所需的 NFS 装载。automount 的 hostmap 特性声称能够从服务器 mount 所有导出项,并且不需要管理员进行任何配置,但使用 hostmap 装载 NFSv4 项时会出现问题。另外,它对 /etc/hosts 文件中列出的所有服务器都进行操作。它不能在单个装载点上装载特定服务器导出的所有项。
总体而言,通用 NFS 装载机制是最方便的。接下来,我们看看在实现通用 NFS 装载工具的过程中的一些设计决策。
设计实现细节
我们先看一下通用 NFS 装载系统的基础架构。通用 NFS 装载工具从内部向服务器发送一个请求,要求访问所有导出项。
图 2. 通用 NFS 装载工具请求访问所有导出项
收到服务器的回复之后,将执行清单 1 中的算法:
清单 1. 通用 NFS 装载工具的算法
Start
Create temporary directories for all versions.
Initialize list of mount security flavors.
Embed this list in each internal mount operation.
For each item in the export-list
Do
Mount internally for every NFSv2 and NFSv3 export
Update internal log
End for
Mount internally only once for NFSv4 export.
Update internal log
Stop
|
security flavors 是一个由逗号分隔的安全方法列表(sys、krb5 和 krb5i 等)。在装载点的 read/write 操作期间将用到这些方法。这个列表用于匹配服务器支持的安全方法。此外,随后在该装载点下发生系统调用时也用到该列表。相应的导出项的 NFS 版本也可以使用类似的机制。
当所有内部装载完成时,将使用 UnionFS 合并所有内部目录,如清单 2 所示。
清单 2. 使用 UnionFS 合并所有内部目录
mount -t unionfs -o dirs=<temp_dir1>[:<temp_dir2>...] none <mount-point>
|
还记得 前一个场景 吗?在前面的场景中,客户机上有一个针对 v4 伪树的 NFSv4 装载,两个针对 Tools and Docs 的 NFSv3 装载,一个针对 Binaries 的 NFSv3 装载,并且我们使用通用 NFS 装载工具 —gennfsmount <NFS server> <mountpoint>— 将它们合并到一个装载中。在这个例子中,将创建以下临时目录:
- /tmp/NFSv4
- /tmp/NFSv3/Tools
- /tmp/NFSv3/Docs
- /tmp/NFSv2/Binaries
然后使用 unionfs 合并它们,如清单 3 所示:
 |
UnionFS UnionFS 是针对 Linux® 和 FreeBSD 的文件系统服务,它允许透明地覆盖独立的文件系统(即分支)的文件和目录以构成一个连贯的文件系统,从而实现统一装载文件系统。对于具有相同路径的目录的内容,将出现在生成的文件系统的一个合并目录中。针对 Linux 的 UnionFS 有两个版本:
- Version 1.x 是独立的,可以作为模块构建。
- Version 2.x 是最新的;它经过重新设计和实现,并且是 Andrew Morton 的 Linux
-mm 树的一部分(因此它应该出现在主资源树中)。
|
|
清单 3. 使用 unionfs 进行合并
mount -t unionfs -o dirs=/tmp/NFSv4:/tmp/NFSv3:/tmp/NFSv2 none /mnt
|
这会生成以下目录结构:
图 3. unionfs 生成的目录结构
接下来,我们看看如何使用这个系统。
使用这个系统
在这个场景中,NFS 服务器导出属于不同 NFS 版本的不同项。不过在客户机上仅执行一个装载:通用 NFS 装载。图 4 显示了服务器导出的项。
图 4. 在服务器上导出的项
在这里,服务器导出 5 个属于不同 NFS 版本的 NFS 项。nfs4_A 和 nfs4_B 构成一个 NFSv4 伪树(/nfs4_A 和 /nfs4_A/nfs4_B)。其余的是版本 2 和 3 的 NFS 导出项。
图 5 显示了服务器上的文件。
图 5. 服务器上的文件
在这个场景中,仅需使用一个装载操作,客户机就可以访问不同装载目录下的文件。不过,在这个系统中,用户使用一个装载操作就可以在一?目录结构中访问所有这些文件。
图 6 显示了使用通用 NFS 装载工具后的客户机输出:
图 6. 通用 NFS 装载工具的输出
如您所见,图 6 显示了由通用 NFS 装载工具执行的多个内部装载。/mnt 目录合并了所有 NFS 装载。
结束语
至此,我们已经演示了通用 NFS 装载工具的架构和机制。这个工具不仅为 NFS 服务器上的文件提供更容易的单点访问,而且为 NFS 空间提供更加紧凑的视图,因此它是 NFS 客户机的好帮手。
参考资料 学习
获得产品和技术
-
用可直接从 developerWorks 下载的 IBM 试用软件 构建您的下一个 Linux 开发项目。
讨论
作者简介  | 
|  | Abhidnya Chirmule 是位于印度 Pune 的 IBM 软件实验室 Network File System 团队的系统软件工程师,从事 AIX 平台上的 RPC 和 NFS 等开放网络计算技术。Abhidnya 拥有位于印度 Pune 的 College of Engineering 的计算机科学学士学位。 |
 | 
|  | Chinmay Soman 是位于印度 Pune 的 IBM Systems and Technology Labs 的软件工程师。他目前参与研究 CTDB/Panache。他和 NFS 团队合作研究 AIX 系统上的 NFS 开发和管理。他拥有计算机科学学士学位。 |
对本文的评价
|