当前位置: 首页 > 工具软件 > OpenAFS > 使用案例 >

OpenAFS 用户快速上手教程

咸高谊
2023-12-01

如果你是一个 AFS (OpenAFS) 的新手用户,需要对 AFS 的操作有进一步的了解,这篇文章就是为你准备的。我们先介绍一点 AFS 的基本概念,然后就讨论用户最常使用的几个操作。

AFS 的目录结构

AFS 的第一级目录总是 /afs,第二级目录一般是类似 hq.company.com 这样的域名形式,但也可以是由系统管理员决定的其他字符串。

每个第二级目录都是独立管理和运行的一个 AFS 系统,叫做一个 AFS Cell. 比如

/afs/athena.mit.edu

/afs/ir.stanford.edu

就是两个完全不同的 AFS Cell, 前者由麻省理工学院运行和维护,后者由斯坦福大学运行和维护。如果你需要了解自己处在哪个 AFS Cell 的管理下,只要看当前路径的第二层即可。

一个用户在不同 Cell 里可以有不同的账户。这些账户分别由每个 Cell 单独管理。也就是说,如果你需要进入某个 /afs 下的子目录,你需要拥有一个合法访问这个子目录的账户。

作为普通AFS 用户,一个向你开放的 Cell 除了给你一个合法账户,还会为你创建一个属于你自己的个人目录。这种目录往往被管理员安排在类似如下形式的路径下:

/afs/hq.company.com/users/x/i/ximeng

你可以在任何一台配置了 AFS 客户端的主机上登录和访问自己的个人目录,以及所有你有访问权的目录。

对,这就像一个组织内的 dropbox,或者共享文件夹。你也可以把它看作是组织内的云存储。

一台可以访问 /afs 目录的主机被称为一个 AFS 客户端。一个 AFS 客户端可以被配置成访问多个 AFS Cell.

OpenAFS 客户端支持所有主流的 Linux, Unix 和 BSD 发行版,也支持 Windows 和 MacOS.

如果你的组织有几十台甚至几百台主机都安装了 AFS 客户端,那么你登录其中的任何一台就可以读写自己在 /afs 下的文件和目录。

登录AFS

除了向公众完全开放的子目录以外,一个 AFS Cell 必须登录才能访问。

如果你发现自己忽然无法访问理应可以访问的某个 /afs 子目录,首先需要查看的就是自己是否已经登录 AFS ,登录是否还有效。

登录 AFS 的过程可以和网上购买火车票的过程作类比。

网上购票可以大致分为两步,第一步进行实名认证购买电子车票,第二步到特定的取票点取得服务凭据,即车票。

登录 AFS 也分为两步,第一步以用户名和密码进行身份认证,第二步获取 AFS token.

  • AFS 把授予用户的服务凭据叫 token. token 类似火车票,是访问 AFS 文件系统的有效凭证。AFS token 上面有用户的账户名和有效期。获取 token 的意思就是登录 AFS Cell.

以 AFS 用户名 xguan 为例,登录 AFS 的第一步的命令是 kinit

$ kinit xguan

这一步要求输入密码以证明验证身份。

如果身份验证通过,则可以执行第二步获取 AFS token. 第二步的命令是

$ aklog

这一步不需要密码。执行完毕就可以获得一个带有有效期的 AFS token。此后就可以像访问一般文件系统一样访问 /afs 目录下的内容。

查询 AFS 登录状态的命令是

$ tokens

执行该命令可以看到已经获取的 AFS token 的用户名和有效期。如果返回的内容是空,则说明没有有效的登录,需要重新登录才能访问 AFS.

超过 AFS token 有效期,登录即失效,tokens 命令的返回内容会重新变为空值。

登出 AFS 系统的命令是

$ unlog

执行此命令会销毁 AFS token

一般情况下销毁 AFS token 不会消除已经用 kinit 完成的身份认证。为了同时销毁身份认证记录以防止其他用户通过 aklog 命令不用密码就获得新的 AFS token,应该再继续执行命令

$ kdestroy

在登入登出命令上, kinit 对应 kdestroy, aklog 对应 unlog。

如果需要修改 AFS 密码,可以使用命令

$ kpasswd

然后根据提示先输入当前密码,再输入新密码两次即可。

从 Linux 系统登录 AFS

很多 Linux 服务器被配置成允许 AFS 用户直接登录。此时你的 AFS 用户名和密码就是你登录 Linux 的用户名和密码.

比如你可以使用 ssh 命令以 AFS 用户名和密码远程登录这样的 Linux 主机。Linux 主机会自动获取 AFS token,你不再需要单独执行 kinit 和 aklog 命令。登录成功后就可以直接访问 /afs 下的内容,也可以使用 tokens 命令随时查看登录状态。

