kAFS: AFS 文件系统

概述

此文件系统提供了一个相当简单的安全 AFS 文件系统驱动程序。它正在开发中,尚未提供完整的功能集。它支持的功能包括

(*) 安全性(目前仅支持 AFS kaserver 和 KerberosIV 票证)。

(*) 文件读取和写入。

(*) 自动挂载。

(*) 本地缓存(通过 fscache)。

它尚未支持以下 AFS 功能

(*) pioctl() 系统调用。

编译

应通过启用内核配置选项来启用文件系统

CONFIG_AF_RXRPC         - The RxRPC protocol transport
CONFIG_RXKAD            - The RxRPC Kerberos security handler
CONFIG_AFS_FS           - The AFS filesystem

此外,可以启用以下选项以帮助调试

CONFIG_AF_RXRPC_DEBUG   - Permit AF_RXRPC debugging to be enabled
CONFIG_AFS_DEBUG        - Permit AFS debugging to be enabled

它们允许通过操作以下文件中的掩码来动态启用调试消息

/sys/module/af_rxrpc/parameters/debug
/sys/module/kafs/parameters/debug

用法

插入驱动程序模块时,必须指定根单元格以及卷位置服务器 IP 地址列表

modprobe rxrpc
modprobe kafs rootcell=cambridge.redhat.com:172.16.18.73:172.16.18.91

第一个模块是 AF_RXRPC 网络协议驱动程序。这提供了 RxRPC 远程操作协议,也可以从用户空间访问。请参阅

第二个模块是 kerberos RxRPC 安全驱动程序,第三个模块是 AFS 文件系统的实际文件系统驱动程序。

加载模块后,可以通过以下过程添加更多模块

echo add grand.central.org 18.9.48.14:128.2.203.61:130.237.48.87 >/proc/fs/afs/cells

其中“add”命令的参数是一个单元格的名称以及该单元格内卷位置服务器的列表,后者用冒号分隔。

可以通过类似于以下命令的命令将文件系统挂载到任何位置

mount -t afs "%cambridge.redhat.com:root.afs." /afs
mount -t afs "#cambridge.redhat.com:root.cell." /afs/cambridge
mount -t afs "#root.afs." /afs
mount -t afs "#root.cell." /afs/cambridge

其中初始字符是井号或百分号,具体取决于您是否一定需要 R/W 卷(百分号),或者您是否更喜欢 R/O 卷,但愿意改用 R/W 卷(井号)。

卷的名称可以附加“.backup”或“.readonly”后缀,以指定仅连接到这些类型的卷。

单元格的名称是可选的,如果在挂载期间未给出,则将在 modprobe 期间指定的单元格中查找命名卷。

可以通过 /proc 添加其他单元格(请参阅后面的部分)。

挂载点

AFS 具有挂载点的概念。在 AFS 术语中,这些是特殊格式的符号链接(与传递给挂载的“设备名称”的形式相同)。kAFS 将这些呈现给用户,作为具有 follow-link 功能的目录(即:符号链接语义)。如果有人尝试访问它们,它们将自动导致目标卷挂载到该站点(如果可能)。

自动挂载的文件系统将在上次使用后大约 20 分钟自动卸载。或者,可以使用 umount() 系统调用直接卸载它们。

手动卸载 AFS 卷将首先导致其上的任何空闲子挂载被剔除。如果所有子挂载都被剔除,则请求的卷也将被卸载,否则将返回错误 EBUSY。

管理员可以使用此方法尝试通过执行以下操作一次性卸载挂载在 /afs 上的整个 AFS 树

umount /afs

动态根

有一个挂载选项可用于创建仅用于动态查找的无服务器挂载。可以通过例如以下方式创建此类挂载

mount -t afs none /afs -o dyn

这将创建一个挂载,其根目录中只有一个空目录。尝试在此目录中查找名称将导致创建一个挂载点,该挂载点查找具有相同名称的单元格,例如

ls /afs/grand.central.org/

Proc 文件系统

AFS 模块创建一个“/proc/fs/afs/”目录并填充它

(*) 一个“cells”文件,列出了 afs 模块当前已知的单元格和

它们的使用计数

[root@andromeda ~]# cat /proc/fs/afs/cells
USE NAME
  3 cambridge.redhat.com
(*) 每个单元格的目录,其中包含列出卷位置的文件

该单元格中已知的服务器、卷和活动服务器

[root@andromeda ~]# cat /proc/fs/afs/cambridge.redhat.com/servers
USE ADDR            STATE
  4 172.16.18.91        0
[root@andromeda ~]# cat /proc/fs/afs/cambridge.redhat.com/vlservers
ADDRESS
172.16.18.91
[root@andromeda ~]# cat /proc/fs/afs/cambridge.redhat.com/volumes
USE STT VLID[0]  VLID[1]  VLID[2]  NAME
  1 Val 20000000 20000001 20000002 root.afs

单元格数据库

文件系统维护一个内部数据库,其中包含它知道的所有单元格以及这些单元格的卷位置服务器的 IP 地址。通过“rootcell=”参数在 modprobe 时将系统所属的单元格添加到数据库,如果已编译,则使用内核命令行上的“kafs.rootcell=”参数。

可以通过类似于以下命令的命令添加其他单元格

echo add CELLNAME VLADDR[:VLADDR][:VLADDR]... >/proc/fs/afs/cells
echo add grand.central.org 18.9.48.14:128.2.203.61:130.237.48.87 >/proc/fs/afs/cells

目前没有其他单元格数据库操作可用。

安全性

通过使用 klog 程序获取密钥来启动安全操作。一个非常原始的 klog 程序可在以下位置获得

应该通过以下方式进行编译

make klog LDLIBS="-lcrypto -lcrypt -lkrb4 -lkeyutils"

然后作为以下内容运行

./klog

假设成功,这将添加一个 RxRPC 类型的密钥,以服务和单元格命名,例如:“afs@<cellname>”。可以使用 keyctl 程序查看此密钥,也可以通过 cat’ing /proc/keys 来查看

[root@andromeda ~]# keyctl show
Session Keyring
       -3 --alswrv      0     0  keyring: _ses.3268
        2 --alswrv      0     0   \_ keyring: _uid.0
111416553 --als--v      0     0   \_ rxrpc: afs@CAMBRIDGE.REDHAT.COM

目前,用户名、realm、密码和建议的票证有效期已编译到程序中。

在使用 AFS 功能之前,不需要获取密钥,但如果未获取密钥,则所有操作将受 ACL 的匿名用户部分支配。

如果获取了密钥,则持有该密钥的人进行的所有 AFS 操作,包括挂载和自动挂载,都将使用该密钥进行保护。

如果使用特定密钥打开文件,然后将文件描述符传递给没有该密钥的进程(可能通过 AF_UNIX 套接字),则对文件的操作将使用用于打开文件的密钥进行。

@sys 替换

可以通过将列表写入 /proc/fs/afs/sysname 来配置当前网络命名空间最多 16 个 @sys 替换的列表

[root@andromeda ~]# echo foo amd64_linux_26 >/proc/fs/afs/sysname

或者通过写入空列表完全清除

[root@andromeda ~]# echo >/proc/fs/afs/sysname

可以通过以下方式检索当前网络命名空间的当前列表

[root@andromeda ~]# cat /proc/fs/afs/sysname
foo
amd64_linux_26

在替换 @sys 时,将按给定的顺序尝试列表中的每个元素。

默认情况下,该列表将包含一个符合模式“<arch>_linux_26”的项目,amd64 是 x86_64 的名称。