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