BigAdmin System Administration Portal
在 Solaris 10 作業系統中使用 Service Management Facility (SMF):快速範例
Print-friendly VersionPrint-friendly Version

Don Turnbull,2007 年 4 月


簡介

Service Management Facility 是 Solaris 作業系統中最新納入的整合式模型,可用於服務與服務管理作業。SMF 可讓使用者在啟動及關閉 Solaris 系統期間,能夠更清楚地瞭解受管理之程序的運作情形。此外,透過 SMF 管理的程序可具有相依性,且由於受到監視,而可在程序失敗或不當停止時重新啟動。

SMF 是 Solaris 10 作業系統中的預測自我修復技術的核心部分,可在發生軟硬體失敗與管理錯誤後自動回復。此外,SMF 管理的服務可委託給非超級使用者。最後,SMF 延續了用以啟動與停止服務的舊有方法,不過 /etc/rc 程序檔只要因向下相容性而存在,即可繼續執行。

透過 SMF 部署服務,可提供更為一致而健全的環境。首先,使用者可使用簡單的指令 (svcs -a) 查詢 Solaris 作業系統以判斷服務是否在執行中,而不必嘗試連線而煩惱連線是否會成功。此外,重要服務將可在發生問題時自動重新啟動,例如有人不慎強制結束服務、有錯誤導致記憶體傾印,或有其他程序失敗等。再者,SMF 可提供詳細而一般的記錄以及可靠的錯誤處理,以防止服務在系統狀態變更後當機。如需更多資訊,請參閱 smf(5) 的線上手冊

在一般軟體安裝後,可能會有數個程序必須在系統啟動與關閉期間啟動與停止。此外,這些程序可能彼此相依而且必須受到監視,以便在故障時重新啟動。對每個程序而言,以下是在 SMF 中將其整合為服務時所需執行的合理步驟:

  • 建立服務清單檔案。
  • 建立方法程序檔檔案,以定義服務的啟動、停止與重新啟動方法。
  • 使用 svccfg(1M) 驗證及匯入服務清單。
  • 使用 svcadm(1M) 啟用或啟動服務。
  • 使用 svcs(1) 驗證服務是否在執行中。

以 SAS 程序為例,我們將建立兩項服務,一個用於 SAS Metadata Server (OMR),而另一個用於 SAS Object Spawner。在此範例中,Object Spawner 無法在 OMR 啟動前嘗試啟動,且應在 OMR 停止之前停止。


配置 OMR 服務

步驟 1

根據 smf_method(5) 線上手冊中的說明,建立清單檔案。為了避免混淆,此檔案應存放在應用程式相關檔案的專用目錄中。事實上,服務將會組織到 SMF 內的邏輯資料夾中,因此讓應用程式的相關檔案具有專用資料夾是合理的做法。但是,在 SMF 內並沒有強制執行目錄名稱或位置方面的需求。

在此範例中,OMR 服務會組織到 SMF 中,做為 SAS 應用程式資料夾的一部分。此為邏輯分組方式;並不會有與 SMF 相關聯的實體資料夾 sas 存在。但是,在管理服務時,服務將由 application/sas/metadata 參考。其他與 SAS 相關的程序也可在稍後增加於 application/sas 之下並予以識別。在此範例中所建立的檔案 /var/svc/manifest/application/sas/metadata.xml 應包含下列項目:

<?xml version="1.0"?>
<!DOCTYPE service_bundle
  SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">

<service_bundle type='manifest' name='SAS:Metadata'>
  <service
    name='application/sas/metadata'
    type='service'
    version='1'>
    <create_default_instance enabled='false' />
    <single_instance />

    <dependency
      name='multi-user-server'
      grouping='optional_all'
      type='service'
      restart_on='none'>
        <service_fmri value='svc:/milestone/multi-user-server' />
    </dependency>
    <exec_method
      type='method'
      name='start'
      exec='/lib/svc/method/sas/metadata %m'
      timeout_seconds='60'>
      <method_context>
        <method_credential user='sas' />
      </method_context>
    </exec_method>

    <exec_method
      type='method'
      name='restart'
      exec='/lib/svc/method/sas/metadata %m'
      timeout_seconds='60'>
      <method_context>
        <method_credential user='sas' />
      </method_context>
    </exec_method>

    <exec_method
      type='method'
      name='stop'
      exec='/lib/svc/method/sas/metadata %m'
      timeout_seconds='60' >
      <method_context>
        <method_credential user='sas' />
      </method_context>
    </exec_method>

    <property_group name='startd' type='framework'>
      <propval name='duration' type='astring' value='contract' />
    </property_group>

    <template>
      <common_name>
        <loctext xml:lang='C'>
          SAS Metadata Service
        </loctext>
      </common_name>
      <documentation>
        <doc_link name='sas_metadata_overview' iri=
'http://www.sas.com/technologies/bi/appdev/base/metadatasrv.html'
        />
        <doc_link name='sas_metadata_install' uri=
            'http://support.sas.com/rnd/eai/openmeta/v9/setup' />
      </documentation>
    </template>
  </service>
</service_bundle>

清單檔案中基本上包含兩個附有標記的段落,其中含有多個特性,用以定義程序的啟動、停止與重新啟動方式,並且定義所有相依性。第一個標記 <service_bundle> 可定義服務束的名稱,而這些服務束將用以進行服務分組,以及做為 svcs 指令 (svcssvcmgr 等) 中的部分參數。內部標記 <service> 則定義特定的程序、其相依性,以及操作程序的方式。如需清單檔案格式的更多資訊,請參閱 service_bundle(4) 的線上手冊

步驟 2

建立方法程序檔。此檔案類似於舊版 Solaris 作業系統中所使用的傳統 rc 程序檔。此檔案應為可成功啟動、停止及重新啟動程序的程序檔。此程序檔必須能讓所有可能管理服務的使用者執行,且必須放在清單檔案 exec 特性中所參照的目錄與檔案名稱中。在此範例中,根據步驟 1 中所建置的清單檔案,此程序中的正確檔案為 /lib/svc/method/sas/metadata。如需方法程序檔的更多資訊,請參閱 smf_method(5) 的線上手冊

#!/sbin/sh
# Start/stop client SAS MetaData service
#
.. /lib/svc/share/smf_include.sh
SASDIR=/d0/sas9-1205
SRVR=MSrvr
CFG=$SASDIR/SASMain/"$SRVR".sh

case "$1" in
'start')
        $CFG start
        sleep 2
        ;;
'restart')
        $CFG restart
        sleep 2
        ;;
'stop')
        $CFG stop
        ;;
*)
        echo "Usage: $0 { start | stop }"
        exit 1
        ;;
esac
exit $SMF_EXIT_OK

步驟 3

驗證清單檔案,並將其匯入到 Solaris 服務儲存庫中,以建立 SMF 中的服務,並使服務可用於操作中。下列指令顯示此範例中的清單所使用的正確檔案名稱。

# svccfg
svc:> validate /var/svc/manifest/application/sas/metadata.xml
svc:> import /var/svc/manifest/application/sas/metadata.xml
svc:> quit

步驟 4

使用 svcadm 指令啟用服務。-t 參數可讓您測試暫時性的服務定義。若您要永久變更定義,亦即在重新開機後仍然存在,可以排除 -t 參數。

# svcadm enable -t svc:/application/sas/metadata

步驟 5

驗證服務是否處於線上狀態,並使用 svcs 指令驗證程序已實際執行中。

# svcs -a | grep sas
online  8:44:37 svc:/application/sas/metadata:default

# ps -ef | grep sas
.....
sas 26791  1  0  08:44:36 ?  0:00 /bin/sh /d0/SASMain/MSrvr.sh
.....

配置 Object Spawner 服務

在此範例中,此時將配置 OMR 程序 (上述) 與 Object Spawner 程序。Object Spawner 會相依於 OMR。此文件的後續部分描述如何配置相依的 Object Spawner 程序。

步驟 1

Object Spawner 服務的清單檔案類似於 OMR 服務所使用的清單檔案。其間有些許變更,相依性也有所不同。其差異將以粗體強調顯示,如下所示:

<?xml version="1.0">
<!DOCTYPE service_bundle
  SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">

