StepbystepSMFのソース

#freeze
[[Solarisステップbyステップのページに戻る>stepbystep]]

目次

#contentsx
----

** SMF(Service Management Facility) Step by Step [#nf50fcc0]

*** 1.SMF管理コマンド [#cb6f6eb6]

SMFは、管理タスクを遂行するためのコマンドを提供しています。
次に、サービスをコントロールするための一般的なコマンドを紹介します。

- svcs   :サービスの状態を読み込み、表示します。
- svcadm :各サービスにに対して、enable,disable,start,stop,restartなど、サービス状態の変更を指示します。  
- svccfg :サービス定義リポジトリのimport, exportや編集を実行します。
- svcprop:サービス定義リポジトリからプロパティの値を読み込み、shell script が使用するためのscriptを出力します。

*** 2. Step by Step (Quickstart Guide) [#y3be8fbf]

「3.SMF管理コマンド」を使用しながらSMFで実行可能なオペレーションおよび
SMFの動作について説明します。


1) SMFの機能によって、停止(kill)されたサービス(プロセス)が、自動的に再起動されることを確認します。

ここでは、'sendmail'を一旦停止させた後、再度プロセスの状態を確認します。

 # ps -fp `pgrep -d, sendmail`
     UID   PID  PPID   C    STIME TTY         TIME CMD
   smmsp   333     1   0   2月 21 ?           0:02 /usr/lib/sendmail -Ac -q15m
    root   334     1   0   2月 21 ?           0:31 /usr/lib/sendmail -bd -q15m
 # pkill -9 sendmail
 # ps -fp `pgrep -d, sendmail`
     UID   PID  PPID   C    STIME TTY         TIME CMD
    root 20092     1   0 13:34:34 ?           0:00 /usr/lib/sendmail -bd -q15m
   smmsp 20093     1   0 13:34:34 ?           0:00 /usr/lib/sendmail -Ac -q15m

~`pkill -9`を実行しプロセスを停止させたにもかかわらず、一見、何も変化が
~起こっていないように見えます。しかし、PIDが異なっていること、STIMEが変更
~されていることから、もともと動作していた古いsendmailプロセスは停止され
~新たに起動されたことがわかります。
~
~これは、'sendmail'がSMFの監視下で動作しているために、自動的に再起動された
~ということです。


2) SMF監視下のサービスを確認します。

svcsコマンドで、server内のすべてのサービスを確認することができます。

 # svcs
 STATE          STIME    FMRI
 legacy_run      2月_21  lrc:/etc/rcS_d/S29wrsmcfg
 legacy_run      2月_21  lrc:/etc/rc2_d/S10lu
 legacy_run      2月_21  lrc:/etc/rc2_d/S20sysetup
 legacy_run      2月_21  lrc:/etc/rc2_d/S40llc2
	・・・ 途中省略 ・・・
 online          2月_21  svc:/system/svc/restarter:default
 online          2月_21  svc:/network/pfil:default
 online          2月_21  svc:/system/filesystem/root:default
 online          2月_21  svc:/network/loopback:default
 online          2月_21  svc:/system/filesystem/usr:default
	・・・ 途中省略 ・・・
 online          2月_28  svc:/network/nfs/status:default
 online          2月_28  svc:/network/nfs/nlockmgr:default
 online         13:34:33 svc:/network/smtp:sendmail
 offline         2月_21  svc:/application/print/ipp-listener:default
 offline         2月_21  svc:/application/print/rfc1179:default


~FMRI(Fault Managed Resource Identifier)
~出力項目右側に表示されているFMRIとは、各サービスの識別子です。
~fault manager内で、fault/errorイベントを伝える目的で使用されます。
~fault managerの命名スキームは、RFC2396で定義されたURI
~(Uniform Resource Identifier)に基づいています。
~
~FMRIが、lrc:xxxとなっているのはSMF管理外のサービス、svc:xxxとなっているのは
~SMF管理下のサービスです。サービスの自動再起動が行われるのは、SMF管理下の
~サービスのみです。

~'sendmail'は、FMRIがsvc:xxxとなっており、SMF管理下のサービスです。
~   => online         13:34:33 svc:/network/smtp:sendmail (表示下から3行目)
~このため、1)でプロセスを停止しても、再起動が実行されたのです。


3) -xオプションを使用すると、SMF管理下のサービスのうち障害が発生しているものを検出することができます。

 # svcs -x
 svc:/application/print/server:default (LP print server)
 状態: 2005年02月21日 (月) 10時12分17秒 以降disabledです
 原因: 管理者が使用不可にしました。
   参照: http://sun.com/msg/SMF-8000-05
   参照: lpsched(1M)
 影響: 2 個の依存サービスが動作していません 

 -x -vを指定すれば、影響を受ける依存サービスのFMRIも確認できます。

 # svcs -x -v
 svc:/application/print/server:default (LP print server)
 状態: 2005年02月21日 (月) 10時12分17秒 以降disabledです
 原因: 管理者が使用不可にしました。
   参照: http://sun.com/msg/SMF-8000-05
   参照: man -M /usr/share/man -s 1M lpsched
 影響: 2 個の依存サービスが動作していません:
        svc:/application/print/rfc1179:default
        svc:/application/print/ipp-listener:default


