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