第三部分:AFS—安全分布式文件系统

作者:Alf Wachsmann

Andrew 文件系统 (AFS) 是一个安全、分布式的全局文件系统,为数据提供位置独立性、可扩展性和透明迁移能力。AFS 跨多种操作系统工作,并在许多大型站点中使用多年。

尽管 AFS 已有近 20 年的历史,但它提供了其他分布式文件系统所不具备的独特功能。这个年代可能会让一些人觉得它不那么吸引人,但随着 IBM 在 2000 年将 AFS 开源,人们对其使用和开发重新燃起了兴趣。本文讨论了 AFS 提供的丰富功能,并邀请读者试用它。

AFS 的特性和优势

AFS 客户端软件适用于 Linux 以及 HP、Compaq、IBM、Sun 和 SGI 的 UNIX 版本。它也适用于 Microsoft Windows 和 Apple 的 Mac OS X。这使得 AFS 成为在本地和广域网的平台之间共享数据的理想文件系统。

所有 AFS 客户端机器都有本地缓存。缓存管理器跟踪机器上的用户并处理来自他们的数据请求。数据缓存以文件块的形式进行,这些文件块从 AFS 文件服务器复制到本地磁盘。缓存由机器的所有用户共享,并在重启后仍然存在。这种本地缓存减少了网络流量,并使后续对缓存数据的访问速度更快。

AFS 以全局唯一的命名空间组织。图 1 显示了 AFS 文件空间的全局视图。指向文件的路径名不仅在访问数据的任何地方都相同,而且路径名不包含任何服务器信息。换句话说,AFS 用户不知道数据位于哪个文件服务器上。为了实现这一点,AFS 有一个复制的数据位置数据库,客户端必须联系该数据库才能找到数据。这与网络文件系统 (NFS) 不同,在 NFS 中,客户端拥有关于托管 NFS 文件系统特定部分的文件服务器的信息。

Part III: AFS—A Secure Distributed Filesystem

图 1. AFS 文件空间在任何地方都相同,并且不需要客户端知道哪个目录在哪个服务器上。

不同的独立 AFS 域称为单元 (cells),对应于 Kerberos 领域 (realms)。典型的 AFS 路径名如下所示:/afs/cern.ch/user/a/alf/Projects/。此路径名包含 AFS 单元名称,但不包含文件服务器名称。

这种位置独立性允许 AFS 管理员将数据从一个 AFS 服务器移动到另一个服务器,而用户看不到任何变化。这也使得 AFS 易于扩展。如果您的 AFS 文件服务器上的空间或网络容量不足,只需添加另一个服务器并将数据迁移到新服务器即可。客户端不会注意到这种位置变化。AFS 在每个文件服务器的客户端数量方面也具有良好的可扩展性。在现代硬件上,一台 AFS 文件服务器可以为多达约 1,000 个客户端提供服务,而不会出现任何问题。

对于用户而言,AFS 文件空间看起来与他们使用过的任何其他文件系统一样。凭借正确的 Kerberos 凭据,他们可以从世界各地访问他们的 AFS 数据,从而促进全局唯一的命名空间。这是一个例子:为了能够将数据从我在瑞士 CERN 的主目录复制到我在加利福尼亚州 SLAC 的主目录,我首先需要针对两个不同的 AFS 单元进行身份验证

% kinit --afslog alfw@ir.stanford.edu
alfw@ir.stanford.edu's Password:
% kinit -c /tmp/krb5cc_5828_1 --afslog alf@cern.ch
alf@cern.ch's Password:

AFS 带有一个命令,tokens,用于显示 AFS 凭据

% tokens Tokens held by the Cache Manager:

User's (AFS ID 388) tokens for afs@cern.ch [Expires Apr  2 10:30]
User's (AFS ID 10214) tokens for afs@ir.stanford.edu [Expires Apr  2 09:49]
--End of list--

现在我已经通过身份验证,我可以访问我的两个 AFS 主目录

% cp /afs/cern.ch/user/a/alf/Projects/X/src/hello.c \
   /afs/ir.stanford.edu/users/a/l/alfw/Projects/Y/src/.

在 AFS 文件服务器上,AFS 数据存储在特殊的分区上,称为 /vicepXX,其中 XX 的范围从 a–zz,允许每个服务器总共 256 个分区。这些分区中的每一个都可以容纳称为卷 (volumes) 的数据容器。卷是可以移动、复制或备份的最小实体。然后,卷包含目录和文件。卷需要在 AFS 文件空间内挂载才能使其可见。这些挂载点看起来与目录完全一样。