4) 個別にサービスの状態を確認するには、引数にサービス名を指定します。

 # svcs -x sendmail
 svc:/network/smtp:sendmail (sendmail SMTP mail transfer agent)
 状態: 2005年03月08日 16時14分23秒 以降onlineです 13:34:33
   参照: sendmail(1M)
   参照: /var/svc/log/network-smtp:sendmail.log
 影響: ありません。

5) 4)以外にも、'sendmail'に関連する情報を取得する方法を紹介します。-p オプションを使用すると'sendmail'のservice instanceを確認することができます。

 # svcs -p sendmail
 STATE          STIME    FMRI
 online         13:28:27 svc:/network/smtp:sendmail
                13:28:28    21808 sendmail
                13:28:28    21810 sendmail

6) さらに、-d オプションを使用すれば、'sendmail'とのdependecyを定義されているサービスについて表示します。


 # svcs -d sendmail
 STATE          STIME    FMRI
 online          2月_21  svc:/system/identity:domain
 online          2月_21  svc:/system/filesystem/local:default
 online          2月_21  svc:/milestone/name-services:default
 online          2月_21  svc:/network/service:default
 online          2月_21  svc:/system/filesystem/autofs:default
 online          2月_21  svc:/system/system-log:default


7) 1)では、SMFの機能によって、'sendmail'が自動的に再起動されることを確認しました。それでは、SMF管理下のサービスを停止したり、起動したいときは、どのようにすればいいでしょうか。サービスの状態を変更するときには、svcadmコマンドを使用します。

 # ps -fp `pgrep -d, sendmail`
     UID   PID  PPID   C    STIME TTY         TIME CMD
   smmsp 21766     1   0 13:11:43 ?           0:00 /usr/lib/sendmail -Ac -q15m
    root 21768     1   0 13:11:44 ?           0:00 /usr/lib/sendmail -bd -q15m
 # svcadm disable -t network/smtp:sendmail
 # pgrep -d, sendmail

'sendmail'が停止されました。

'sendmail'を利用可能な状態にします。

 # svcadm enable -t network/smtp:sendmail
 # ps -fp `pgrep -d, sendmail`
     UID   PID  PPID   C    STIME TTY         TIME CMD
   smmsp 21791     1   0 13:27:41 ?           0:00 /usr/lib/sendmail -Ac -q15m
    root 21793     1   0 13:27:41 ?           0:00 /usr/lib/sendmail -bd -q15m

svcadm オプション説明
   disable:サービスを使用不可にしてオフラインにします。
   enable:サービスを使用可能にしてオンラインにします。


8) SMFでは、"Service Manifest"と呼ばれるXMFで記述したファイルに各サービスのプロパティ情報を保持します。ファイルは、/var/svc/manifestに格納されています。manifestは、サービスプロパティ修正の編集ファイルとしては使用されず、管理者がこのxml fileを直接編集することはありません。編集はsvccfgコマンドを使用して、専用の画面で行います。

例として、'sendmail'のService Manifestを参照します。
各項目の定義は、/usr/share/lib/xml/dtd/service_bundle.dtd.1を参照してください。

 # cat /var/svc/manifest/network/smtp-sendmail.xml
 <?xml version="1.0"?>
 <!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
 <!--
        Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
        Use is subject to license terms.
        ident   "@(#)smtp-sendmail.xml  1.11    04/12/16 SMI"
        NOTE:  This service manifest is not editable; its contents will
        be overwritten by package or patch operations, including
        operating system upgrade.  Make customizations in a different
        file.
 -->
 <service_bundle type='manifest' name='SUNWsndmr:sendmail'>
 <service
        name='network/smtp'
        type='service'
        version='1'>
        <single_instance />
        <dependency
            name='fs-local'
            grouping='require_all'
            restart_on='none'
            type='service'>
                <service_fmri value='svc:/system/filesystem/local' />
        </dependency>
	・・・ 途中省略 ・・・
        <stability value='Unstable' />
 </service>
 </service_bundle>


9) svccfgコマンドを利用して、インタラクティブにプロパティの編集を
  行います。まず、現状のサービス設定を読み込みます。

 # svccfg -v import /var/svc/manifest/network/smtp-sendmail.xml
 svccfg: Taking "previous" snapshot for svc:/network/smtp:sendmail.
 svccfg: Upgrading properties of svc:/network/smtp according to instanc "sendmail".
 svccfg: Taking "last-import" snapshot for svc:/network/smtp:sendmail.
 svccfg: Refreshed svc:/network/smtp:sendmail.
 svccfg: Refreshed dependent svc:/milestone/multi-user:default.
 svccfg: Refreshed svc:/milestone/multi-user.
 svccfg: Successful import.



