SYONテクニカル

Solaris10のSMFによるサービス管理

サイオンコミュニケーションズ株式会社

大城 智史

1.Solaris10とSMF(Service Management Facility)

Solarisはサン・マイクロシステムズ社がリリースしているOSで、バージョンアップを重ね今年(2005年)には、Solaris10が発表されました。Solaris10はx64/x86版とsparc版があり、サンのサイトからダウンロードして無料で使用することができます。

SMFは(Service Management Facility)Solaris10から導入されたサービス管理のしくみです。従来のrcスクリプトを使用することも可能ですが多くのサービスがSMFでの管理に移行されています。
Solaris10は標準でApache1.3系とApache2系がインストールされています。 Apache1.3系は従来のrcスクリプトで、Apache2系は SMFで管理されています。ここではこの2つのApacheを使用せずApacheを新たにソースからインストールしてSMFで管理します。メリットとし てカスタマイズしたApacheをSMFで管理できることや、この作業を応用し、他の新たにインストールするサービスをSMFで管理できることが考えられます。

2.マシン環境

今回、検証をおこなったマシン環境は次のとおりとなっています。

CPU Pentium4 1.9GHz
Memory 512MB
HDD 60G
NIC RealTek RTL-8139(PCI)
OS Solaris10 x86 3/05

SolarisはLinuxやFreeBSDに比べサポートするハードウェアが多くありません。使用できるデバイスの確認はサン社のハードウェア互換リスト(HCL)のページをご確認ください。

今回の検証はOSをインストールした直後の状態で行いました。
OSのインストール途中でSolarisソフトウェアグループの選択をしますが、「全体ディストリビューション」を選択しています。

Solaris10×64/x86は64bit対応CPUが搭載されたシステムでは、自動的に64bitカーネルで起動しますが、今回使用したPentium4は64bitCPUではありませんので32bitモードで起動しています。動作モードの確認は次のように行います。

# isainfo -kv
32-bit i386 kernel modules

3.SMF関連コマンド

 

3.1.svcs

svcsコマンドは現在のサービスの状態を表示します。
現在無効のサービスを含めてすべて表示するには-aのオプションを用いて実行します。

# svcs -a
STATE          STIME    FMRI
legacy_run      9月_28  lrc:/etc/rcS_d/S50sk98sol
legacy_run      9月_28  lrc:/etc/rc2_d/S10lu
legacy_run      9月_28  lrc:/etc/rc2_d/S20sysetup

~中略

online          9月_28  svc:/milestone/multi-user-server:default
online          9月_28  svc:/system/zones:default
online         10:46:27 svc:/network/http:apache2
offline         9月_28  svc:/application/print/ipp-listener:default
offline         9月_28  svc:/application/print/rfc1179:default

STATE項目のlegacy_runは従来のrcスクリプトで管理されている事を示し、onlineはSMFで管理されて起動中で接続可能な状態、offlineはSMFで管理されネットワーク接続はしないサービス、disableはSMFで管理され現在無効なサービスを表します。
STIMEはサービス状態の最終変更時刻を表します。
FMRIはサービスを特定するための識別子です。

現在のApacheの状態は以下のようにして確認します。

# svcs -a | grep apache
legacy_run      9月_28  lrc:/etc/rc3_d/S50apache
disabled       11:04:37 svc:/network/http:apache2

Apacheが2つ存在し、Apache1.3は従来のrcスクリプトで、Apache2はSMFで管理され現在は無効になっていることがわかります。

3.2.svcadm

svcadmを用いてSMFで管理されているサービスの操作をします。ここではデフォルトでインストールされているApache2を有効にしますが、Apache2の設定ファイルhttpd.confがないためそのままでは起動しません。以下のようにしてApache2を有効にします。

# cp /etc/apache2/httpd.conf-example /etc/apache2/httpd.conf
# svcadm enable svc:/network/http:apache2
# svcs -a | grep apache2
online         11:29:08 svc:/network/http:apache2
# ps -ef | grep httpd
    root   663     1   0 16:14:15 ?           0:00 /usr/apache2/bin/httpd -k start
webservd   666   663   0 16:14:16 ?           0:00 /usr/apache2/bin/httpd -k start
webservd   664   663   0 16:14:16 ?           0:00 /usr/apache2/bin/httpd -k start
webservd   668   663   0 16:14:16 ?           0:00 /usr/apache2/bin/httpd -k start
webservd   667   663   0 16:14:16 ?           0:00 /usr/apache2/bin/httpd -k start
webservd   665   663   0 16:14:16 ?           0:00 /usr/apache2/bin/httpd -k start
#

無効化するにはdisableオプションを使用します。有効にする時はサービスを指定する際FMRIをすべて入力しましたが省略することもできます。

# svcadm disable apache2
# svcs -a | grep apache2
disabled       12:53:11 svc:/network/http:apache2

3.3.svccfg

import オプションはマニフェストと呼ばれるXMLファイルを読み込み、SMFで管理する際に使用します。

exportオプションは現在SMFで管理されているサービスのマニフェスト(XMLファイル)を出力します。ここでは後にインストールするApache2をSMFで管理するために、必要なXMLファイルのひな形をとしてデフォルトでインストールされているApache2のXMLファイルを出力します。exportオプションの後ろFMRIのサービスの種類(ここでは/network/http)をつけて実行します。

# svcs -a | grep apache2
disabled       12:53:11 svc:/network/http:apache2
# svccfg export network/http > ~/http-apache2.xml
# cd
# ls -la
合計 10
drwxr-xr-x   2 root   root         512 10月  2日  13:31 .
drwxr-xr-x   4 root     root         512  9月 28日  08:02 ..
-rw-------   1 root   other        699 10月  2日  10:28 .bash_history
-rw-r--r--   1 root     root        1778 10月  2日  13:33 http-apache2.xml

http-apache2.xmlの内容は以下のようになっています。

# cat http-apache2.xml
<?xml version='1.0'?>

$lt;strong>

<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
<service_bundle type='manifest' name='export'>
  <service name='network/http' type='service' version='0'>
    <instance name='apache2' enabled='false'>
      <dependency name='loopback' grouping='require_all' restart_on='error' ↓
type='service'>
        <service_fmri value='svc:/network/loopback:default'/>

      </dependency>

      <dependency name='physical' grouping='optional_all' restart_on='error'  ↓
type='service'>
        <service_fmri value='svc:/network/physical:default'/>
      </dependency>
      <exec_method name='start' type='method' exec='/lib/svc/method/http-apache2 start'
 timeout_seconds='60'>
        <method_context/>

      </exec_method>

      <exec_method name='stop' type='method' exec='/lib/svc/method/http-apache2 stop'
 timeout_seconds='60'>
        <method_context/>
      </exec_method>
      <exec_method name='refresh' type='method' ↓
exec='/lib/svc/method/http-apache2 refresh'
 timeout_seconds='60'>
        <method_context/>

      </exec_method>

      <property_group name='httpd' type='application'>
        <stability value='Evolving'/>
        <propval name='ssl' type='boolean' value='false'/>
      </property_group>
      <property_group name='startd' type='framework'>

        <propval name='ignore_error' type='astring' value='core,signal'/>

      </property_group>
    </instance>
    <stability value='Evolving'/>
    <template>
      <common_name>

        <loctext xml:lang='C'>Apache 2 HTTP server</loctext>

      </common_name>
      <documentation>
        <manpage title='apache2' section='1M'/>
        <doc_link name='apache.org' uri='http://httpd.apache.org'/>

      </documentation>
    </template>

  </service>
</service_bundle>

delete オプションはSMFでのサービス管理から外す時に使用します。-fオプションを追加することで現在起動しているサービスでも強制的に削除します。

# svccfg delete -f apache2
# svcs -a |grep apache2
#

削除されたので表示されなくなりました。

4.SMF関連ファイル

/var/svc/manifest/*/*.xml

SMFでサービスを管理する時に使用するXMLファイルでマニフェストと呼ばれます。起動スクリプトや設定ファイルのパス、FMRI等の情報が書かれています

/lib/svc/method/*

SMFで管理されているサービスの起動スクリプトです。デフォルトでインストールされているApache2の起動スクリプトは/lib/svc/method/http-apache2 です。今回はこのファイルをソースからインストールしたApache2編集して使用します。

/etc/svc/*

SMFで使用するデータベースファイルです、テキストファイルではないのでエディタで直接編集することはできません、svccfgコマンド等でSMFを操作すると更新されます。

5.Apache2のインストール

以下の手順でApache2を新たにインストールします。

# PATH=/usr/sfw/bin:/usr/ccs/bin:$PATH
# wget http://www.apache.jp/dist/httpd/httpd-2.0.54.tar.gz
# gtar zxvf httpd-2.0.54.tar.gz
# cd httpd-2.0.54
# ./configure
# make
# make install

以上の手順でインストールしたapacheは/usr/local/apache以下にインストールされます。

# pwd
/usr/local/apache2
# ls -la
合計 54
drwxr-xr-x  15 root     root         512 10月  2日  15:07 .
drwxr-xr-x   3 root     root         512 10月  2日  15:06 ..
drwxr-xr-x   2 root     root         512 10月  2日  15:07 bin
drwxr-xr-x   2 root     root         512 10月  2日  15:07 build
drwxr-xr-x   2 root     root         512 10月  2日  15:07 cgi-bin
drwxr-xr-x   2 root     root         512 10月  2日  15:07 conf
drwxr-xr-x   3 root     root        1024 10月  2日  15:07 error
drwxr-xr-x   2 root     root        1024 10月  2日  15:07 htdocs
drwxr-xr-x   3 root     root        3584 10月  2日  15:07 icons
drwxr-xr-x   2 root     root        2560 10月  2日  15:07 include
drwxr-xr-x   2 root     root         512 10月  2日  15:06 lib
drwxr-xr-x   2 root     root         512 10月  2日  15:07 logs
drwxr-xr-x   4 root     root         512 10月  2日  15:07 man
drwxr-xr-x  14 root     root        8192 10月  2日  15:07 manual
drwxr-xr-x   2 root     root         512 10月  2日  15:07 modules

起動させるには/usr/local/apache2/conf/httpd.conf の268行目をコメントアウトし以下のように書き換えます。

#
User nobody
#Group #-1 (コメントアウトする)
Group nobody

6.SMFでの管理への移行

 インストールしたapache2をSMFで管理するための設定を行います。ここからの操作を行う場合は、先に紹介したsvccfg delete でデフォルトでインストールされているapache2をSMFでの管理から削除されていることを確認してから行います。

/lib/svc/http-apache2の編集

デフォルトでインストールされているapache2を管理するため/lib/svc/method/http-apache2 があるのでこれをひな型としてファイルを作成します。ここでは/lib/svc/method/http-apache2.origとして元のファイルも保存しておきます。

# cd /lib/svc/method/
# cp http-apache2 http-apache2.orig

/lib/svc/method/http-apache2を新たにインストールしたapache2にあわせて編集します。赤い字の行はコメントアウトし、黄色の行は追加した行です。

# vi http-apache2
#!/sbin/sh
#
# Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#
# ident "@(#)http-apache2       1.2     04/11/11 SMI"
#

. /lib/svc/share/smf_include.sh

      #APACHE_HOME=/usr/apache2
      APACHE_HOME=/usr/local/apache2
      #CONF_FILE=/etc/apache2/httpd.conf
      CONF_FILE=/usr/local/apache2/conf/httpd.conf
      #PIDFILE=/var/run/apache2/httpd.pid
      PIDFILE=/usr/local/apache2/logs/httpd.pid

http-apache2.xmlのインポート

svccfg import コマンドでマニフェストを読み込み新にインストールしたApache2をSMFで管理します。マニフェストは先にルートディレクトリにしたhttp-apache2.xmlを使用します。このXMLファイルの中を見れば見当がつきますが、ファイルの中で起動スクリプトやサービスの種類等の情報が記載されています。今回はサービスの種類も起動スクリプトのパスも同じなため編集は必要ありません。

 
# cd
# svccfg import http-apache2.xml
#
# svcs -a |grep apache2
disabled    20:02:42 svc:/network/http:apache2
#
# svcadm enable apache2
# svcs -a |grep apache
legacy_run     20:34:36 lrc:/etc/rc		3_d/S50apache
online         20:38:10 svc:/network/http:apache2
# ps -ef| grep httpd
 nobody   631   627   0 16:04:21 ?        0:00 /usr/local/apache2/bin/httpd -k start
  nobody   630   627   0 16:04:21 ?        0:00 /usr/local/apache2/bin/httpd -k start
    root   627     1   0 16:04:21 ?        0:00 /usr/local/apache2/bin/httpd -k start
  nobody   628   627   0 16:04:21 ?        0:00 /usr/local/apache2/bin/httpd -k start
  nobody   629   627   0 16:04:21 ?        0:00 /usr/local/apache2/bin/httpd -k start
  nobody   632   627   0 16:04:21 ?        0:00 /usr/local/apache2/bin/httpd -k start
#

ソースからインストールしたApache2の/usr/local/apache2/bin/httpdが起動してます。

7.最後に

SMFはSolaris10になって突然導入されたため、戸惑った方も多いかとおもいます。
今回はマニフェストは編集せず、起動スクリプトを編集することで新たにインストールしたApache2をSMFで管理しましたが、新たにサービスをインストールする場合はマニフェストを編集しなければならない場合もあります。
マニフェストの編集方法については情報が少ないのですが、/var/svc/manifest/network/*.xmlが各ネットワークサーバ関連のマニフェストになっていますので、これを比較、参考にして編集するのがよいかと思われます。

Copyright 1999-2012 SYON Communications, Co. All rights reserved