GNU C Library 的名稱服務切換(NSS)將應用程式的查詢 API 與回答查詢的資料來源分開。程式碼呼叫 getpwnam(3)、getgrnam(3)、getaddrinfo(3) 或 getservbyname(3);glibc 依據 /etc/nsswitch.conf 選取並組合服務。因此,本機檔案、DNS 伺服器、目錄服務或系統服務都可以提供同一類資訊,而不必變更呼叫端。
資料庫系列 #
glibc 辨識的資料庫包括 passwd、group、shadow、hosts、networks、protocols、services、rpc、ethers、netgroup、aliases、publickey 與 initgroups。每個資料庫都有自己的 libc 介面與記錄形狀。
| 資料庫 | 代表性介面 | 常見本機來源 |
|---|---|---|
passwd、group、shadow | getpwnam、getgrnam、getspnam | /etc/passwd、/etc/group、/etc/shadow |
hosts、networks | getaddrinfo、getnetbyname | /etc/hosts、/etc/networks |
services、protocols、rpc | getservbyname、getprotobyname、getrpcbyname | /etc/services、/etc/protocols、/etc/rpc |
列舉介面遵循相同政策。例如,setpwent、getpwent 與 endpwent 列舉有效的 passwd 資料庫,不一定是 /etc/passwd。因此列舉可能聯絡目錄伺服器,也可能回傳比本機檔案讀取器更多或持續變化的集合。
在並行程式碼中使用可重入介面。getpwnam_r 及其同類介面接收呼叫端擁有的結果與字元緩衝區、回傳錯誤編號,並透過空結果指標回報不存在,而不是將其視為成功記錄。確切的結果慣例依介面而異;請查閱相關手冊,不要將每個失敗都簡化為 errno。不可重入的舊式介面通常會回傳指向可被後續呼叫覆寫之儲存空間的指標。
設定搜尋順序 #
每個非註解項目都命名一個資料庫、一個冒號與有順序的服務清單:
passwd: files systemd sss
group: files systemd sss
shadow: files sss
hosts: files resolve [!UNAVAIL=return] dns
services: filesfiles 讀取對應的本機資料庫。dns 對主機查詢有意義。resolve 與 mymachines 是在提供這些服務的安裝中由 systemd 提供的主機服務。sss、ldap、winbind 與 mdns 來自分開安裝的提供者。設定但無法使用的服務屬於操作行為,而不是宣告其函式庫必須存在。
每個服務會回傳四種 NSS 狀態之一:
| 狀態 | 意義 | 預設動作 |
|---|---|---|
success | 找到記錄 | return |
notfound | 查詢完成但沒有找到記錄 | continue |
unavail | 服務無法回答 | continue |
tryagain | 服務暫時無法回答 | continue |
括號中的條件會覆寫前一服務的預設值:
hosts: files [NOTFOUND=return] dns該設定刻意讓負面的 /etc/hosts 查詢成為最終結果。[!UNAVAIL=return] 會匹配除 unavail 外的每個狀態。merge 只獲得狹義支援:glibc 使用 [SUCCESS=merge] 合併相符的群組項目,不適用於任意資料庫或 getgrent 列舉。
測試設定行為時執行 getent,因為它使用 NSS,而不是直接讀取本機檔案:
getent passwd root
getent hosts example.com
getent services https模組邊界 #
對於名為 SERVICE 的服務,傳統 glibc NSS 模組是名為 libnss_SERVICE.so.2 的共享物件;當設定的資料庫需要它們時,會透過動態載入器載入。模組會匯出資料庫與操作特定的符號,例如 _nss_files_getpwnam_r;它回傳內部 NSS 狀態,而 glibc 會套用 nsswitch.conf 動作。
模組 ABI 刻意比公開查詢 API 更低階。可重入查詢進入點必須填入呼叫端提供的物件與緩衝區、區分找不到與後端不可用,並依該資料庫契約設定錯誤輸出。模組作者必須符合目標發行版本與架構的 glibc NSS 介面;匯出名稱相似的公開 libc 函式不會建立 NSS 後端。
NSS 不是通用設定語言。glibc 會忽略它未實作的資料庫名稱,而應用程式可以定義並剖析自己的名稱;sudoers 與 subid 就是例子。因此,在修改非標準項目前,請同時識別使用者與其模組 ABI。
Resolver 與目錄服務操作 #
主機解析可以經過 files、resolve 與 dns,而身分解析可以經過本機檔案、systemd 的動態使用者服務、SSSD、LDAP 或 Active Directory 配接器。因此查詢可能因 IPC 或網路往返而阻塞。服務順序、負面結果動作、精靈可用性、目錄逾時與快取必須一併設計,因為它們會影響登入延遲與失敗行為。
glibc NSS 文件 與 nsswitch.conf(5) 定義設定與面向 libc 的行為。
評論
在 GitHub 上閱讀或評論(發表評論需要登入)