10) 現在の設定状態を表示、確認します。

 # svccfg


svc:> プロンプトが表示されるので、編集対象となるサービスを指定します。

 svc:> select network/smtp:sendmail


listpropで現在の設定状態を表示、確認します。

 svc:/network/smtp:sendmail> listprop
 config-file                          dependency
 config-file/entities                 fmri     file://localhost/etc/mail/sendmail.cf
 config-file/grouping                 astring  require_all
 config-file/restart_on               astring  refresh
 config-file/type                     astring  path
 nsswitch                             dependency
	・・・ 途中省略 ・・・
 start                                method
 start/exec                           astring  "/lib/svc/method/smtp-sendmail  start"
 start/timeout_seconds                count    120
 start/type                           astring  method
 stop                                 method
 stop/exec                            astring  "/lib/svc/method/smtp-sendmail  stop %{restarter/contract}"
 stop/timeout_seconds                 count    60
 stop/type                            astring  method
	・・・ 途中省略 ・・・
 general_ovr/enabled                  boolean  true
 restarter_actions                    framework  NONPERSISTENT
 restarter_actions/restart            integer 
 restarter_actions/refresh            integer 


11) 編集モードに入ります。

 svc:/network/smtp:sendmail> editprop


エディタが開かれ、編集可能な状態になります。
エディタは、環境変数EDITORで指定されたものがデフォルトになります。

以下は、編集画面です。

 select svc:/network/smtp:sendmail
 
 # Property group "config-file"
 # delprop config-file
 # addpg config-file dependency
 # setprop config-file/entities = fmri: (file://localhost/etc/mail/sendmail.cf)
 # setprop config-file/grouping = astring: (require_all)
 # setprop config-file/restart_on = astring: (refresh)
 # setprop config-file/type = astring: (path)
	・・・ 途中省略 ・・・
 # Property group "start"
 # delprop start
 # addpg start method
 # setprop start/exec = astring: ("/lib/svc/method/smtp-sendmail start")
 # setprop start/timeout_seconds = count: (120)
 # setprop start/type = astring: (method)
 # Property group "stop"
 # delprop stop
 # addpg stop method
 # setprop stop/exec = astring: ("/lib/svc/method/smtp-sendmail stop %{restarter/contract}")
 # setprop stop/timeout_seconds = count: (60)
 # setprop stop/type = astring: (method)
	・・・ 途中省略 ・・・
 # setprop general_ovr/enabled = boolean: (true)
 # Property group "restarter_actions"
 # delprop restarter_actions
 # addpg restarter_actions framework
 # setprop restarter_actions/restart = integer: ()
 # setprop restarter_actions/refresh = integer: ()



12) 編集方法
  修正したいプロパティを記述した行の'#'をはずした後、設定値を
  変更します。
  <例>
  'start/timeout_seconds'のcountを120 => 180に変更します。

<変更前>
 # setprop start/timeout_seconds = count: (120)
<変更後>
 setprop start/timeout_seconds = count: (180)


変更、保存後、svccfgを終了します。

 svc:/network/smtp:sendmail> exit

13) 変更した定義を読み込ませます。

 # svcadm refresh sendmail

14) 変更した定義でサービスを'restart'させます。

 # svcadm restart sendmail 

15) 12)で修正したservice configuration propertiesを読み込みます。

 # svcprop /network/smtp:sendmail
 config-file/entities fmri file://localhost/etc/mail/sendmail.cf
 config-file/grouping astring require_all
 config-file/restart_on astring refresh
 config-file/type astring path
 nsswitch/entities fmri file://localhost/etc/nsswitch.conf
 nsswitch/grouping astring require_all
 nsswitch/restart_on astring refresh
	・・・ 途中省略 ・・・
 start/exec astring /lib/svc/method/smtp-sendmail\ start
 start/timeout_seconds count 180 ===> 値が変更されています。
 start/type astring method        ~~~~~~~~~~~~~~~~~~~
 stop/exec astring /lib/svc/method/smtp-sendmail\ stop\ %{restarter/contract}
 stop/timeout_seconds count 60
 stop/type astring method
	・・・ 途中省略 ・・・
 restarter/state astring online
 restarter/state_timestamp time 1110177870.202081000
 general_ovr/enabled boolean true
 restarter_actions/refresh integer 
 restarter_actions/restart integer 


16) また、-pオプションで、変更した該当のプロパティのみ確認することも可能です。

 # svcprop -p start/timeout_seconds network/smtp:sendmail
 180


以上が、一連の編集作業手順です。

なお、上記編集作業を行っても"Service Manifest"(この例では、
/var/svc/manifest/network/smtp-sendmail.xml)は、変更されません。
また、次回同様の手順でsvccfg/editpropでプロパティの編集画面をエディタで
開いた場合、修正した行の変更値はそのままですが、行頭に'#'が付加されて
 # setprop start/timeout_seconds = count: (180)
のようにシステムによって編集されます。