AFS 特别适合服务于只读数据,例如 /usr/local/ 树,因为 AFS 客户端会缓存访问的数据。为了使这项工作更好、更可靠,AFS 允许在不同的 AFS 文件服务器上创建数据的只读克隆。如果托管此类克隆的服务器之一宕机,客户端将透明地故障转移到托管同一数据另一个只读副本的另一台服务器。这种复制技术也可用于跨地理位置遥远的服务器克隆数据。可以将客户端配置为首选使用附近的副本,并将较远的副本用作后备。例如,openafs.org AFS 单元托管在位于宾夕法尼亚州匹兹堡的卡内基梅隆大学的服务器上,以及位于瑞典斯德哥尔摩皇家理工学院 (KTH) 的服务器上。

AFS 提供快照机制来提供备份。这些快照在可配置的时间生成,例如凌晨 2 点,并按卷工作。然后可以将快照备份到磁带,而不会干扰用户活动。它们也可以通过用户各自 AFS 主目录中的简单挂载点提供给用户。这个简单的技巧消除了许多用户备份/恢复请求,因为昨晚快照中的文件仍然在用户主目录中的这个特殊子目录(备份卷的挂载点)中可见。

AFS 通信协议专为广域网络设计。它使用自己的远程过程调用 (RPC) 实现,称为 Rx,它通过 UDP 工作。该协议仅重新传输一批数据包中的单个错误数据包,并且与其他协议允许的相比,它允许更高数量的未确认数据包。

AFS 管理可以从任何 AFS 客户端完成;无需登录 AFS 服务器。这允许管理员严格锁定 AFS 服务器,这是一个很大的安全优势。AFS 数据的位置独立性也提高了可管理性。可以通过将所有卷移动到其他 AFS 文件服务器来完全清空 AFS 文件服务器。这些移动对用户不可见。然后,空文件服务器可以进行维护,例如操作系统升级或硬件维修。之后,所有卷都可以透明地移回服务器。

在内部,AFS 使用 Kerberos 对用户进行身份验证。开箱即用的是 Kerberos 4,但所有主要的 Kerberos 5 实现都能够作为更安全的替代品。AFS 提供访问控制列表 (ACL) 来限制对目录的访问。只有 Kerberos 主体或这些主体的组才能放入 ACL 中。这与 NFS 不同,在 NFS 中,仅使用 UNIX 用户 ID 进行授权。附加的授权服务,即保护服务 (PTS),用于跟踪各个 Kerberos 主体和主体组。

AFS 组件

为了使所有这些功能工作,AFS 分为几个不同的部分:AFS 客户端软件,必须在每个想要访问 AFS 文件空间的计算机上运行。AFS 服务器软件分为四个基本部分。它使用 Kerberos 进行身份验证,PTS 进行授权,卷位置服务器用于位置独立性,以及两个服务器用于数据服务(文件服务器和卷服务器)。所有这些不同的进程都由每个 AFS 服务器上的基本监管服务器 (BOS) 服务器管理。除了这些必要的组件外,还有更多服务守护程序可用于 AFS 服务器维护和备份。如何安装 AFS 服务器超出了本文的范围。

由于所有这些不同的服务器组件,AFS 的学习曲线在开始时很陡峭。但是,回报是值得的,许多站点再也离不开它了。一旦安装了单元,即使对于大型安装,AFS 的日常维护成本也仅在 25% 全职当量 (FTE) 范围内。

有关 AFS 在包括摩根士丹利和英特尔在内的各个站点如何使用的更多信息,请参阅最近的 AFS 最佳实践研讨会上给出的演示文稿(请参阅在线资源)。

AFS 客户端安装

您无需拥有自己的 AFS 服务器即可亲自试用 AFS。只需安装 OpenAFS 客户端软件并使用特殊选项启动 AFS 客户端守护程序 afsd,用户即可访问外国 AFS 单元的公共可访问 AFS 空间。

安装 AFS 客户端最困难的部分是获取必要的内核模块。如果您使用的是 Red Hat 或 Fedora,您可以下载 RPM(请参阅资源)。除了内核模块外,AFS 客户端还需要用户空间守护程序 (afsd) 和 AFS 命令套件。这些包含在另外两个 RPM 中。

