Skip to main content

スポンサードリンク

Solaris10 サービス管理機能(従来方式ならびにSMF)について

Posted in

1.概要
Solaris10では、SMF(Service Management Facility)というサービス管理機能が導入されました。
Solaris10では、多くのサービスが、SMF管理下になっています。
SMF管理下にあるサービスの状態を監視したり、管理したりするためには、SMFについての知識が必須です。

以下、Solaris10での、従来のサービス管理メカニズムとの互換性、ならびに、Solaris10で導入されたSMFについて説明します。

2.従来のサービス管理メカニズムとの互換性
2.1.概要
従来システムでは、/etc/inittab、/etc/rc?.d、/etc/inet/inetd.confのような設定ファイル、実行制御スクリプトを用いて、ランレベルを基本としたサービスの管理を行っていました。

Solaris10での、従来のサービス管理メカニズムとの互換性は以下のとおりです。
・ランレベル
 Solaris10でも、8つ(0,1,2,3,5,6,S)のランレベルがあります。
・ /etc/inittab
 互換性があります。ただし、inittabに追加されたサービスは、SMFサービスの後に実行されることに注意が必要です。
・/etc/rc?dのinitスクリプト
 互換性があります。ただし、これらのinitスクリプトは、SMFサービスの後に実行されるようですので、他SMFサービスとの依存関係には注意が必要です。
・inetd.conf
 これは、もはや使用されません。追加されたinetd.confの内容は、後述するinetconvで、SMFに変換が必要です。

従来のサービス管理メカニズムで起動されたサービスも、SMFでサービスの状態を表示できますが、他の変更はできません。

2.2. /etc/inittab
initデーモンは、inittabファイルから情報を読み取って、プロセスを起動します。
inittabファイルには、以下の情報が定義されています。
・起動・監視するプロセス、および停止時に再起動するプロセス
・システムが新しいランレベルに移行したときに行う処理

2.3. /etc/rc?.d
(1)概要
ランレベルを移行する場合、各ランレベルに対応する実効制御スクリプトを実行します。それらは、/sbinディレクトリにある、rc?(?=0,1,2,3,5,6,S)スクリプトです。
/sbinディレクトリ内の各rcスクリプトには、/etc/rc?.d(?=0,1,2,3,5,6,S)という名前のディレクトリが対応しており、その中にはそのランレベルの処理を実行するスクリプトが格納されています。
例えば、/etc/rc2.d/ディレクトリには、ランレベル2のプロセスを起動・停止するためのスクリプトがあります。

/etc/rc?.d内のスクリプトは、スクリプト名をASCII文字列としてソートした順に実行されます。
スクリプト名は、S+数字2桁で始まるか,K+数字2桁で始まるように、名前をつけます。
名前がKで始まるスクリプトを実行すると、サービスが停止(Kill)します。
名前がSで始まるスクリプトを実行すると、サービスが起動します。

(2)実効制御スクリプトの追加方法
実効制御スクリプトの実体は、/etc/init.dディレクトリにあります。スクリプトをここに追加します。
次に、適切な/etc/rc?.dディレクトリへのリンクを作成します。

# cd /etc/init.d
# ln filename /etc/rc?.d/Snnfilename
# ln filename /etc/rc?.d/Knnfilename

 

(3)実行制御スクリプトの無効化方法
 ファイルネームの先頭に下線(_)を付けることによって行います。

# cd /etc/rc.?
# mv filename _filename

 

 (4)サービスの起動・停止方法
実効制御スクリプトを用いてのサービスの起動・停止方法は以下のようになります。
・停止

# /etc/init.d/filename stop
 

・起動

# /etc/init.d/filename start

 

3.SMF(Service Management Facility)
3.1SMFの特徴
SMFの特徴は、以下のとおりです。

・サービスの監視、管理を、一貫したやり方で行える
 サービスの有効化、無効化、再起動等を、一貫したコマンドで行えます。

・サービス間の依存関係を記述できる
 依存関係の順番にサービスを起動します。
 依存関係のない複数のサービスを並行起動し、大規模システムでのブートを迅速化します。