Windows 登录 AFS

如果你的组织的Active Directory 域正好也配置成 AFS 的身份验证系统时,你的域账号就是你的 AFS 账号。

如果你使用的 Windows 系统已经加入Active Directory 域,同时也配置了 AFS 客户端,那么当你用域账号登录 Windows 时就完成了身份验证的第一步,不再需要执行 kinit 命令。

此时只需要打开一个命令行界面执行略作改动后的第二步命令:

> aklog -cache MSLSA:

就可以获取 AFS token,然后就可以从网络文件夹进入 AFS 目录了. 注意命令参数末尾不要漏掉冒号。

为了省去每次键盘录入 -cache 参数的麻烦,可以创建一个系统环境变量KRB5CCNAME,将它的值设成MSLSA: 同样的不要漏掉冒号。然后平时只要执行不带参数的aklog就可以了。

如果你的组织恰好还使用 Microsoft Exchange 来提供邮件服务,那么很可能你的邮件账号和 AFS 账号是统一的。你只需要记住一个密码就可以了。

OpenAFS 的访问权限

AFS 有一套严谨易用的访问权限机制。

作为普通用户,你首先需要了解的是,Linux 对本地文件和目录采用的 Mode Bits (即 rwxrwxrwx)不适用于 AFS. 虽然你在 /afs 目录下仍然可以使用 “ls -l” 命令查看文件或目录的 Mode Bits,但是它们并不决定你对文件或目录的访问权限。因此,当你在 /afs 目录下时,不要使用 chmod 命令改变文件的访问权。而应该使用本节将要介绍的 “fs sa” 命令。也不要使用 “ls -l” 命令的结果决定自己的访问权,而应该使用本节将要介绍的 “fs la” 命令。

AFS 对文件的访问权限以目录为单位管理。同一层目录下的文件具有同样的访问权限。这和 Linux 基于单个文件的访问控制不同。

一开始你可能不太适应这种不同,不过很快你会发现 AFS 的机制十分简便易用。

如果你将一个文件移入一个目录,则能够访问该目录的用户就都可以访问该文件。

如果你不希望有权访问这个目录的用户访问某个文件,则将该文件移出该目录即可。

子目录的权限完全由子目录决定,AFS 在判断权限时不参考父目录的权限(只有后面提到的 l 权限例外)。所以 AFS 的访问权没有复杂的继承规则。

每个 AFS 目录都有一个自己的访问控制列表ACL. AFS 目录的访问权由其 ACL 决定,而不是由其 Linux Mode Bits 决定。

ACL 和 Linux Mode Bits 最大的不同是它由一条一条的记录组成。一个目录的 ACL 最多可以容纳 20 条记录,而不像 Linux Mode Bits 只能对三类用户(owner, group, others)分别定义权限。

每一条 ACL 记录分为两部分,第一部分指明授予权限的对象,这可以是一个 AFS 用户名,也可以是一个 AFS 用户组。第二部分指明给予对象的权限类型。

比如下面这条记录表明 alice 这个用户具有查找(”l”)和读取文件内容(”r”)的权限。

alice 	rl

rl组合又简称读权限(read)。

而下面这条记录给予了 bob 这个用户读取(r)、查看(l)、删除(d)、插入(i)、改写(w)和锁定(k)文件的权限。

bob 	rlidwk

rlidwk组合又简称写权限(write)

用 fs la 命令查看目录的 ACL

使用 fs la 命令可以查看一个目录的访问权。

fs la ./work

上面这个命令将列举 ./work 子目录的 ACL.
一个实际的执行过程如下:

ximeng@eda001:~$ fs la /afs/company.com/u1/ximeng
Access list for /afs/company.com/u1/ximeng is
Normal rights:
  system:administrators rlidwka
  system:authuser l
  ximeng rlidwka

注意你必须具有对象目录的查看权限(”l”)才可以对其执行”fs la” 命令。

如上面的例子所示,fs la 命令的返回结果是一条一条的 ACL 记录。为了理解每条记录里字母编码的意义,可以参考下面的描述。

AFS 目录的 ACL 定义了7种权限:

  • l 权限允许用户查询目录下的文件和子目录名(允许执行cd和ls 命令),并允许查询 ACL。
  • r 权限允许用户读取目录下的文件内容。
  • i 权限允许用户向目录下增添文件或子目录。
  • d 权限允许用户删除目录下的文件或子目录。
  • w 权限允许用户改写目录下的文件内容。
  • k 权限允许用户锁定目录下的文件。
  • a 权限允许用户修改目录的 ACL,即行使目录的管理权。

