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)
のようにシステムによって編集されます。