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

自动挂载的文件系统会在上次使用后大约 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@<单元格名称>”。可以使用 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: [email protected]

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

在使用 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 的名称。