和 Linux Mode Bits 不同,AFS 没有设定专门的执行权限。当用户有读取 AFS 目录下文件的权限时,即可执行其下文件。

普通用户往往记不住上面那么多复杂的权限。而且并不是每种字母的组合都具有实际意义。因此 AFS 定义了四个最常用的快捷组合

  • all 组合:代表所有7种标准权限,即 rlidwka.
  • none 组合:将用户从 ACL 里移除。
  • read 组合:代表 r 和 l 两种权限的组合。
  • write 组合:代表除了 a 权限以外的所有权限,即rlidwk

普通用户在绝大多数情况下只需要使用上面四种快捷组合就足以应付日常需要。实际上笔者在做了四年 AFS 普通用户以后也没有记住所有字母的权限意义。

用 fs sa 命令给予用户访问权

如果要给予、取消或改写一个用户或用户组的访问权限,可以使用 fs sa 命令。这个命令允许一次设定多条 ACL 记录。比如:

$ fs sa ./ alice read bob write eve none

上面这个命令将修改当前目录的 ACL, 给予alice读权限,给予 bob 写权限,取消 eve 用户所有权限。

注意你必须对对象目录拥有管理权(”a”),才可以执行上述命令。

下面这个命令给予 edward 这个用户所有权限,使得他不仅可以读写,还可以改变当前目录的访问权限,即改写目录的 ACL:

$ fs sa ./ edward all

fs sa 命令既可以接受快捷组合,也可以接受7 种字母编码的权限。

设定目录和所有子目录的访问权

很多情况下我们不仅需要设定一级目录的访问权,还需要设定其下所有级子目录的访问权,即我们需要递归(recursively)给予或改变用户的访问权。

“fs sa” 这个命令本身没有递归调用的参数。但是我们可以结合 Linux 的 find 命令达到这个目的。

$ find ./ -type d -exec fs sa {} alice read bob l \;

上面这个命令将给予 alice 对当前目录及其下所有子目录的读权限,而仅仅给予 bob 查看当前目录和所有子目录的权限。注意末尾的 “;” 不可忽略。

关于 Linux 的 find 命令的其他各种高级应用,读者可以搜索相关网络教程或文档进一步了解。

“l” 权限的继承规则

如果没有父目录的访问权而有子目录的访问权,可以访问子目录吗?

对于这种情况 AFS 有一个特殊规定。要允许一个用户访问某个目录,除了该目录的 ACL 应该给予用户相应的权限以外,该目录的各级父目录也都要给予该用户 “l” 权限

换个简单直白的说法即,如果你没有 cd 进入某个目录的 “l” 权限,那么无论其子目录给予了你多少权限,你在事实上都无法访问。

正是基于上述规定,所有的 AFS Cell 都会在其第二级子目录里给予所有合法用户 “l” 权限。也正是基于同样的原因,AFS 系统管理员通常会预先向每个个人目录的 ACL 里添加一条记录,给予所有合法用户 “l” 权限查看该用户的个人目录。

  • 这通过给予 system:authuser 这个预定义的组 “l” 权限实现。

当你发现自己的个人目录 ACL 里有给予 system:authuser 组 “l” 权限时,这意味着所有合法的 AFS 用户都可以通过 “ls” 命令查看你个人目录下的文件名和目录名,也可以用 “cd” 命令进入你的个人目录。这是为了方便你进一步开放自己目录下的子目录给某些用户访问。

注意 ”l” 权限只是给予了用户查看文件名的权限,并不允许他们读取你的文件内容。只有当你进一步开放 “r” 权限时,用户才能读取你的文件内容。

如果你不希望所有用户进一步访问你的二级子目录,则将这些二级子目录里相应的 “l” 权限移除即可。

当你决定保留系统管理员预添置的这条 “l” 权限时,应该注意不要将敏感的信息放入个人目录下的文件名或目录名里。比如你不应该将一个文件的名字取做 ”我的银行密码是xyz.txt” 并将其放入个人目录下。

如果你不希望所有用户进入你的个人目录,只希望给予特定的用户这个权限,则可以修改自己个人目录的 ACL, 将上述权限移除。大多数情况下,你会发现只要规避敏感文件名或目录名,管理员为你预置的这条记录是更符合需要的。

分享 AFS 目录和文件

当你掌握了 “fs sa” 和 “fs la” 命令以后,就可以很方便地与其他用户分享目录和文件了。

为了分享某个子目录,你应该使用 “fs sa” 命令设定其访问权,并且确认用户可以 cd 进入该目录的所有各级父目录。