・サービスの自動再起動
 管理エラー、ソフトウェアのバグ、修復不可能なハードウェアエラーなどの原因によって失敗したサービスを、依存関係の順番に自動的に再起動します。

・サービス構成リポジトリ
 サービス構成は、サービス構成リポジトリと呼ばれるデータベースに格納されます。サービス構成リポジトリに対する操作は、必ずコマンドによって行うことになり、リポジトリファイルを直接編集することはできません。

・ルート以外のユーザーに対して管理者がタスクを安全に委譲する機能
 RBAC(Role Base Access Control)権利プロファイルを使用してルート以外のユーザーに対して一部のSMFサービスの管理を許可することができます。

3.1サービス識別子
まず、サービスインスタンスを指定するために用いるサービス識別子について説明します。
各サービスインスタンスの名前は、障害管理リソース識別子(FMRI : Fault-Managed Resource Identifier)によって付けられます。
FMRIは、プレフィックス:サービス名:サービスインスタンス名という構成になっています。

・SMFサービスの場合
 プレフィックスはsvcとなります。
 例えば、rloginサービスのFMRIは、svc:/network/login:rloginとなります。
 network/loginはサービスを、rloginはサービスインスタンスをそれぞれ示します。
 また、通常、サービス名には一般的な機能カテゴリが含まれます。カテゴリには、以下のものがあります。
  application,device,milestone,network,platform,site,system

・inetdサービスの場合
 /etc/inetd.confに示されたサービスをSMFに変換したinetdサービスの構文は次のようになります。
 svc:network/service-name/protocol


 また、rpcプロトコルを使用するサービスの構文は次のようになります。
 svc:network/rpc-service-name/rpc_protocol
 ここで、service-name,protocol は、各々、/etc/inetd.confに定義されている名前、使用されるプロトコルです。
 例えば、cvspserverサービスのFMRIは、svc:/network/cvspserver/tcp:defaultとなり、rpc 100068/2-5サービスのFMRIは、svc:/network/rpc-100068_2-5/rpc_udp:defaultとなります。

・従来サービスの場合
 従来のinit.dスクリプトは、プレフィックスがlrcとなります。
 例えば、/etc/rc2.d/S73cachefs.daemonスクリプトのFMRIは、lrc:/etc/rc2_d/S73cachefs_daemonとなります。サービスインスタンス部はありません。

・マイルストンサービスの場合
マイルストンサービスとは、システムのランレベルに対応するサービスです。
以下のような関係があります。
ランレベル SMFマイルストン
S      svc:/milestone/single-user:default
2      svc:/milestone/multi-user:default
3      svc:/milestone/multi-user-server:default
これらのサービスは、サービスの依存関係の記述によって、事前に起動すべきサービスを規定します。それらのサービスが起動した後、対応するランレベルのinitスクリプトを実行することになります。

・省略形
 利用するコマンドによっては、省略形のFMRIを使用できる場合があります。
  例えば、svcsコマンドでは、svc:/network/smtp:sendmailのFMRIに対して、以下の省略形を使用できます。
 sendmail
 :sendmail
 smtp
 smtp:sendmail
 network/smtp

3.2. サービスインスタンスの状態表示
(1)svcsコマンドによる、サービスインスタンスの状態表示
 svcsコマンドを利用すると、inetdによって制御されるサービスも含めて、その状態を表示できます。
 svcsコマンドでは、STATE(サービスインスタンスの状態)、STIME(開始時刻)、およびFMRIを表示します。 

 STATEは、以下のいずれかになります。
 ・degrated - 有効だが、限られた能力で実行している
 ・disabled - 無効で、実行されていない
 ・legacy_run - 従来のサービス
 ・maintenance - 管理者が解決しなければならないエラーが発生
 ・offline - 有効だが、実行されていないか、利用できる状態にない
 ・uninitialized - すべてのサービスの構成が読み込まれる前の初期状態

  ・有効化されているサービスインスタンスのリスト
  $ svcs
  例)

$ svcs
  STATE          STIME    FMRI
  legacy_run      8:49:36 lrc:/etc/rc2_d/S10lu
  legacy_run      8:49:37 lrc:/etc/rc2_d/S20sysetup
  ...
  legacy_run      8:49:45 lrc:/etc/rc3_d/S90samba
  online          8:48:56 svc:/system/svc/restarter:default
  online          8:49:01 svc:/milestone/name-services:default
  ...
  online          8:49:46 svc:/system/zones:default
  offline         8:49:06 svc:/application/print/ipp-listener:default
  offline         8:49:31 svc:/application/print/rfc1179:default

 

  ・全て(無効化されているものを含む)のサービスインスタンスのリスト
  $ svcs -a
  例)

$ svcs -a
  STATE          STIME    FMRI
  legacy_run      8:49:36 lrc:/etc/rc2_d/S10lu
  legacy_run      8:49:37 lrc:/etc/rc2_d/S20sysetup
  ...
  legacy_run      8:49:45 lrc:/etc/rc3_d/S90samba
  disabled        8:48:57 svc:/system/metainit:default
  disabled        8:48:57 svc:/platform/sun4u/mpxio-upgrade:default
  ...
  disabled        8:49:31 svc:/network/apocd/udp:default
  online          8:48:56 svc:/system/svc/restarter:default
  online          8:49:01 svc:/milestone/name-services:default
  ...
  online          8:49:46 svc:/system/zones:default
  offline         8:49:06 svc:/application/print/ipp-listener:default
  offline         8:49:31 svc:/application/print/rfc1179:default

 

  ・サービスおよび、サービスインスタンスの詳細情報
  $ svcs -l FMRI
  例)

$ svcs -l svc:/network/smtp:sendmail
fmri         svc:/network/smtp:sendmail
name         sendmail SMTP mail transfer agent
有効         true
状態         online
next_state   none
state_time   2005年04月06日 (水) 08時49分36秒
logfile      /var/svc/log/network-smtp:sendmail.log
リスタータ   svc:/system/svc/restarter:default
contract_id  47
dependency   require_all/refresh file://localhost/etc/mail/sendmail.cf (online)
dependency   require_all/refresh file://localhost/etc/nsswitch.conf (online)
dependency   optional_all/none svc:/system/filesystem/autofs (online)
dependency   require_all/none svc:/system/filesystem/local (online)
dependency   require_all/none svc:/network/service (online)
dependency   require_all/refresh svc:/milestone/name-services (online)
dependency   optional_all/refresh svc:/system/identity:domain (online)
dependency   optional_all/none svc:/system/system-log (online)

 

 ・失敗しているあるいは、他のサービス実行を妨げているサービスインスタンスの説明
  $ svcs -x
  例)

$ svcs -x
svc:/application/print/server:default (LP print server)
 状態: 2005年04月06日 (水) 08時49分05秒 以降disabledです
原因: 管理者が使用不可にしました。
   参照: http://sun.com/msg/SMF-8000-05
   参照: lpsched(1M)
影響: 2 個の依存サービスが動作していません (表示するには、-v を使用)。

 

 ・依存関係の表示
  FMRIが依存しているサービスインスタンスの表示
  $ svcs -d FMRI
  例)

$ svcs -d svc:/milestone/multi-user:default
STATE          STIME    FMRI
online          8:49:01 svc:/milestone/name-services:default
online          8:49:14 svc:/milestone/single-user:default
online          8:49:15 svc:/system/filesystem/local:default
online          8:49:23 svc:/network/rpc/bind:default
online          8:49:24 svc:/milestone/sysconfig:default
online          8:49:26 svc:/network/inetd:default
online          8:49:26 svc:/system/utmp:default
online          8:49:33 svc:/network/nfs/client:default
online          8:49:35 svc:/system/system-log:default
online          8:49:36 svc:/network/smtp:sendmail

 

  FMRIに依存しているサービスインスタンスの表示
$ svcs -D FMRI
  例)

$ svcs -D svc:/milestone/multi-user:default
STATE          STIME    FMRI
disabled        8:49:00 svc:/network/dhcp-server:default
online          8:49:45 svc:/milestone/multi-user-server:default

 

 ・svcsコマンドのその他のオプション
  -v :より多くの情報の表示
  -p :プロセス情報の表示

(2)inetadmコマンドによる、inetdによって制御されるサービスインスタンスの状態表示
inetadmコマンドを用いると、inetdによって制御されるサービスインスタンスの状態表示を行うことができます。
例)

# inetadm
ENABLED   STATE          FMRI
enabled   online         svc:/network/rpc/gss:default
...
disabled  disabled       svc:/network/rpc/rex:default
...
enabled   offline        svc:/application/print/rfc1179:default
...
enabled   online         svc:/network/cvspserver/tcp:default

 

3.2. サービスインスタンスの管理
 ・サービスインスタンスの有効化
サービスが一旦有効になると、そのサービスの依存関係に問題がない限り、その有効な状態はシステムのブート後も維持されます。
ただし、-tオプションを付けると、システムブートまでの一時的な期間だけ、有効化します。
#svcadm enable FMRI
例)

# svcs sendmail
STATE          STIME    FMRI
disabled       12:06:02 svc:/network/smtp:sendmail
# svcadm enable sendmail
# svcs sendmail
STATE          STIME    FMRI
online         12:08:01 svc:/network/smtp:sendmail

 

 ・サービスインスタンスの無効化
サービスが一旦無効になると、その無効な状態はシステムのブート後も維持されます。
ただし、-tオプションを付けると、システムブートまで、一時的に無効化します。
#svcadm disable FMRI
例)

# svcs sendmail
STATE          STIME    FMRI
online         12:08:01 svc:/network/smtp:sendmail
# svcadm disable sendmail
# svcs sendmail
STATE          STIME    FMRI
disabled       12:09:07 svc:/network/smtp:sendmail

 

 ・サービスインスタンスの再起動
#svcadm restart FMRI
例)

# svcs sendmail
STATE          STIME    FMRI
online         12:22:05 svc:/network/smtp:sendmail
# svcadm restart sendmail
# svcs sendmail
STATE          STIME    FMRI
online         12:22:31 svc:/network/smtp:sendmail

(開始時刻が更新されています。)

 

3.3. その他のサービス構成リポジトリの管理
・マニフェスト(xml形式で記述されたサービス構成目録)
 マニフェストからリポジトリへのインポート
 # svccfg import マニフェストファイル
 リポジトリからマニフェストへのエクスポート
 # svccfg export FMRI

・プロファイル(デフォルト状態で、どのサービスを有効にするか等を記述したファイル)
 プロファイルの抽出
 # svccfg extract
 プロフィルの適用
 # svccfg apply プロファイルファイル

・サービスインスタンスのプロパティの編集
1)svccfgコマンドを使用する
例)

#svccfg
svc:> select network/http:apache2
svc:/network/http:apache2> editprop

ここでエディタが起動するので、内容を編集する。

2)inetadmコマンドを使用する
inetdによって制御されるサービスインスタンスの場合には、inetadm -mコマンドが利用できる。
例)

# inetadm -l telnet:default | grep tcp_trace
default  tcp_trace=FALSE
# inetadm -m svc:/network/telnet:default tcp_trace=TRUE
# inetadm -l telnet:default | grep tcp_trace
         tcp_trace=TRUE

 

・inetd.confの変換
inetconvコマンドによって、inetd.confのエントリを、SMFのマニフェストに変換し、リポジトリへインポートします。
例)

# inetconv -i /etc/inet/inetd.conf
 

3.4. 関連するディレクトリ、ファイル等
/etc/svc/repository.db :サービス構成リポジトリ
/var/svc/manifest :サービスインスタンス毎のマニフェスト、カテゴリ別のディレクトリ構成となっている
/var/svc/log :サービスインスタンス毎のログファイル
/var/svc/profile :プロファイル