rpc.statd程式主要實現NFS鎖相關內容,如普通的文件鎖(NLM、NSM)、文件委托、租約等,但註意,它和sm-notify組合起來才能實現整個NFS鎖機制,具體見下文翻譯文檔中的說明。 以下是NFS相關翻譯篇: 回到系列文章大綱:http://www.cnblogs.com/f-ck-nee ...
rpc.statd程式主要實現NFS鎖相關內容,如普通的文件鎖(NLM、NSM)、文件委托、租約等,但註意,它和sm-notify組合起來才能實現整個NFS鎖機制,具體見下文翻譯文檔中的說明。
RPC.STATD(8) System Manager's Manual RPC.STATD(8) NAME rpc.statd - NSM服務守護進程 SYNOPSIS rpc.statd [-dh?FLNvV] [-H prog] [-n my-name] [-o outgoing-port] [-p listener-port] [-P path] [--nlm-port port] [--nlm-udp-port port] DESCRIPTION 文件鎖不是持久文件系統狀態的一部分。因此當主機重啟時鎖的狀態會丟失。 當遠程主機重啟時,網路文件系統必須能夠探測到鎖狀態的丟失。當NFS客戶端重啟時,NFS服務 端必須釋放該客戶端所申請的所有文件鎖。在服務端重啟後,客戶端必須能夠提醒服務端它所申 請的所有文件鎖。 對於NFSv2和NFSv3,使用網路狀態監控器Network Status Monitor(NSM)協議來通知NFS對端關於重 啟的事情。在Linux上,NSM服務進程由兩個獨立的用戶空間程式組成: ● rpc.statd 該守護進程用於監聽其他主機的重啟消息,並管理本地主機重啟時需要通知的主機列表。 ● sm-notify 一個輔助程式,用於在本地系統重啟時通知NFS對端。 (譯者註:也就是說rpc.statd是重啟信息的接收者,而sm-notify是信息的通知者) 本地NFS鎖管理器(NFS lock manager,NLM)會它本地的rpc.statd發出警告說列表中的每個遠程對端 狀態都需要被監控。當本地系統重啟時,sm-notify命令會通知對端上的NSM服務關於自己重啟的 事。當遠程主機重啟時,遠程對端的sm-notify通知本地的rcp.statd,然後將此信息告訴本地NFS 鎖管理器,本地鎖管理器將維護與重啟端對應文件的鎖。 NSM OPERATION IN DETAIL NFS客戶端和服務端之間的第一個文件鎖交互行為會使得兩端的NLM都去聯繫它們本地的NSM服務以 存儲它們對端的信息。在Linux上,也就是讓本地所管理器去聯繫rpc.statd守護進程。 rpc.statd會將NFS對端信息記錄在持久存儲上。該信息描述瞭如果本地系統重啟時如何去聯繫遠程 對端,如何識別對端報告它在重啟的信息,以及當對端說它已經重啟完成時如何通知NLM。 每個客戶端在每個文件鎖請求中都會發送一個稱為客戶端caller_name的主機名。NFS服務端可以使 用該主機名向客戶端發送非同步GRANT調用,或者通知客戶端它已經重啟完成。 Linux NFS服務端可以將客戶端的caller_name或客戶端的網路地址提供給rpc.statd。為了遵守NSM 協議,該名稱或地址被稱為對端mon_name。另外,本地鎖管理器會告訴rpc.statd它自己的主機名, 為了遵守NSM協議,該主機名被稱為my_name。 在NFS中,NFS服務端沒有通知客戶端它的主機名的交互行為。因此NFS客戶端實際上不知道服務端 的mon_name,儘管在SM_NOTIFY請求中會使用的它。Linux NFS客戶端是通過使用從掛載命令中獲取 到的服務端主機名或地址來識別正在啟動的NFS服務端的。 Reboot notification 當本地系統重啟時,本地的sm-notify命令從持久存儲中讀取監控對端列表,併發送SM_NOTIFY請求 給列表中每個遠程對端的NSM服務進程,它使用mon_name字元串來指定發送目標。為了識別哪個主 機已經重啟完成,重啟後的主機會使用sm-notify命令發送my_name字元串。遠程rpc.statd將使用 該字元串與其監控列表中的對端相匹配以找出發送SM_NOTIFY請求的主機。 如果rpc.statd在它的監控列表中未找到能匹配接收到的SM_NOTIFY請求的對端,則通知不會被轉發 給本地鎖管理器。另外,每個對端都獨有一個32位整數NSM狀態碼,在每次重啟之後,sm-notify命 令都會讓它碰撞重覆。rpc.statd使用該號碼來區分是重啟還是通知重放。 NFS鎖恢復的一部分是重新發現哪個對端需要被再次監控。在每次重啟之後,sm-notify命令都會清 空持久存儲上的監控列表。 OPTIONS -d, --no-syslog 若同時指定了"-F"選項,則表示讓rpc.statd不再向syslog中寫日誌,而是輸出的stderr中。 -F, --foreground 使得rpc.statd附在控制終端上以便NSM操作可以直接被監控到,主要是為了調試。如果不指 定該選項,則rpc.statd啟動後立即進入後臺運行。 -h, -?, --help 輸出rpc.statd命令的使用說明並退出。 -H, --ha-callout prog 指定一個高可用callout程式。如果未指定該選項,則不執行任何callout程式。詳細說明見 下麵的"High-availability callouts"段落。 -L, --no-notify 阻止rpc.statd在其啟動時運行sm-notify命令,以及阻止保留已存在的NSM狀態號碼和監控列 表。 註意:sm-notify命令包含了一次檢查以確保在每次系統重啟後它僅運行了一次。若rpc.statd 以不帶"-L"選項重啟時,這可以防止虛假的重啟通知。 -n, --name ipaddr | hostname 指定RPC監聽套接字綁定的地址。如果未指定該選項,rpc.statd使用通配地址(即0.0.0.0)。 該字元串也會被傳遞給sm-notify命令,用於作為發送重啟通知請求時的源地址。詳細內容見 sm-notify(8)的man文檔。 -N 讓rpc.statd執行sm-notify命令然後退出。由於sm-notify命令可直接運行,該選項已廢棄。 -o, --outgoing-port port 指定當sm-notify命令發送重啟通知時使用的源埠號。詳細內容見sm-notify(8)的man文檔。 -p, --port port 指定rpc監聽套接字監聽的埠號。如果未指定該選項,則rpc.statd會嘗試從/etc/services中 獲取,如果獲取成功,則為所有監聽套接字都設置此埠號,否則將為每個監聽套接字都選擇 一個隨機埠號。 該選項在SM_NOTIFY需要穿越防火牆時可以用來調整埠號,防止被防火牆堵住。 -T, --nlm-port port 指定監聽NLM請求的埠號。除非使用了"-U"單獨指定了UDP埠號,否則將同時監聽TCP和UDP的 埠號。 -U, --nlm-udp-port port 指定監聽NLM請求的UDP埠號。 -P, --state-directory-path pathname 指定NSM狀態信息保存路徑的父目錄。如果未指定該選項,則預設為/var/lib/nfs/statd。 程式啟動之後,rpc.statd將嘗試為此目錄使用UID和GID設置它的所有者和所屬組。 -v, -V, --version 輸出rpc.statd的版本號並退出。 SECURITY The rpc.statd daemon must be started as root to acquire privileges needed to create sockets with privileged source ports, and to access the state information database. Because rpc.statd mai- ntains a long-running network service, however, it drops root privileges as soon as it starts up to reduce the risk of a privilege escalation attack. During normal operation, the effective user ID it chooses is the owner of the state directory. This allows it to continue to access files in that directory after it has dropped its root privileges. To control which user ID rpc.statd chooses, simply use chown(1) to set the owner of the state directory. You can also protect your rpc.statd listeners using the tcp_wrapper library or iptables(8). To use the tcp_wrapper library, add the hostnames of peers that should be allowed access to /etc/hosts.allow. Use the daemon name statd even if the rpc.statd binary has a different filename. For further information see the tcpd(8) and hosts_access(5) man pages. ADDITIONAL NOTES 主機重啟後的鎖恢復對於維護數據一致性和防止不必要的應用程式掛起至關重要。為了能讓 rpc.statd更高效地匹配SM_NOTIFY請求,應該遵守一些最佳實踐,包括: 系統的UTS名稱需要和NFS對端用來做聯繫的DNS名稱相匹配。 (註:若不知何為UTS名,可以簡單地認為UTS名稱就是主機名) 系統的UTS名稱應該總是fqdn格式的名稱。 系統的UTS名的正向和反向DNS映射最好要保持一致。 客戶端用來掛載的服務端的主機名最好能匹配它所發送的SM_NOTIFY請求中的mon_name。 卸載NFS文件系統時無需停止客戶端或服務端任意一端的狀態監控。兩端可能會繼續保持監控一段 時間,以防這兩端間後續再次出現新的掛載和額外的文件鎖的NFS流量出現。 在Linux上,如果沒有裝在內核鎖模塊,所有的遠程NFS對端都不會被監控。這可能會發生在NFS的 客戶端上,例如,自動掛載工具移除了所有NFS掛載點,因為它們處於空閑非活動狀態。 High-availability callouts 在rpc.statd成功處理SM_MON, SM_UNMOU和SM_UNMON_ALL請求時或接收到SM_NOTIFY時,rpc.statd可以 執行一個特定的回調(callout)程式。這個程式在高可用NFS(HA-NFS)環境下可用來跟蹤鎖狀態,特別 是某節點主機重啟後資源需要遷移時。 callout程式的名稱由rpc.statd的"-H"選項指定。該程式運行時有4個參數:第一個參數是add-client 或del-client或sm-notify,這取決於之所以要調用callout的原因。第二個參數是監控對端的mon_name。 第三個參數是鎖管理器要add-client或del-client時的caller_name,否則則是發送SM_NOTIFY請求的IP 地址。第四個參數是SM_NOTIFY請求中的state_value。 IPv6 and TI-RPC support TI-RPC is a pre-requisite for supporting NFS on IPv6. If TI-RPC support is built into rpc.statd, it attempts to start listeners on network transports marked 'visible' in /etc/netconfig. As long as at least one network transport listener starts successfully, rpc.statd will operate. FILES /var/lib/nfs/statd/sm directory containing monitor list /var/lib/nfs/statd/sm.bak directory containing notify list /var/lib/nfs/statd/state NSM state number for this host /var/run/run.statd.pid pid file /etc/netconfig network transport capability database SEE ALSO sm-notify(8),nfs(5),rpc.nfsd(8),rpcbind(8),tcpd(8),hosts_access(5),iptables(8),netconfig(5) RFC 1094 - "NFS: Network File System Protocol Specification" RFC 1813 - "NFS Version 3 Protocol Specification" OpenGroup Protocols for Interworking: XNFS, Version 3W - Chapter 11 AUTHORS Jeff Uphoff <[email protected]> Olaf Kirch <[email protected]> H.J. Lu <[email protected]> Lon Hohberger <[email protected]> Paul Clements <[email protected]> Chuck Lever <[email protected]> 1 November 2009 RPC.STATD(8)
以下是NFS相關翻譯篇:
翻譯:man rpcbind(rpcbind中文手冊) 翻譯:man nfsd(rpc.nfsd中文手冊) 翻譯:man mountd(rpc.mountd中文手冊) 翻譯:man statd(rpc.statd中文手冊) 翻譯:man sm-notify(sm-notify命令中文手冊) 翻譯:man exportfs(exportfs命令中文手冊) 部分翻譯:man nfs
回到系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7048359.html