過去,UNIX 操作系統包含一組服務:這些服務是與任何交互式用戶登錄都不關聯的軟件程序,用於偵聽和響應請求以執行特定的任務(如傳送電子郵件、響應 ftp 請求,或允許執行遠程命令)。這些傳統服務通常是一些單獨的應用程序,它們作為單個進程執行,在系統引導時啟動,並在系統啟動和運行時持續執行,可處理接收到的任何請求。
如今,管理員必須管理一系列服務,這些服務的作用已經超出了此原始模型的作用范圍。Sun 推出了 Service Management Facility(SMF,服務管理工具),以簡化這些系統服務的管理。SMF 是 Solaris 操作系統的一項新功能,為每個 Solaris 系統上的服務和服務管理創建支持的、統一的模型。它是 Solaris 10 中預測性自我修復技術的核心部分,為軟件和硬件故障以及管理錯誤提供自動恢復功能。
在本指南中,我們將介紹 SMF 的功能及優勢,指出 Solaris 中顯著更新的部分,並說明如何使用 SMF 完成典型的管理任務。可以在 Sun 的 BigAdmin Web 站點上找到 SMF 及預測性自我修復功能的詳細指南。
功能
Service Management Facility 已經改進了 Solaris 管理模型的幾個方面。一些最顯著的更新包括:
◆ 服務由可以進行查看(使用新的 svcs(1) 命令)和管理(使用 svcadm(1M) 和 svccfg(1M))的一級對象表示。
◆ 無論失敗的服務是由管理員錯誤、軟件錯誤導致,還是受無法更正的硬件錯誤的影響,這些服務都將按照相關性順序自動重新啟動。
◆ 可以獲取有關配置錯誤或行為異常的服務的詳細信息,包括對服務未運行的原因的說明(使用 "svcs -x"),以及每個服務單獨的持久性日志文件。
◆ 引導過程中出現的問題比較容易調試,因為在啟動故障期間可以控制引導詳細程度,記錄服務啟動消息,以及提供更可靠的控制台訪問。
◆ 自動拍攝服務配置快照,從而更容易備份、恢復和撤消對服務所做的更改。
◆ 可以使用受支持的工具 (svcadm(1M)) 啟用和禁用服務,從而允許更改不受升級和修補程序的影響而保留原樣。
◆ 管理員可以更容易地將任務安全地委派給非超級用戶,這些任務包括配置、啟動、停止或重新啟動服務(如 smf_security(5) 手冊頁中所述)。
◆ 根據服務的相關性並行啟動服務,可以更快地引導大型系統。
盡管進行了上述更改,但最大程度地保留了與現有管理習慣的兼容性。例如,大多數站點本地的 "rc" 腳本和 ISV 提供的 "rc" 腳本仍將有效。
顯著的更改
SMF 提供的大多數新功能都在“後台”工作,或通過新命令進行訪問;但某些更改仍會很快顯示出來。以下顯示了其中的一些更改。
在早期版本的 Solaris 中,大量輸出將在引導期間打印到系統控制台。盡管這些消息對所發生的情況進行了比較深入的闡述,但在某些方面並不十分有用。少數服務可能會打印消息,表明它們已聯機,而許多其他服務則不打印消息。某些故障模式也可能會打印一些消息(如 "WARNING:Timed out waiting for NIS to come up"),這些消息並不能幫助診斷根本問題。錯誤消息有時直接打印到控制台,但不會在任何日志中顯示。
現在,引導過程中顯示的消息精簡了許多。以下是在 SMF 下引導時計算機所顯示內容的示例:
SunOS Release 5.10 Version Generic 64-bit
Copyright 1983-2004 Sun Microsystems, Inc. All rights reserved.
Use is subject to license terms.
Hostname: demobox
NIS domain name is testlab.example.com
checking ufs filesystems
demobox console login:
盡管打印的消息變少了,但 SMF 使得引導過程更加清晰。每個服務在 /var/svc/log 目錄(對於在單個用戶的重大事件之前啟動的服務,則為 /etc/svc/volatile 目錄)中都有一個日志文件,指出服務啟動的時間和方式、是否成功啟動,以及在初始化期間可能打印的所有消息。如果在引導期間發生嚴重問題,則您可以在維護模式下登錄到控制台,並可使用 svcs(1) 命令幫助診斷此問題。即使問題導致引導掛起(如上面提到的 NIS 故障)時也是如此。最後,新的 "-m" 引導選項(請參見 kernel(1M))允許您將引導過程配置得更加詳細,可以在每個服務啟動時打印一條簡單消息。
您可能還會注意到,中止進程後進程會“拒絕中止”。例如:
# ps -fp `pgrep -d, sendmail`
UID PID PPID C STIME TTY TIME CMD
root 330 1 0 14:21:05 ? 0:00 /usr/lib/sendmail -bd -q15m
smmsp 331 1 0 14:21:05 ? 0:00 /usr/lib/sendmail -Ac -q15m
# pkill -9 sendmail
# ps -fp `pgrep -d, sendmail`
UID PID PPID C STIME TTY TIME CMD
root 530 1 0 14:51:02 ? 0:00 /usr/lib/sendmail -bd -q15m
smmsp 531 1 0 14:51:02 ? 0:00 /usr/lib/sendmail -Ac -q15m
初看起來,盡管使用了 kill -9,卻似乎沒有發生任何情況。但是請注意,PID 是不同的,並且進程的啟動時間已經更改;事實上,舊的 sendmail 進程確實已經中止。
通過 SMF,Solaris 內核可以考慮服務、此服務的進程和其他服務(負責重新啟動此服務)之間的關系。此重新啟動關系與 Sun 的新技術緊密集成,用於在 Solaris 上進行故障管理,從而允許 SMF 重新啟動程序了解服務進程失敗的原因是管理員錯誤、相關服務故障、軟件錯誤還是根本的硬件故障。只要在任何服務故障之後捕獲到此信息,SMF 就會通知相應的重新啟動程序,該程序將確定是通過將此服務置於維護模式來禁用服務(因為它看起來存在問題),還是自動重新啟動該服務。缺省的 SMF 重新啟動程序 svc.startd 負責啟動和重新啟動 Solaris 系統上的大多數服務。在以上示例中,svc.startd 注意到 sendmail 已中止,針對此情況記錄了一條消息,並自動重新啟動 sendmail。
如果您要停止某個服務但不重新啟動其進程,請使用 svcadm(1M) 命令(請參見以下“常規任務”部分)。另外請注意,並非所有的系統服務都已轉為使用 SMF;屬於這些傳統服務的任何進程在中止後都不會重新啟動。
最後您可能會注意到,與以前的 Solaris 發行版相比,/etc/init.d 和 /etc/rc◆.d 目錄以及 /etc/inittab 文件中的內容現在要少得多。SMF 管理的服務不再使用 rc 腳本或 inittab 條目進行啟動和關閉,因此與這些服務對應的腳本已被刪除。在將來的 Solaris 發行版中,SMF 將管理更多的服務,並且這些目錄中的內容將會越來越少。用於管理 ISV 提供或本地開發的服務的 rc 腳本和 inittab 條目將繼續在引導時運行。與推出 SMF 之前的情況不同,這些服務可能不會在引導過程中的同一時刻運行,但一定不會在引導過程之前運行,因此其非明確依賴的任何服務仍將可用。
服務名稱
Solaris 使用稱為 FMRI(Fault Managed Resource Identifier,故障管理資源標識符)的 URI 字符串來標識為其提供了高級故障和資源管理功能的系統對象。SMF 所管理的服務被分配了前綴為方案名稱 "svc" 的 FMRI 字符串,如以下的 Solaris 服務 syslogd(1M) 示例所示:
◆ svc://localhost/system/system-log:default
◆ svc:/system/system-log:default
◆ system/system-log:default
請注意,SMF 所使用的這些服務 FMRI 有以下三種表示方法:第一種是包含位置路徑(如 "localhost")的絕對路徑;第二種是相對於本地計算機的路徑;第三種僅僅是省略了字符串前綴的服務標識符。本文檔其余部分所介紹的 SMF 管理員工具通常使用第三種形式來描述服務(因為假定這些服務作用於本地服務)。可在多種資源上或跨計算機操作的其他管理工具可能使用其他形式來描述服務。當前 Solaris 發行版中的 SMF 工具只能管理本地主機上的服務。
由於 FMRI 字符串非常長,因此 SMF 工具允許使用縮寫形式的 FMRI。縮寫必須具有唯一性,必須與服務名稱的結尾部分相匹配(但 ":default" 可以省略),並且必須以 "/" 開頭。因此上述 FMRI 可以使用以下縮寫:
◆ system-log:default
◆ system-log
使用這些縮寫時應非常謹慎,因為可能會在包含相同子串的某一點添加新服務(如 "svc:/mysite/system-log:default")。如果使用非唯一的縮寫,SMF 工具將打印警告消息。
Solaris 系統服務的 FMRI 包含一般功能類別,如“應用程序”、“重大事件”、“網絡”、“平台”和“系統”,以及與服務的守護進程或舊的 rc 腳本名稱相似的描述性名稱。svcs(1) 命令將列出計算機上可用的所有活動服務:
% svcs
STATE STIME FMRI
...
online 11:19:35 svc:/network/nfs/status:default
offline 18:20:30 svc:/application/print/rfc1179:default
maintenance 18:20:26 svc:/network/ntp:default
由於服務現在是一級對象,因此 SMF 甚至可以通過使用 svcs(1) 命令的 "-a" 選項提供有關未啟用的服務的信息。
常規任務
SMF 是 Solaris 中一項特別顯著的更改,因為它影響了管理模型。因此,盡管我們鼓勵您閱讀有關 SMF 功能的詳細信息(請參見以下“詳細信息”部分),但您可能還是希望從學習如何執行一些常規系統管理任務開始。
◆啟用和禁用服務
在 Solaris 10 之前的版本中,沒有一個很好的方法來永久禁用 Solaris 中的服務。常用方法是將相應的 rc 腳本重命名為不再執行的名稱,但在下一次系統升級後此更改將會失效。此外,基於 inetd 的服務是通過一種完全不同的方法(即編輯配置文件)啟用和禁用的。在 SMF 下,可以使用 svcadm(1M) 命令配置這兩種類型的服務,並且在計算機升級後這些更改將持續有效。以下是對啟用和禁用某些服務的方式的比較:
--------------------------------------------------------------------------------------------------------
舊方法:mv /etc/rc2.d/S75cron /etc/rc2.d/x.S75cron
SMF 方法:svcadm disable system/cron:default
舊方法:編輯 /etc/inet/inetd.conf,將 finger 行取消注釋
SMF 方法:svcadm enable network/finger:default
--------------------------------------------------------------------------------------------------------
在上述示例中,svcadm 的最後一個參數是服務的 FMRI。
請注意,svcadm 僅用於 SMF 服務,由 rc 腳本控制的傳統服務與在早期發行版中的工作方式相同。
◆停止、啟動和重新啟動服務
過去,服務已由引導時運行的 rc 腳本啟動,並通過 start 參數運行。一些 rc 腳本提供了 stop 選項,少數 rc 腳本還允許使用 restart。在 SMF 中,這些任務都是通過 svcadm(1M) 命令完成的:
--------------------------------------------------------------------------------------------------------
舊方法:/etc/init.d/sshd stop
SMF 方法:svcadm disable -t network/ssh:default
舊方法:/etc/init.d/sshd start
SMF 方法:svcadm enable -t network/ssh:default
舊方法:/etc/init.d/sshd stop; /etc/init.d/sshd start
SMF 方法:svcadm restart network/ssh:default
舊方法:kill -HUP `cat /var/run/sshd.pid`
SMF 方法:svcadm refresh network/ssh:default
-----------------------------------------------------------------------------------------------------------
svcadm enable 和 svcadm disable 的 "-t" 選項表示所請求的操作應該是臨時的 (temporary),它不會影響此服務是否會在系統下一次引導時啟動。這與上述“啟用和禁用服務”示例形成了對比。
與啟用和禁用服務一樣,不應該使用 svcadm 控制由 rc 腳本控制的服務;這些服務將始終按早期發行版中的方式工作。
◆觀察引導過程
如“顯著的更改”部分所述,在缺省情況下,引導過程與早期的 Solaris 發行版相比要精簡得多。這樣就減少了不能提供有價值信息的“無用消息”,這些“無用消息”可能會導致引導期間發生的任何實際問題不容易被發現。
已添加一些新的引導選項,以控制引導的詳細程度。您可能會發現一個特別有用的選項 "-m verbose",該選項在每個服務嘗試啟動時打印一行信息。這與基於 Unix 和與 Unix 相似的某些其他操作系統的缺省引導模式相似。詳細的引導過程如下所示:
{1} ok boot -m verbose
Rebooting with command: boot -m verbose
Boot device: /pci@1c,600000/scsi@2/disk@0,0:a File and args: -m verbose
SunOS Release 5.10 Version Generic 64-bit
Copyright 1983-2004 Sun Microsystems, Inc. All rights reserved.
Use is subject to license terms.
[ network/pfil:default starting (pfil) ]
[ network/loopback:default starting (Loopback network interface) ]
[ system/filesystem/root:default starting (Root filesystem mount) ]
Oct 18 13:53:02/13: system start time was Mon Oct 18 13:52:57 2004
[ network/physical:default starting (Physical network interfaces) ]
[ system/filesystem/usr:default starting (/usr and / mounted read/write) ]
( more service messages elided )
[ system/filesystem/local:default starting (Local filesystem mounts) ]
[ network/ntp:default starting (network time protocol (NTP)) ]
[ system/utmp:default starting (utmpx monitoring) ]
[ system/filesystem/local:default starting (Local filesystem mounts) ]
[ system/console-login:default starting (Console login) ]
demobox console login: checking ufs filesystems
/dev/rdsk/c0t0d0s7: is logging.
Oct 18 13:53:14/50: system/system-log:default starting
Oct 18 13:53:14/51: network/inetd:default starting
Oct 18 13:53:14/52: system/cron:default starting
( more service messages elided )
服務啟動消息的順序在每次引導時可能會有所不同,因為 SMF 將按照服務的相關性關系並行啟動這些服務。
如果服務無法成功啟動,則除了打印啟動消息之外,還會打印警告消息。以下是 NTP 服務無法啟動的一個示例:
[ system/filesystem/local:default starting (Local filesystem mounts) ]
[ network/ntp:default starting (network time protocol (NTP)) ]
Oct 25 13:58:42/49 ERROR: svc:/network/ntp:default:
Method "/lib/svc/method/xntp" failed with exit status 96.
Oct 25 13:58:42 svc.startd[4]: svc:/network/ntp:default:
Method "/lib/svc/method/xntp" failed with exit status 96.
[ network/ntp:default misconfigured (see 'svcs -x' for details) ]
[ system/utmp:default starting (utmpx monitoring) ]
( more service messages elided )
前兩條錯誤消息在正常引導和詳細引導期間都會顯示;最後一條錯誤消息 ("network/ntp:default misconfigured ...") 僅在詳細引導期間顯示。
◆發現故障
Solaris 尚未提供一個全面的用於查找系統服務問題的方法。目前存在一些可幫助捕獲並診斷這些問題的解決方案,包括使用 coreadm(1M) 命令記錄到特定於站點的監視腳本,以及 Sun Cluster 等綜合性產品。新的 svcs(1) 命令包含一個“解釋”選項 ("svcs -x"),可打印出有關未運行服務的詳細消息(由解決方案驅動)。svcs -x 將顯示服務失敗的時間和原因,提供獲取此問題詳細信息的方式,並列出受此問題影響的其他服務。
繼續來看一下無法啟動的 NTP 服務的示例:
# svcs -x
svc:/network/ntp:default (Network Time Protocol (NTP).)
State: maintenance since Mon Oct 18 13:58:42 2004
Reason: Start method exited with $SMF_EXIT_ERR_CONFIG.
See: http://sun.com/msg/SMF-8000-KS
See: ntpq(1M)
See: ntpdate(1M)
See: xntpd(1M)
Impact: 0 services are not running.
NTP 服務已被置於維護模式,因為啟動腳本指示該服務的配置存在問題。有關服務故障的詳細信息,請參見 /var/svc/log 目錄(或 /etc/svc/volatile 目錄)中該服務的日志文件。日志文件名基於簡短形式的 FMRI,將 "/" 替換為 "-"。因此,svc:/network/ntp:default 服務的日志文件為 /var/svc/log/network-ntp:default.log。通過此日志文件可以快速得出結論,即 NTP 守護進程的配置文件 /etc/inet/ntp.conf 已被刪除。
以下是另一個示例,顯示了 SMF 可以跟蹤相關性,並指出與禁用的服務相關的問題。在此示例中,我們使用 "-v" 選項來查看受影響的服務的列表。
# svcs -x -v
svc:/application/print/server:default (LP Print Service)
State: disabled since Mon Oct 18 16:17:27 2004
Reason: Disabled by an administrator.
See: http://sun.com/msg/SMF-8000-05
See: man -M /usr/share/man -s 1M lpsched
Impact: 1 service is not running:
svc:/application/print/rfc1179:default
在以上示例中,已明確禁用了 application/print/server:default 服務,但未禁用依賴於該服務的另一個服務 (application/print/rfc1179:default)。因此,禁用第一個服務已使得第二個服務無法運行。
◆觀察服務
在早期版本的 Solaris 中,查看可用服務的唯一方法是使用 ps(1) 命令,並列出系統上所有的活動進程,然後查看與服務應用程序的名稱相匹配的進程名稱。遺憾的是,由於大多數系統都有許多進程,並且每次發行新版本的 Solaris 以及添加其他軟件包時都會引入新服務,因此使用此方法進行跟蹤非常困難。如今的許多服務已不再作為單個進程執行,這使得情況更加復雜。某些服務作為一系列進程或多線程進程執行,或者同時以這兩種方式執行。