首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用通用 NFS 装载工具进行统一装载(1)

使用通用 NFS 装载工具进行统一装载(1)

网络文件系统(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 伪树(Fileset1Fileset2)。NFSv4 伪树特性允许 NFSv4 客户机在伪树中对所有导出的项仅执行一个 mount 操作。
  • 两个 NFSv3 mount:装载 Tools 和 Docs。
  • 一个 NFSv3 mount:装载 Binaries。
使用 NFS 装载工具可以将这些装载合并为一个装载。使用命令:
1
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 装载工具的算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 合并所有内部目录
1
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 所示:
UnionFSUnionFS 是针对 Linux® 和 FreeBSD 的文件系统服务,它允许透明地覆盖独立的文件系统(即分支)的文件和目录以构成一个连贯的文件系统,从而实现统一装载文件系统。对于具有相同路径的目录的内容,将出现在生成的文件系统的一个合并目录中。针对 Linux 的 UnionFS 有两个版本:
  • Version 1.x 是独立的,可以作为模块构建。
  • Version 2.x 是最新的;它经过重新设计和实现,并且是 Andrew Morton 的 Linux -mm 树的一部分(因此它应该出现在主资源树中)。

清单 3. 使用 unionfs 进行合并
1
mount -t unionfs -o dirs=/tmp/NFSv4:/tmp/NFSv3:/tmp/NFSv2 none /mnt




这会生成以下目录结构:
图 3. unionfs 生成的目录结构接下来,我们看看如何使用这个系统。
返回列表