StepbystepSMF

Solarisステップbyステップのページに戻る

目次

Table of Contents

SMF(Service Management Facility) Step by Step

1.SMF管理コマンド

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

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

2. Step by Step (Quickstart Guide)

「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)

のようにシステムによって編集されます。