一旦您拥有这些模块,下一步是根据您的需要配置 AFS 客户端。首先,您需要定义您的计算机应成为成员的单元。AFS 单元名称在文件 /usr/vice/etc/ThisCell 中定义。如果您没有自己的 AFS 服务器,则可以将此名称设置为任何名称。否则,它应该设置为您的 AFS 服务器正在服务的单元的名称。要查看的下一个参数是本地 AFS 缓存。每个 AFS 客户端都应该有一个单独的磁盘分区来包含客户端软件,但缓存可以放在您想要的任何位置。缓存的位置和大小在文件 /usr/vice/etc/cacheinfo 中定义。AFS 缓存的默认位置是 /usr/vice/cache,对于单个用户桌面或笔记本电脑而言,100MB 的大小已足够。这是 openafs-client RPM 附带的设置。此设置的 cacheinfo 文件应如下所示

/afs:/usr/vice/cache:100000

接下来,配置 afsd 的参数,即 AFS 客户端守护程序。它们在 /etc/sysconfig/afs 中定义。将 -dynroot 参数添加到 OPTIONS 定义中。这允许您在没有自己的 AFS 服务器的情况下启动 AFS 客户端。

要添加的另一个选项是 -fakestat。此参数告诉 afsd 伪造 /afs/ 目录中所有条目的 stat(3) 信息。如果没有此参数,AFS 客户端将外出并联系它已知的每个 AFS 单元。如果您在 /afs/ 目录中执行长列表 (/bin/ls -l),则目前可以看到 133 个单元。

由于 AFS 使用 Kerberos 进行身份验证,因此需要在您的机器上同步时间。AFS 过去有自己的同步机制,但它已过时,不应再使用。要关闭它,需要在 /etc/sysconfig/afs 的 OPTIONS 定义中添加选项 -nosettime。如果您没有时间同步方法,请使用网络时间协议(请参阅资源)。

完成所有更改后,/etc/sysconfig/afs 中的新 OPTIONS 定义应如下所示

OPTIONS="$MEDIUM -dynroot -fakestat -nosettime"

最后一步是为 AFS 文件系统创建挂载点,这可以通过输入以下命令来完成% sudo mkdir /afs。现在,您可以使用以下命令启动 AFS 客户端% sudo /etc/init.d/afs start。这部分需要几秒钟,因为 afsd 需要在启动之前填充本地缓存目录。由于缓存在重启后仍然存在,因此后续启动速度会更快。

探索 AFS

在没有您自己的 AFS 服务器但配置了如上所述的 AFS 客户端的情况下,您可以熟悉一些 AFS 命令并自行探索全局 AFS 空间。快速测试表明您未在任何 AFS 单元中通过身份验证

% tokens
Tokens held by the Cache Manager:

--End of list--

未列出任何凭据。有关凭据存在的示例,请参见上文。

您应该做的第一件事是检索 /afs/ 目录的长列表。它显示了您的 AFS 客户端已知的所有 AFS 单元。现在,更改到目录 /afs/openafs.org/software/openafs 并执行目录列表。您应该看到这个

% ls -l
total 10
drwxrwxrwx  3 root  root  2048 Jan 7  2003  delta
drwxr-xr-x  8 100   wheel 2048 Jun 23 2001  v1.0
drwxr-xr-x  4 100   wheel 2048 Jul 19 2001  v1.1
drwxrwxr-x 17 100   101	  2048 Oct 24 12:36 v1.2
drwxrwxr-x  4 100   101	  2048 Nov 26 21:49 v1.3

深入研究其中一个目录。例如

% cd v1.2/1.2.10/binary/fedora-1.0

使用以下命令查看此目录中的 ACL

% fs listacl .
Access list for . is
Normal rights:
  openafs:gatekeepers rlidwka
  system:administrators rlidwka
  system:anyuser rl

这表明两个组拥有所有七个可能的权限:读取 (r)、查找 (l)、插入 (i)、写入 (w)、完全文件咨询锁定 (k) 和 ACL 更改权 (a)。AFS 附带的特殊组 system:anyuser 具有读取 (r) 和查找 (l) 权限,这实际上允许任何人访问。

要列出组成员,请使用 pts(保护服务器)命令

% pts member openafs:gatekeepers -cell openafs.org -noauth
Members of openafs:gatekeepers (id: -207) are:
  shadow
  rees
  zacheiss.admin
  jaltman

使用 -noauth 选项是因为此命令在没有任何此单元凭据的情况下运行。

探索 AFS 的身份验证部分(标准 Kerberos)需要特殊的管理权限,因此我在此处跳过它。

