Name Service Switch 程式設計:基本觀念

jollen 發表於 October 3, 2006 10:21 PM

有些 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