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