Solaris 8 4/01 リリースで、Reconfiguration Coordination Manager (RCM) スクリプトの機能が新規に追加されました。Solaris のシステム管理についての全般的な情報は、『Solaris のシステム管理 (第 1 巻)』を参照してください。
最新のマニュアルページを参照するには、man コマンドを使用してください。Solaris 8 Update リリースのマニュアルページには、「Solaris 8 Reference Manual Collection」には記載されていない新しい情報も提供されています。
システムリソースの動的再構成では、システムを動作させたままで、システムのコンポーネントを再構成することができます。この機能は、Solaris 8 リリースから cfgadm コマンドで使用できるようになりました。Reconfiguration Coordination Manager は、システムコンポーネントの動的削除を制御するフレームワークです。RCM の使用により、システムリソースを秩序立てて登録したり解放したりすることができます。
Solaris 8 4/01 リリースでは、動的再構成時にアプリケーションをシャットダウンしたり、アプリケーションからデバイスをクリーンに解放したりする独自のスクリプトを作成できる、新しい RCM スクリプト機能を使用することができるようになりました。再構成の要求がスクリプトによって登録されたリソースに影響を及ぼすものである場合、その再構成の要求に応答して RCM フレームワークは自動的にスクリプトを起動させます。
以前は、リソースを動的に削除するには、アプリケーションからリソースを手動で解放する必要がありました。または、cfgadm コマンドを -f オプションとともに使用して再構成の操作を強制的に実行することもできますが、このオプションでは、アプリケーションが認識されない状態のままになってしまいます。また、アプリケーションからリソースを手動で解放すると、エラーを引き起こすこともよくあります。
RCM スクリプト機能は、動的再構成のプロセスをシンプルにし、制御性を向上させます。RCM スクリプトの作成により、次のことが可能になります。
デバイスを動的に削除する際に、自動的にデバイスを解放する。また、デバイスがアプリケーションによって開かれている場合、このプロセスがそのデバイスを閉じる。
システムからデバイスを動的に削除する際に、サイト特有のタスクを行う。
RCM スクリプトとは :
RCM デーモンが実行する、実行可能シェルスクリプト (Perl、sh、csh、ksh)、またはバイナリプログラム。Perl は推奨言語です。
スクリプトファイル所有者のユーザー ID を使用して、独自のアドレス領域内で実行されるスクリプト。
システムリソースを動的に再構成するためにユーザーが cfgadm コマンドを使用する際、RCM デーモンによって実行されるスクリプト。
デバイスを動的に削除する際、RCM スクリプトを使用してアプリケーションからデバイスを解放することができます。また、デバイスが現在開かれている状態の場合は、RCM スクリプトはそのデバイスを閉じます。
たとえば、テープのバックアップアプリケーション用の RCM スクリプトは、そのテープのバックアップアプリケーションに対して、テープドライブを閉じるよう通知したり、そのテープのバックアップアプリケーションをシャットダウンするよう通知したりすることができます。
次のようにして、スクリプトを起動できます。
$ script-name command [args ...] |
1 つのスクリプトは、次のような基本手順を実行します。
コマンド行の引数から RCM コマンドを取得します。
そのコマンドを実行します。
結果を、名前 - 値のペアとして stdout (標準出力) に書き込みます。
適切な終了ステータスで終了します。
RCM デーモンは、1 度に 1 スクリプトの 1 つのインスタンスを実行します。たとえば、1 つのスクリプトが実行されている時は、RCM デーモンは最初のスクリプトが終了するまで同じスクリプトを実行しません。
次の RCM コマンドは、RCM スクリプト内に含める必要があります。
scriptinfo - スクリプトの情報を収集します。
register - 対象となるものをリソースに登録します。
resourceinfo - リソースの情報を収集します。
次の RCM コマンドは、必要に応じて一部またはすべてを含めることができます。
queryremove - リソースが解放できるかどうかを照会します。
preremove - リソースを解放します。
postremove - リソースを削除した後の通知を発行します。
undoremove - preremove で実行されたアクションを元に戻します。
これらの RCM コマンドの詳細な説明は、rcmscript(4) のマニュアルページを参照してください。
ユーザーがデバイスを動的に削除する際、RCM デーモンは以下を実行します。
スクリプト内で識別されるリソースのリスト (デバイス名) を収集するために、スクリプトの register コマンドを実行する。
スクリプトに登録されたリソースが動的削除の操作の影響を受ける場合、リソースの削除を行う前に、スクリプトの queryremove/preremove コマンドを実行する。
削除の操作が成功した場合は、スクリプトの postremove コマンドを実行する。削除の操作が失敗した場合は、RCM デーモンはスクリプトの undoremove コマンドを実行する。
次の節では、アプリケーション開発者およびシステム管理者のための RCM スクリプトのタスクについて記述します。
次の表では、RCM スクリプトを作成するアプリケーション開発者のタスクを記載しています。
表 17–1 アプリケーション開発者のための RCM スクリプトのタスクマップ
タスク |
説明 |
手順の参照先 |
---|---|---|
1. アプリケーションが使用するリソースを明確にする。 |
動的に削除できる可能性がある、アプリケーションが使用するリソース (デバイス名) を明確にする。 |
cfgadm(1m) のマニュアルページ |
2. リソースを解放するためのコマンドを明確にする。 |
アプリケーションからリソースをクリーンに解放するよう、アプリケーションに通知するためのコマンドを明確にする。 |
アプリケーションのマニュアル |
3. リソースの削除後に実行するコマンドを明確にする。 |
リソースの削除をアプリケーションに通知するためのコマンドを含める。 |
rcmscript(4) のマニュアルページ |
4. リソースの削除が失敗した場合のコマンドを明確にする。 |
利用可能なリソースをアプリケーションに通知するためのコマンドを含める。 |
rcmscript(4) のマニュアルページ |
5. RCM スクリプトを書く。 |
| |
6. RCM スクリプトをインストールする。 |
スクリプトを適切なスクリプトのディレクトリに追加する。 | |
7. RCM スクリプトをテストする。 |
スクリプトのコマンドを手動で実行し、動的再構成の操作を開始して、スクリプトをテストする。 |
次の表では、サイトにおけるカスタマイズのために RCM スクリプトを作成するシステム管理者のタスクを記載しています。
表 17–2 システム管理者のための RCM スクリプトのタスクマップ
タスク |
説明 |
参照先 |
---|---|---|
1. 動的に削除されるリソースを明確にする。 |
cfgadm -l コマンドの使用により、削除される可能性のあるリソース (デバイス名) を明確にします。 |
cfgadm(1m) のマニュアルページ |
2. 停止されるアプリケーションを明確にする。 |
アプリケーションをクリーンに停止させるためのコマンドを明確にする。 |
アプリケーションのマニュアル |
3. リソースの削除前および削除後に実行するコマンドを明確にする。 |
リソースが削除される前と後に実行するアクションを明確にします。 |
rcmscript(4) のマニュアルページ |
4. RCM スクリプトを書く。 |
| |
5. RCM スクリプトをインストールする。 |
スクリプトを適切なスクリプトのディレクトリに追加する。 | |
6. RCM スクリプトをテストする。 |
スクリプトのコマンドを手動で実行し、動的再構成の操作を開始して、スクリプトをテストする。 |
スクリプトは、次の定義に従って vendor,service と名付ける必要があります。
vendor |
そのスクリプトを提供するベンダーのストックシンボル (株式記号) であるか、またはそのベンダーを明確に識別できる名前。 |
service |
そのスクリプトが行うサービスの名前。 |
RCM スクリプトのインストールや削除を行うには、スーパーユーザー (root) である必要があります。次の表を使用して、RCM スクリプトをどこにインストールするかを決めます。
表 17–3 RCM スクリプトのディレクトリ
ディレクトリのロケーション |
スクリプトのタイプ |
---|---|
/etc/rcm/scripts |
特定のシステム用のスクリプト |
/usr/platform/`uname -i`/lib/rcm/scripts |
特定のハードウェアの実装用のスクリプト |
/usr/platform/`uname -m`/lib/rcm/scripts |
特定のハードウェアクラス用のスクリプト |
/usr/lib/rcm/scripts |
任意のハードウェア用のスクリプト |
スーパーユーザーになります。
スクリプトを、表 17–3 に記載されているように適切なディレクトリにコピーします。
たとえば、次のようにします。
# cp SUNW,sample.pl /usr/lib/rcm/scripts |
スクリプトのユーザー ID とグループ ID を希望する値に変更します。
たとえば、次のようにします。
# chown user:group /usr/lib/rcm/scripts/SUNW,sample.pl |
SIGHUP を RCM デーモンに送信します。
# pkill -HUP -x -u root rcm_daemon |
スーパーユーザーになります。
RCM スクリプトのディレクトリから、スクリプトを削除します。
たとえば、次のようにします。
# rm /usr/lib/rcm/scripts/SUNW,sample.pl |
SIGHUP を RCM デーモンに送信します。
# pkill -HUP -x -u root rcm_daemon |
スクリプトを実行する前に、コマンド行のシェルで RCM_ENV_FORCE などの環境変数を設定します。
たとえば、Korn シェルでは、以下を使用します。
$ export RCM_ENV_FORCE=TRUE |
コマンド行からスクリプトのコマンドを手動で実行して、スクリプトをテストします。
たとえば、次のようにします。
$ script-name scriptinfo $ script-name register $ script-name preremove resource-name $ script-name postremove resource-name |
スクリプト内の各 RCM スクリプトコマンドが stdout (標準出力) に適切な出力をプリントすることを確認します。
スクリプトを適切なスクリプトのディレクトリにインストールします。
詳細は、RCM スクリプトをインストールするには を参照してください。
動的な削除の操作を開始して、スクリプトをテストします。
たとえば、スクリプトがデバイス /dev/dsk/c1t0d0s0 を登録していると仮定します。次のコマンドを実行してみます。
$ cfgadm -c unconfigure c1::dsk/c1t0d0 $ cfgadm -f -c unconfigure c1::dsk/c1t0d0 $ cfgadm -c configure c1::dsk/c1t0d0 |
これらのコマンドはシステムの状態を変えたり、システムに障害を引き起こしたりする可能性もあるため、これらのコマンドについて熟知しておく必要があります。
次の例では、テープのバックアップ用に RCM スクリプトを使用する方法を示します。
テープのバックアップ用 RCM スクリプトは、次の手順を実行します。
RCM コマンドのディスパッチテーブルをセットアップします。
指定した RCM コマンドに対応するディスパッチルーチンを呼び出し、実装されていない RCM コマンドについてはステータス 2 で終了します。
scriptinfo セクションをセットアップします。
rcm_script_func_info=Tape backup appl script for DR |
すべてのテープドライブデバイス名を stdout (標準出力) に出力して、システム内のすべてのテープドライブを登録します。
rcm_resource_name=/dev/rmt/$f |
rcm_failure_reason=$errmsg |
テープデバイスのリソース情報を設定します。
rcm_resource_usage_info=Backup Tape Unit Number $unit |
バックアップアプリケーションがそのデバイスを使用しているかどうかをチェックして、preremove 情報をセットアップします。バックアップアプリケーションがそのデバイスを使用していない場合は、動的再構成の操作はそのまま継続します。バックアップアプリケーションがそのデバイスを使用している場合は、スクリプトは RCM_ENV_FORCE をチェックします。RCM_ENV_FORCE が FALSE に設定されている場合は、スクリプトは動的再構成の操作を否定し、次のようなメッセージを出力します。
rcm_failure_reason=tape backup in progress pid=... |
RCM_ENV_FORCE が TRUE に設定されている場合は、バックアップアプリケーションが停止され、再構成の操作が進められます。
次に、RCM スクリプトを使用せずに、cfgadm コマンドを使用してテープデバイスを削除する場合に起こる結果を示します。
cfgadm コマンドを使用し、バックアップアプリケーションがテープデバイスを使用していない場合、操作は成功します。
cfgadm コマンドを使用し、バックアップアプリケーションがテープデバイスを使用している場合、操作は失敗します。
次に、RCM スクリプトを使用して、cfgadm コマンドを使用してテープデバイスを削除する場合に起こる結果を示します。
cfgadm コマンドを使用し、バックアップアプリケーションがテープデバイスを使用していない場合、操作は成功します。
-f オプション無しで cfgadm コマンドを使用し、バックアップアプリケーションがテープデバイスを使用している場合、操作は失敗し、次のようなエラーメッセージが出力されます。
tape backup in progress pid=... |
cfgadm -f コマンドを使用し、バックアップアプリケーションがテープデバイスを使用している場合、スクリプトがバックアップアプリケーションを停止させ、cfgadm 操作は成功します。
#! /usr/bin/perl -w # # A sample site customization RCM script. # # When RCM_ENV_FORCE is FALSE this script indicates to RCM that it cannot # release the tape drive when the tape drive is being used for backup. # # When RCM_ENV_FORCE is TRUE this script allows DR removing a tape drive # when the tape drive is being used for backup by killing the tape # backup application. # use strict; my ($cmd, %dispatch); $cmd = shift(@ARGV); # dispatch table for RCM commands %dispatch = ( "scriptinfo" => \&do_scriptinfo, "register" => \&do_register, "resourceinfo" => \&do_resourceinfo, "queryremove" => \&do_preremove, "preremove" => \&do_preremove ); if (defined($dispatch{$cmd})) { &{$dispatch{$cmd}}; } else { exit (2); } sub do_scriptinfo { print "rcm_script_version=1\n"; print "rcm_script_func_info=Tape backup appl script for DR\n"; exit (0); } sub do_register { my ($dir, $f, $errmsg); $dir = opendir(RMT, "/dev/rmt"); if (!$dir) { $errmsg = "Unable to open /dev/rmt directory: $!"; print "rcm_failure_reason=$errmsg\n"; exit (1); } while ($f = readdir(RMT)) { # ignore hidden files and multiple names for the same device if (($f !~ /^\./) && ($f =~ /^[0-9]+$/)) { print "rcm_resource_name=/dev/rmt/$f\n"; } } closedir(RMT); exit (0); } sub do_resourceinfo { my ($rsrc, $unit); $rsrc = shift(@ARGV); if ($rsrc =~ /^\/dev\/rmt\/([0-9]+)$/) { $unit = $1; print "rcm_resource_usage_info=Backup Tape Unit Number $unit\n"; exit (0); } else { print "rcm_failure_reason=Unknown tape device!\n"; exit (1); } } sub do_preremove { my ($rsrc); $rsrc = shift(@ARGV); # check if backup application is using this resource #if (the backup application is not running on $rsrc) { # allow the DR to continue # exit (0); #} # # If RCM_ENV_FORCE is FALSE deny the operation. # If RCM_ENV_FORCE is TRUE kill the backup application in order # to allow the DR operation to proceed # if ($ENV{RCM_ENV_FORCE} eq 'TRUE') { if ($cmd eq 'preremove') { # kill the tape backup application } exit (0); } else { # # indicate that the tape drive can not be released # since the device is being used for backup by the # tape backup application # print "rcm_failure_reason=tape backup in progress pid=...\n" ; exit (3); } } |