现在,找出当前目录的物理位置

% fs whereis .

File . is on hosts andrew.e.kth.se VIRTUE.OPENAFS.ORG

这表明此目录有两个副本可用,一个来自 andrew.e.kth.se,另一个来自 VIRTUE.OPENAFS.ORG。

命令

% fs lsmount /afs/openafs.org/software/openafs
↪/v1.2/1.2.10/binary/fedora-1.0
/afs/openafs.org/software/openafs/v1.2/1.2.10/binary/fedora-1.0
↪ is a mount point for volume #openafs.1210.f10

表明此目录实际上是名为 openafs.1210.f10 的 AFS 卷的挂载点。

另一个 AFS 命令允许我们检查卷

% vos examine openafs.1210.f10 -cell openafs.org -noauth

此命令检查 AFS 单元 openafs.org 中卷 openafs.1210.f10 的读写版本。输出应如下所示

openafs.1210.f10      536871770 RW   25680 K On-line
    VIRTUE.OPENAFS.ORG /vicepb
    RWrite  536871770 ROnly  536871771 Backup      0
    MaxQuota          0 K
    Creation    Fri Nov 21 17:56:28 2003
    Last Update Fri Nov 21 18:05:30 2003
    0 accesses in the past day (i.e., vnode references)

    RWrite: 536871770     ROnly: 536871771
    number of sites -> 3
       server VIRTUE.OPENAFS.ORG partition /vicepb RW Site
       server VIRTUE.OPENAFS.ORG partition /vicepb RO Site
       server andrew.e.kth.se partition /vicepb RO Site

输出显示此卷托管在服务器 VIRTUE.OPENAFS.ORG 的磁盘分区 /vicepb 中。下一行显示读写卷和只读卷的数字卷 ID。它还显示了一些统计信息。最后三行显示此卷的一个读写 (RW Site) 和两个只读 (RO Site) 副本的位置。

要找出服务器 VIRTUE.OPENAFS.ORG 上有多少其他 AFS 磁盘分区,请使用命令

% vos listpart VIRTUE.OPENAFS.ORG -noauth

我们了解到服务器上的分区是

/vicepa     /vicepb     /vicepc
Total: 3

这显示总共有三个 /vicep 分区。要查看分区 /vicepa 中有哪些卷,请执行

% vos listvol VIRTUE.OPENAFS.ORG /vicepa -noauth

此命令需要一段时间,最终返回包含 275 个卷的列表。输出的前几行如下所示

Total number of volumes on server VIRTUE.OPENAFS.ORG partition /vicepa: 275
openafs.10.src                    536870975 RW      11407 K On-line
openafs.10.src.backup             536870977 BK      11407 K On-line
openafs.10.src.readonly           536870976 RO      11407 K On-line
openafs.101.src                   536870972 RW      11442 K On-line
openafs.101.src.backup            536870974 BK      11442 K On-line
openafs.101.src.readonly          536870973 RO      11442 K On-line

另一个命令 bos 与单元的基本监管服务器通信,并找出该单元的 AFS 服务器进程的状态。fs、pts、vos 和 bos 命令还有许多其他子命令可用。所有这些 AFS 命令都理解 help 选项(help 前面没有破折号)以显示所有可用的子命令。使用fs <子命令> -help(带破折号)以查看特定子命令的语法。

AFS 的未来

目前正在进行多个 AFS 增强项目。目前最重要的项目是使 AFS 与 2.6 Linux 内核一起工作。这些内核不再导出其 syscall 表。另一个项目是提供断开连接模式,该模式允许 AFS 客户端脱离网络并继续使用 AFS。一旦它们重新连接,AFS 空间中的文件内容将被重新同步。

结论

尽管 AFS 的所有不同方面起初可能令人感到不知所措,并且设置您自己的 AFS 单元的学习曲线很陡峭,但在您的基础设施中使用 AFS 的回报可能是巨大的。安全、与平台无关的全球文件共享是一个有吸引力的概念,就像服务于您的 /usr/local/ 区域和所有 UNIX 主目录一样。而且,这一切都只需极低的长期管理成本。

本文资源: /article/8079

Alf Wachsmann 博士自 1999 年以来一直在斯坦福线性加速器中心 (SLAC) 工作。他负责 Linux 自动安装的所有领域,包括服务器集群节点、服务器和桌面。他的工作重点是 AFS 支持、迁移到 Kerberos 5、用户注册项目和用户顾问。

加载 Disqus 评论