如果需要访问其他用户的目录,可以让该用户使用”fs sa” 命令给予你相应的权限,或者将你加入已经有权访问该目录的某个用户组。

如果不确定对某个目录是否有访问权,可以使用”fs la” 命令查看其 ACL. 如果发现没有访问权,而某个用户或用户组对该目录具有 “a” 权限,则可以联系该用户或用户组的成员,向他们申请访问权. 因为他们有权修改这个目录的 ACL.

public 文件夹

为了更方便地分享文件,很多 AFS Cell 会预先给每个用户的个人目录里创建一个叫做 “public” 的子目录。这个子目录和其他目录最大的不同,是其 ACL 里具有下面的记录:

system:authuser	rl

这条记录给予所有 AFS 合法用户读取 public 下文件内容的权限。

这个目录的主要功能就是方便分享文件。如果你想和某些用户分享一些文件,这些文件的内容不是很敏感,即使被其他合法用户看到也无关紧要,那么最方便的方式就是将其拷贝到 public 子目录下,再告知需要该文件的用户去你的public 子目录下读取即可。

实际使用经验表明这种情况发生的频率很高。比如你想分享自己的 VIM 配置文件,或者 cds.lib 库配置文件,或者一个 Python 脚本等等,都可以使用public 目录达到目的。

如果你不希望文件被其他用户看到,那么还是应该使用 “fs sa” 命令单独向指定用户开放特定的子目录。

如果文件很大,拷贝不方便或占据太多配额,或者文件所处的路径环境不能移动(移动就会失效),那么也应该使用 “fs sa” 的方式就地开放目录,而非将文件拷贝到 public 子目录下。

注意 “public” 一般是全小写,需要和首字母大写的 “Public” 目录区别。首字母大写的”Public” 子目录一般是 GNOME 桌面给用户创建的子目录,不具有 AFS 下分享文件的功能。

OpenAFS 命令的格式规律

AFS 的命令具有非常规则的形式,即主命令 + 子命令的格式。

普通用户绝大多数情况下只会接触两个主命令,即 ”fs” 和 “pts

  • “fs” 是针对目录与文件的命令。
  • “pts” 是针对用户或用户组的命令。

子命令的形式十分多样,子命令指明具体的操作。比如 fs 主命令的子命令 sa (setacl 的缩写)用于设定目录权限。另一个子命令 la 用于列举目录权限。

子命令不需要记忆。如果需要查找子命令,只需要执行

主命令  help

即可获得该主命令包含的所有子命令。比如

$ fs help

可以列举出所有 fs 的子命令。

子命令的参数格式也不需要记忆,只需要执行

主命令 help 子命令

即可获得某个子命令的参数格式。比如

$ fs help sa

就会列举出 “fs sa” 需要的命令格式。

如果需要获得某个子命令的详细说明,可以执行

man 主命令_子命令

来阅读子命令的使用手册。比如

$ man fs_sa

就可以查看 “fs sa” 的 man 手册。

另外,同样的 OpenAFS 手册也可以在 OpenAFS 官网的文档页面获得。一般情况下使用搜索引擎以 “openafs 主命令_子命令” 作为关键词就可以查阅到相应的命令说明。比如:

https://docs.openafs.org/Reference/1/fs_setacl.html

所以对所有新手用户而言,记住如下几个命令即可:

kinit, aklog, tokens, unlog, kdestroy
fs, pts

至于命令格式则随时可以通过 help 的形式查询获得。

AFS 配额

作为普通用户,你的个人目录一般有配额限制。当你不停地往个人目录里添加内容、到达配额上限时,系统将拒绝继续写入新文件,你将会受到配额已满的警告。

查询自己的配额及其使用情况可以使用 “fs lq” 命令,比如:

$ fs lq ~/

上面的例子查询个人目录的配额。返回的结果将以 KB 为单位

当配额不够时,用户可以联系 AFS 系统管理员为自己的个人目录扩容。AFS 管理员可以做到的内容包括但不限于:

  1. 提升个人目录配额的上限(一般不建议)
  2. 将某个占用很多空间的子目录转换成一个单独的 AFS 卷,使其拥有自己的配额而不再占用个人目录的配额。
  3. 创建多个新的 AFS 卷并将其挂载在用户指定的子目录下,新的卷将拥有新配额。
  4. 创建一个专门用于存储大量临时数据的卷供用户存放仿真输出文件,并将其以子目录的形式挂载在用户个人目录下。

普通用户一般不需要关心上述具体操作的实现细节,只需要知道配额的存在以及会使用 fs lq 命令查看配额的使用情况即可。

创建和管理 AFS 用户组