<service_bundle type='manifest' name='SAS:ObjectSpawner'>
  <service
    name='application/sas/objectspawner'
    type='service'
    version='1'>
    <create_default_instance enabled='false' />
    <single_instance />
    <dependency
      name='sas-metadata-server'
      grouping='optional_all'
      type='service'
      restart_on='none'>
        <service_fmri value='svc:/application/sas/metadata' />
    </dependency>
    <exec_method
      type='method'
      name='start'
      exec='/lib/svc/method/sas/objectspawner %m'
      timeout_seconds='60'>
      <method_context>
        <method_credential user='sas' />
      </method_context>
    </exec_method>

    <exec_method
      type='method'
      name='restart'
      exec='/lib/svc/method/sas/objectspawner %m'
      timeout_seconds='60'>
      <method_context>
        <method_credential user='sas' />
      </method_context>
    </exec_method>

    <exec_method
      type='method'
      name='stop'
      exec='/lib/svc/method/sas/ objectspawner %m'
      timeout_seconds='60' >
      <method_context>
        <method_credential user='sas' />
      <method_context>
    <exec_method>

    <property_group name='startd' type='framework'>
      <propval name='duration' type='astring' value='contract' />
    </property_group>

    <template>
      <common_name>
        <loctext xml:lang='C'>
          SAS Object Spawner Service
        </loctext>
      </common_name>
      <documentation>
        <doc_link name='sas_metadata_overview' iri=
'http://www.sas.com/technologies/bi/appdev/base/metadatasrv.html'
        />
        <doc_link name='sas_metadata_install' uri=
            'http://support.sas.com/rnd/eai/openmeta/v9/setup' />
      </documentation>
    </template>
  </service>
</service_bundle>

步驟 2

建立清單檔案後,請建立程序檔 /lib/svc/method/sas/objectspawner

#!/sbin/sh
# Start/stop client SAS Object Spawner service
#
.. /lib/svc/share/smf_include.sh
SASDIR=/d0/sas9-1205
SRVR=ObjSpa
CFG=$SASDIR/SASMain/"$SRVR".sh

case "$1" in
'start')
        $CFG start
        sleep 2
        ;;
'restart')
        $CFG restart
        sleep 2
        ;;
'stop')
        $CFG stop
        ;;
*)
        echo "Usage: $0 { start | stop }"
        exit 1
        ;;
esac
exit $SMF_EXIT_OK

步驟 3

依照 OMR 服務所使用的相同方式驗證並匯入清單檔案:

# svccfg
svc:> validate /var/svc/manifest/application/sas/objectspawner.xml
svc:> import /var/svc/manifest/application/sas/objectspawner.xml
svc:> quit

步驟 4

依照 OMR 服務所使用的相同方式啟用新的服務:

# svcadm enable -t svc:/application/sas/objectspawner

步驟 5

最後,請依照 OMR 服務所使用的相同方式驗證該服務是否已啟動且在執行中:

# svcs -a | grep sas
online  10:28:39 svc:/application/sas/metadata:default
online  10:38:20 svc:/application/sas/objectspawner:default

# ps -ef | grep sas
.....
sas 26791  1  0  18:44:36 ?  0:00 /bin/sh /d0/SASMain/MSrvr.sh
sas 26914  1  0  18:18:49 ?  0:00 /bin/sh /d0/SASMain/ObjSpa.sh
.....

在實際情況中,SAS 會擁有其他程序,且這些程序會以服務程序做為父系程序。但是,定義為程序之方法程序檔的程序檔若在執行中,表示 svcs -a 的輸出正確無誤;服務正在執行中。


示範 SMF 功能

若要示範服務將依照配置自動重新啟動,請強制結束目前的中介資料伺服器 (PID 26791)。

# kill 26791

ps(1) 指令會顯示先前的中介資料 PID 26791 已不存在,而目前執行的是新的 PID 27035。所有作業皆在沒有使用者介入的情況下重新啟動。

# ps -ef | grep sas
.....
sas 27035  1  0  18:44:36 ?  0:00 /bin/sh /d0/SASMain/MSrvr.sh
sas 26914  1  0  18:18:49 ?  0:00 /bin/sh /d0/SASMain/ObjSpa.sh
.....

假設中介資料伺服器是部署 SAS 9 時不可或缺的元件,SMF 功能將可大幅提升 SAS 應用程式環境的可用性。大部分的應用程式都有類似的情況。透過 SMF,在自動化、監視與管理應用程式的程序時,所需的負擔將可減少,且管理員也不需對 Solaris 作業系統做太多自訂。


Unless otherwise licensed, code in all technical manuals herein (including articles, FAQs, samples) is provided under this License.


BigAdmin