Solaris 10引入全新的後臺服務管理機制,該機制被稱爲SMF,它包含了新的概念、管理工具和服務定義方式。好比用里程碑(milestone)代替了運行級別的概念;用服務配置庫代替分散在/etc/rcx.d目錄的服務啓動腳本。
SMF相對於傳統的Unix後臺服務管理機制具有如下突出的功能:
1. 恢復由軟件故障、硬件故障、管理錯誤終止的服務
2. 服務之間能夠定義依賴關係
3. 服務能夠有多個實例
3. 提供了比較全面基於命令行管理工具
4. 根據依賴關係能夠併發啓動服務,加快系統啓動的速度
5. 引入服務配置庫,提供服務配置庫快照、備份、恢復功能
這些功能方便了服務的管理,服務的可用性。SMF提供了必定程度的服務自愈性,它也是Solaris 10系統可預測自愈功能(Predictive Self-Healing)的一部分。
SMF組成要素
SMF包含兩個進程、服務定義的manifest和profile、服務配置庫和命令行管理工具等內容:
1. svc.startd, svc.configd
2. manifest, profile
3. repository(sqlite db)
4. CLI mgmt tool (svccfg, svcadm, svcprop, svcs, inetadm, inetconv, repoistory_restore)
svc.startd是SMF的主要進程,它根據系統管理員指令或者系統故障或應用故障來啓動、中止、重啓服務。
svc.configd是負責管理服務配置庫的進程。SMF命令行工具svccfg, svcprop, svcs, svcadm經過該進程訪問服務配置庫。
服務和服務的實例能夠用xml文件定義,manifest定義服務,profile定義服務實例,這些xml文件一般存放在/var/svc目錄下。
服務配置庫存放在/etc/svc/repository.db文件中。服務配置庫其實是一個sqlite的關係數據庫,它存放了服務的定義、配置等信息。
/var/svc目錄下的manifest和profile文件和/etc/svc/repository.db文件都包含了服務的定義、配置等信息,後者的信息是權威的。
使用svccfg import命令可將SMF服務的manifest xml文件導入到repository中;
使用svccfg export命令可將repository中SMF服務的manifest信息導出到xml文件;
使用svccfg apply命令可將SMF服務的profile xml文件導入到repository中;
使用svccfg etract命令可將repository中SMF服務的profile信息導出到xml文件。
SMF中的服務
服務和服務實例
SMF中的服務能夠有多個實例,服務實例繼承服務的屬性。
SMF中的服務命名
SMF中的服務命名方式和傳統的Unix中的後臺進程的命名方式有很大的差異,SMF服務名稱是用FMRI(Fault Managed Resouce Identifier)表示的,FMRI是基於URI規範資源命名方式在Solaris系統的一個應用。對於SMF服務,其格式是:
scheme:/category1/category2.../categoryn/service[:instance]
scheme有svc和lrc,lrc沒有實例名。
svc模式的FMRI表示SMF服務,而lrc模式的FMRI表示舊的基於rc腳本的服務。
用svcs -a能夠列出當前全部的服務:
STATE STIME FMRI
legacy_run 1:58:26 lrc:/etc/rcS_d/S50sk98sol
legacy_run 1:58:50 lrc:/etc/rc3_d/S50apache
legacy_run 1:58:51 lrc:/etc/rc3_d/S75seaport
legacy_run 1:58:55 lrc:/etc/rc3_d/S76snmpdx
legacy_run 1:58:57 lrc:/etc/rc3_d/S90samba
...
disabled 1:58:06 svc:/network/iscsi_initiator:default
disabled 1:58:06 svc:/system/metainit:default
disabled 1:58:07 svc:/network/ipfilter:default
disabled 1:58:08 svc:/network/rpc/keyserv:default
disabled 1:58:08 svc:/network/rpc/nisplus:default
disabled 1:58:08 svc:/network/nis/client:default
disabled 1:58:08 svc:/network/dns/client:default
disabled 1:58:08 svc:/network/ldap/client:default
disabled 1:58:09 svc:/network/nfs/cbd:default
disabled 1:58:09 svc:/network/nfs/mapid:default
...
online 1:58:06 svc:/system/svc/restarter:default
online 1:58:08 svc:/network/pfil:default
online 1:58:10 svc:/network/loopback:default
online 1:58:11 svc:/milestone/name-services:default
online 1:58:12 svc:/system/filesystem/root:default
online 1:58:14 svc:/system/boot-archive:default
online 1:58:15 svc:/network/physical:default
online 1:58:15 svc:/milestone/network:default
online 1:58:20 svc:/application/print/cleanup:default
online 1:58:21 svc:/system/picl:default
online 1:58:21 svc:/system/sysevent:default
online 1:58:21 svc:/system/device/fc-fabric:default
online 1:58:22 svc:/milestone/devices:default
online 1:58:28 svc:/system/sysidtool:net
online 1:58:30 svc:/system/sysidtool:system
online 1:58:30 svc:/network/nfs/status:default
online 1:58:45 svc:/network/ssh:default
...
第三列FMRI就是服務名稱。上述輸出中顯示了在Solaris 10中捆綁的Samba、Apache 1.3.x服務名稱,因爲它們仍然沿用了rc腳本的啓動方式,因此它們的名稱是以lrc開頭的,這類服務沒法用svcadm來管理。好比試圖運行命令svcadm enable lrc:/etc/rc3_d/S90samba,系統會報錯。上述輸出中顯示了ssh服務的服務名爲svc:/network/ssh:default。
用FMRI表示的服務名稱能夠惟一地標識一個服務,可是名稱一般都比較冗長,不便記憶。因此SMF容許服務名稱的縮寫,只要能夠惟一標識服務,scheme,instance,category均可以省。因此ssh服務的名稱能夠簡寫成ssh。簡寫的服務名在SMF的命令行工具中均可以使用。
使用FMRI方法命名服務後使得原先的服務名稱發生了變化,但經過如下方法能夠找SMF服務的名稱
1. 猜想法,根據該服務的關鍵詞得一個可能的服務名(guess_service_name),如Apache web服務能夠用apache,NFS文件服務能夠用nfs。 而後用svcs -a |grep guess_service_name。
2. 查看該服務所屬應用的文檔。
如下是常見服務的名稱
服務 最簡縮寫 FMRI
sshd ssh svc:/network/ssh:default
cron cron svc:/system/cron:default
automount autofs svc:/system/filesystem/autofs:default
Apache2 apache2 svc:/system/filesystem/autofs:default
sendmail sendmail svc:/network/smtp:sendmail
nfs nfs/server svc:/network/nfs/server:default
管理SMF服務
管理SMF服務包括配置、查看、啓用/禁用、啓動/中止服務等任務。這些任務分別能夠用svccfg, svcs, svcadm命令完成。
svccfg命令
svccfg命令用來管理SMF repository。運行不帶參數的svccfg命令進入一個交互式的shell,在該shell裏能夠對服務、服務實例進行配置、導入、導出、備份、恢復操做。
#TODO:增長使用svccfg shell的例子。
最經常使用的操做是新增一個SMF服務時導入該服務的manifest文件,可使用svccfg import 的方法。使用svccfg import時要注意在目前版本的Solaris中(版本小於等於Solaris 10 1/06 ),若是manifest xml文件語法有錯,該命令不會報告xml文件出錯的具體位置,只會報一個籠統的錯誤信息。例如,postfix.xml文件的service元素沒有閉合,運行如下命令:
-bash-3.00# svccfg -v import postfix.xml
svccfg: couldn't parse document
會報沒法解析文檔的錯誤。所以,編寫完manifest xml文件應當驗證一下文件的有效性。
svcs命令
svcs用於查看服務的狀態,
svcs -a用於查看全部狀態的服務
svcs -x用於查看未正常啓動的服務
svcs -l 用於查看單個服務的詳細信息
svcadm命令
svcadm用來啓用/禁用、啓動/中止SMF服務。
svcadm enable fmri -- 啓用一個SMF服務,同時運行該服務
svcadm disable fmri -- 禁用一個SMF服務,同時中止該服務
svcadm restart fmri -- 重啓一個SMF服務
svcadm refresh fmri -- 刷新一個SMF服務,至關於讓服務從新載入配置文件
svcadm mark fmri -- 將SMF服務標記爲維護狀態
svcadm clear fmri -- 清除SMF服務的維護狀態
svcadm milestone milestone -- 進入指定的服務里程碑,至關於進入相應的運行級別
若是不指定參數,svcadm將輸出該命令的使用方法。
如:
-bash-3.00# svcadm
Usage: svcadm [-v] [cmd [args ... ]]
svcadm enable [-rst] ... - enable and online service(s)
svcadm disable [-st] ... - disable and offline service(s)
svcadm restart ... - restart specified service(s)
svcadm refresh ... - re-read service configuration
svcadm mark [-It] ... - set maintenance state
svcadm clear ... - clear maintenance state
svcadm milestone [-d] - advance to a service milestone
Services can be specified using an FMRI, abbreviation, or fnmatch(5)
pattern, as shown in these examples for svc:/network/smtp:sendmail
svcadm svc:/network/smtp:sendmail
svcadm network/smtp:sendmail
svcadm network/*mail
svcadm network/smtp
svcadm smtp:sendmail
svcadm smtp
svcadm sendmail
SMF服務排錯
使用svcs -xv能夠查找未正常啓動的服務。SMF對每一個服務實例都在/var/svc/log目錄建立了一個和服務FMRI對應的日誌文件,好比apache2服務的FMRI爲svc:/network/http:apache2,那麼apache2服務狀態變化的日誌存放在名爲network-http:apache2.log的文件中,
如運行如下命令
-bash-3.00# ls -l /var/svc/log |grep network
-rw-r--r-- 1 root root 534 Feb 9 00:08 milestone-network:default.log
-rw-r--r-- 1 root root 77 Jan 30 15:25 network-dns-client:default.log
-rw-r--r-- 1 root root 169 Jan 30 15:27 network-dns-server:default.log
-rw-r--r-- 1 root root 803 Feb 13 01:17 network-http:apache2.log
-rw-r--r-- 1 root root 2843 Jan 30 15:30 network-inetd-upgrade:default.log
-rw-r--r-- 1 root root 2929 Feb 12 01:58 network-inetd:default.log
-rw-r--r-- 1 root root 2835 Feb 12 01:58 network-initial:default.log
-rw-r--r-- 1 root root 77 Jan 30 15:25 network-ipfilter:default.log
-rw-r--r-- 1 root root 77 Jan 30 15:25 network-iscsi_initiator:default.log
輸出的第四行列出了apache2服務的日誌文件名。經過查看這些文件能夠得到服務未正常啓動的線索。
SMF中的inetd服務
SMF包含了對inetd服務管理,除了標準的svccfg, svcadm, svcs命令外,SMF還提供了inetadm和inetconv專門管理inetd服務。inetadm命令用來查看、啓用/禁用、修改inetd服務,inetconv則是用來將舊的inetd服務配置轉化成SMF規範的服務。經常使用的inetadm選項以下
inetadm -e fmri 啓用指定的inetd服務
inetadm -d fmri 禁用指定的inetd服務
inetadm -l fmri 列出指定inetd服務的屬性
inetadm -p 列出默認inetd服務的屬性
若是不指定參數inetadm將列出當前系統全部的inetd服務。如:
-bash-3.00# inetadm
ENABLED STATE FMRI
enabled online svc:/application/x11/xfs:default
enabled online svc:/application/font/stfsloader:default
enabled offline svc:/application/print/rfc1179:default
enabled online svc:/network/rpc/mdcomm:default
enabled online svc:/network/rpc/meta:default
enabled online svc:/network/rpc/metamed:default
enabled online svc:/network/rpc/metamh:default
enabled online svc:/network/rpc/gss:default
disabled disabled svc:/network/rpc/ocfserv:default
enabled online svc:/network/rpc/smserver:default
disabled disabled svc:/network/rpc/rex:default
enabled online svc:/network/rpc/rstat:default
enabled online svc:/network/rpc/rusers:default
disabled disabled svc:/network/rpc/spray:default
...
查看telnet服務的狀態:
-bash-3.00# inetadm |grep telnet
enabled online svc:/network/telnet:default
禁用telnet服務
-bash-3.00# inetadm -d telnet
查看telnet服務的狀態:
-bash-3.00# inetadm |grep telnet
disabled disabled svc:/network/telnet:default
SMF兼容舊的rc機制,solaris 10 2006 update 1版本中有些服務仍然使用了舊的rc機制,以運行級別三的服務爲例,尚有如下服務未使用SMF:
-bash-3.00# ls -l /etc/rc3.d
total 30
-rw-r--r-- 1 root sys 1285 Jan 22 2005 README
-rwxr--r-- 6 root sys 474 Jan 22 2005 S16boot.server
-rwxr--r-- 6 root sys 1649 Jan 8 2005 S50apache
-rwxr-xr-x 1 root sys 491 Jan 8 2005 S75seaport
-rwxr--r-- 6 root sys 685 Jan 22 2005 S76snmpdx
-rwxr--r-- 6 root sys 1125 Jan 22 2005 S77dmi
-rwxr--r-- 6 root sys 512 Jan 22 2005 S81volmgt
-rwxr-xr-x 5 root sys 2225 Jan 8 2005 S82initsma
-rwxr--r-- 5 root sys 824 May 27 2004 S84appserv
-rwxr--r-- 6 root sys 324 Apr 20 2005 S90samba
其中S90samba,S50apache,S84appserv的存在代表Samba, Apache, Sun Application Server服務已啓用。
總結
SMF提供了一個健壯的、可管理的後臺服務管理機制,它使系統管理更爲方便。在下一篇裏做者將結合實例討論將建立SMF服務的方法和步驟。
相關的手冊
smf(5), svcadm(1M), svccfg(1M), inetadm(1M), svcs(1), svcprop(1), inetconv(1M)
相關的文件和目錄
/etc/svc -- 存放SMF服務配置庫
/var/svc/manifest -- 存放SMF服務manifest xml文件
/var/svc/profile -- 存放SMF服務profile xml文件
/var/svc/log -- 存放SMF服務狀態變化日誌
/lib/svc/method -- 存放SMF服務啓動腳本
/lib/svc/seed -- 存放SMF服務配置庫的出廠設置web