当你频繁使用 “fs sa” 命令管理子目录的访问权限时,有些繁琐的情况将开始出现。

比如你有一组相对固定的合作伙伴,他们希望访问你位于不同路径下的多个目录。如果使用 “fs sa” 命令单独向每个目录里添加每个用户的记录,不仅耗时繁琐而且容易出错。当你希望添加新的合作伙伴时,又不得不找到之前所有的目录,再逐一增添 ACL 记录。这些都是很不方便的。

另外 AFS 文件系统的设计只允许单个目录的 ACL 包含20条记录。当你有超过20 个合作伙伴时,就无法将他们一一添加到 ACL 里。

你可以使用 AFS 用户组来解决上述麻烦。假设你的用户名是 xguan, 则你可以建立一个 AFS 用户组叫 xguan:partners, 使用 “fs sa” 将这个组添加到每个目录的 ACL 里。

有了 AFS 用户组以后,给予或取消用户的访问权限,就转换成了管理这个AFS 用户组的成员。新成员加入时,你可以将其加入这个组。老成员离开时,你可以将他移出这个组,而不必再去修改 每个相应目录的 ACL.
如果你新添了一个项目目录,希望给予合作伙伴同样的权限,只需要将这个组加入 ACL, 而不必将其成员一一加入 ACL.

作为普通用户你最多可以创建20个组。绝大多数情况下这个配额足够你使用了。如果你需要更多的组,可以联系 AFS 系统管理员提升你的配额限制,或者请系统管理员为你创建用户组。

用户组的名称有一个限制。普通用户创建的组的名称必须带有用户名加冒号的前缀,否则创建操作会失败。比如如果你的用户名是 xguan,你创建的用户组就必须带有 “xguan:” 这个前缀,比如 xguan:friends. 而如果你试图创建不带前缀的用户组比如 friends 时操作将被拒绝。

AFS 系统管理员可以创建组名不带前缀的用户组。如果你希望获得这样的组的管理权,可以请 AFS 系统管理员为你创建这个组,并将组的所有者变更成你或者包含你的另一个组。

用 pts creategroup 创建用户组

你可以使用 pts 主命令的子命令 creategroup (简写 cg) 来创建属于自己的用户组。比如

$ pts creategroup xguan:friends

用 pts membership 查看用户组的成员

你可以使用 pts 主命令的子命令 membership (简写 m) 来查看一个组的成员,比如

$ pts m xguan:friends

将列举 xguan:friends 的所有成员。

用 pts membership 查看用户属于哪些组

作为普通用户你可以用同样的命令查看自己属于哪些组,比如

$ pts m xguan

将列举用户 xguan 所属的所有组。

用 pts adduser 添加组成员

比如

$ pts adduser -user alice bob -group xguan:friends

将 alice 和 bob 添加到 xguan:friends 组里。

注意当用户加入新组而获得新的访问权限时,有时候需要unlog 并重新 aklog 才能生效。

用 pts removeuser 删除组成员

比如

$ pts removeuser -user alice -group xguan:friends

将 alice 从 xguan:friends 里移除。

用 pts listowned 查看具有管理权的组

比如

$ pts listowned xguan

将列出用户 xguan 拥有的所有组。这既包含 xguan 自己创建的组,也包含 AFS 系统管理员创建以后将管理权移交给 xguan 的所有组。

可以看到,与 Linux 只能将用户分为 owner, group 与 others 三类进行访问控制相比,AFS 的 ACL 提供了更加全面灵活的访问机制。

.OldFiles 与文件恢复

Linux 和 Unix 删除文件一般是永久的,没有类似 Windows 的垃圾箱用于缓冲。为了在一定程度上防止误删除,AFS 提供了一种定期创建用户个人目录快闪拷贝的功能,比如 AFS 系统会在每天凌晨 3:00 为所有个人目录创建一个快闪拷贝,并替换前一天创建的快闪。

如果 AFS 系统管理员开启了这个功能,而你刚刚误删除了一些文件或目录,同时这些文件或目录昨天已经存在,那么你就可以从快闪拷贝里找回这些文件。

注意这个功能恢复文件的能力是有限的。如果你删除文件以后已经过了一天,那么快闪已经更新,就无法恢复误删除的文件了。

根据 AFS 的习惯,快闪拷贝一般位于个人目录的隐藏子目录下,这个子目录通常被命名为 .OldFiles. 你可以咨询 AFS 系统管理员来确定是否存在这样的快闪拷贝。

注意 .OldFiles 目录下的内容只能读取无法改写,和 ACL 的设定无关。另外 .OldFiles 的内容不占用个人目录的配额。

 类似资料: