有些 C 函數的運作會依據 localhost 的設定而有不同行為,而這些設定的做法是透過「設定檔」(eg. /etc/services) 來實現。目前在 GNU/Linux 系統底下,可以看到許多這樣的設定檔,我們把這些設定檔稱為 system database,這些資料庫主要是以文字檔方式儲存重要的系統資訊,例如: /etc/passwd 存放使用者名稱、/etc/services 存放網路服務的通訊埠 (port) 設定等等。
GNU C library 實作的 "Name Service Switch" 函數群便是用來讀取所有 system database 內容的介面!
System Database
NSS 支援 11 種資料庫名稱:aliases、ethers、group、hosts、netgroup、networks、protocols、passwd、rpc、services 與 shadow。分別說明如下。
aliases: Mail 別名
ethers: Ethernet 號碼
group: 使用者群組資料庫,即 /etc/group
hosts: Host names 與 IP 對應資料庫,即 /etc/hosts 或是利用 name server 轉換
netgroup: "hostname username domainname" 的組合稱為 netgroup
networks: 即 /etc/networks
protocols: 通訊協定資料庫,即 /etc/protocols
passwd: 使用者名稱資料庫,即 /etc/passwd
rpc: Remote procedure call 資料庫
services: 即 /etc/services 資料庫
shadow: 即 /etc/shadow 檔
NSS Service 與 Lookup
NSS 支援 7 種服務類型,說明如下。
1. nisplus (or nis+): 使用 NIS+ (NIS version 3) 服務
2, nis (or yp): 使用 NIS (NIS version 2) 服務 (也叫 YP, YellowPage)
3. dns: 使用 DNS (Domain Name Service) 服務
4. files: 使用一般的檔案讀取服務
5. db: 使用 database (.db) 檔案讀取服務
6. compat: 使用 NIS compat mode 服務
7. hesiod: 使用 Hesiod 服務做 user lookups
GNU 的實作是把每一個服務 (service) 實作成不同的 module (shared library),因此可以在 GNU/Linux 系統底下找到這些相對應的 shared libraries:
libnss_nisplus.so.2
libnss_nis.so.2
libnss_dns.so.2
libnss_files.so.2
libnss_compat.so.2
libnss_hesiod.so.2
不過其實還有下面 3 個:
/lib/libnss_ldap.so.2
/lib/libnss_winbind.so.2
/lib/libnss_wins.so.2
GNU 的 NSS module 是以 libnss_SERVICE.so.2 來命名。
在這些 module (library) 裡的函數,是無法讓程式直接使用的,因此了解這些 module 裡的函數如何被使用 (呼叫) 是一個重要且有趣的題目。
查詢前面所提 11 種資料庫資訊的動作稱為 lookup,lookup 的方法便是 NSS 的服務類型 (NSS service),也就是我們可以利用以上共 7 種方式來查詢 system database;不過,以 files、db、nis 與 nisplus 這 4 種方式是比較常用的。
由此可知,不同的 system database 可以用不同的服務來做查詢。因此,系統管理員必須告訴 NSS,我們想要他利用哪一種服務類型,來查詢 (lookup) 指定的 system database。這個動作的管理方式便是透過 /etc/nsswitch.conf 設定檔來完成。
/etc/nsswitch.conf
看一下 glibc-2.3.3 預設定 nsswitch.conf 設定檔內容如下:
# /etc/nsswitch.conf # # Example configuration of GNU Name Service Switch functionality. # passwd: db files group: db files shadow: db files hosts: files dns networks: files dns protocols: db files services: db files ethers: db files rpc: db files netgroup: db files
這樣其實就很清楚了,例如:passwd 資料庫 (/etc/passwd) 的讀取方式 (lookup service) 有 db/files 二種。以 embedded Linux 系統來說,我們會這樣設定:
passwd: files
也就是說,直接以檔案讀取方式來查詢 /etc/passwd。那麼,之前提過的 embedded Linux 系統建置之 thttpd 個案分析,為何需要 libnss_files.so.2 檔案,觀念就很清楚了。
此外,大家也可以了解一下 red hat linux 或其它 Linux distribution 的 nsswitch.conf 設定佈署方式。
這個部份的文件主要是 glibc 的手冊,大家可參考 http://www.gnu.org/software/libc/manual/html_node/Name-Service-Switch.html#Name-Service-Switch
-- jollen
作者/陳俊宏
http://www.jollen.org
Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue
您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw