ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
![]() |
Oracle Solaris 11.1 での Image Packaging System を使用したソフトウェアのパッケージ化および配布 Oracle Solaris 11.1 Information Library (日本語) |
新しい SMF サービスを配布するには、SMF マニフェストファイルおよびメソッドスクリプトを配布するパッケージを作成します。
このセクションではまず、新しい SMF サービスを配布する一般的なケースについて説明し、次に一度だけ実行されるサービスを配布する特殊なケースについて説明します。最後に、このセクションではこれらのサービスパッケージの自己アセンブリに関するいくつかのヒントを示します。
新しい SMF サービスを配布するパッケージは通常、システム変更を必要とします。
SVR4 のパッケージ化では、インストール後のスクリプトは SMF コマンドを実行して svc:/system/manifest-import:default サービスを再起動しました。
IPS では、マニフェストファイルを lib/svc/manifest または var/svc/manifest に配布するアクションが次のアクチュエータでタグ付けされます。
restart_fmri=svc:/system/manifest-import:default
このアクチュエータは、マニフェストが追加、更新、または削除されると、manifest-import サービスが再起動され、それによってその SMF マニフェストによって配布されたサービスが追加、更新、または削除されるようにします。
パッケージがライブシステムに追加される場合、このアクションはそのパッケージ化操作中にすべてのパッケージがシステムに追加されると実行されます。パッケージが代替ブート環境に追加される場合、このアクションはそのブート環境の最初のブート中に実行されます。
新しいソフトウェア環境の単発の構成を実行する必要があるパッケージでは、その構成を実行する SMF サービスを配布するようにします。
そのアプリケーションを配布するパッケージには次のアクションを含めるようにします。
file path=opt/myapplication/bin/run-once.sh owner=root group=sys mode=0755 file path=lib/svc/manifest/application/myapplication-run-once.xml owner=root group=sys \ mode=0644 restart_fmri=svc:/system/manifest-import:default
そのサービスの SMF メソッドスクリプトには、さらにアプリケーションを構成したり、そのアプリケーションが効率的に動作するようにシステムを変更したりするために必要なすべてのものを含めることができます。この例では、そのメソッドスクリプトは簡単なログメッセージを作成します。
#!/usr/bin/sh . /lib/svc/share/smf_include.sh assembled=$(/usr/bin/svcprop -p config/assembled $SMF_FMRI) if [ "$assembled" == "true" ] ; then exit $SMF_EXIT_OK fi svccfg -s $SMF_FMRI setprop config/assembled = true svccfg -s $SMF_FMRI refresh echo "This is output from our run-once method script"
通常、SMF サービスはそのアプリケーションがまだ構成されていない場合にのみ動作するようにします。このサンプルメソッドスクリプトでは、config/assembled をチェックします。別の方法は、そのサービスをアプリケーションとは別にパッケージ化し、次にそのメソッドスクリプトを使用してそのサービスが含まれるパッケージを削除することです。
メソッドスクリプトをテストする場合は、アクチュエータを実行するパッケージのインストールの前後に pkg verify を実行します。各実行の出力を比較して、そのスクリプトが編集可能としてマークされていないファイルの変更を試みないようにします。
次に、この例の SMF サービスマニフェストを示します。
<?xml version="1.0"?> <!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1"> <service_bundle type='manifest' name='MyApplication:run-once'> <service name='application/myapplication/run-once' 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:default' /> </dependency> <dependent name='myapplication_self-assembly-complete' grouping='optional_all' restart_on='none'> <service_fmri value='svc:/milestone/self-assembly-complete' /> </dependent> <instance enabled='true' name='default'> <exec_method type='method' name='start' exec='/opt/myapplication/bin/run-once.sh' timeout_seconds='0'/> <exec_method type='method' name='stop' exec=':true' timeout_seconds='0'/> <property_group name='startd' type='framework'> <propval name='duration' type='astring' value='transient' /> </property_group> <property_group name='config' type='application'> <propval name='assembled' type='boolean' value='false' /> </property_group> </instance> </service> </service_bundle>
svc.startd(1M) がこのサービスの処理を追跡しないように、SMF サービスの startd/duration プロパティーが transient に設定されていることに注意してください。また、このサービスがそれ自身を依存関係として self-assembly-complete システムマイルストーンに追加していることにも注意してください。
このセクションでは、SMF メソッドの作成時にパッケージの自己アセンブリをサポートするための追加のヒントをいくつか示します。
パッケージ化された構成ファイルフラグメントからの構成ファイルのコンパイルを、メソッドスクリプトが実行されるたびに行うのは負担がかかるという場合は、メソッドスクリプトで次のテストを使用することを検討してください。
パッケージ化された構成ファイルフラグメントのディレクトリに対して ls -t を実行し、次に head -1 を使用して最後に変更されたバージョンを選択します。このファイルのタイムスタンプを、それらのフラグメントからコンパイルされるパッケージ化されていない構成ファイルのタイムスタンプと比較して、そのサービスでその構成ファイルを再コンパイルする必要があるかどうかを判断します。
上記の SMF サービスマニフェストの例では、start メソッドに対して timeout_seconds='0' を定義しています。これは SMF が自己アセンブリが完了するまで永久に待ち続けることを意味します。
デバッグに役立てるために、自己アセンブリプロセスに制限のあるタイムアウトを課して、何かがうまくいかない場合に SMF が保守のためのサービスを打ち切ることができるようにすることをお勧めします。