Solaris 8 のシステム管理 (追補)

第 17 章 Reconfiguration Coordination Manager (RCM) スクリプト

Solaris 8 4/01 リリースで、Reconfiguration Coordination Manager (RCM) スクリプトの機能が新規に追加されました。Solaris のシステム管理についての全般的な情報は、『Solaris のシステム管理 (第 1 巻)』を参照してください。


注 –

最新のマニュアルページを参照するには、man コマンドを使用してください。Solaris 8 Update リリースのマニュアルページには、「Solaris 8 Reference Manual Collection」には記載されていない新しい情報も提供されています。


RCM スクリプトの概要

システムリソースの動的再構成では、システムを動作させたままで、システムのコンポーネントを再構成することができます。この機能は、Solaris 8 リリースから cfgadm コマンドで使用できるようになりました。Reconfiguration Coordination Manager は、システムコンポーネントの動的削除を制御するフレームワークです。RCM の使用により、システムリソースを秩序立てて登録したり解放したりすることができます。

Solaris 8 4/01 リリースでは、動的再構成時にアプリケーションをシャットダウンしたり、アプリケーションからデバイスをクリーンに解放したりする独自のスクリプトを作成できる、新しい RCM スクリプト機能を使用することができるようになりました。再構成の要求がスクリプトによって登録されたリソースに影響を及ぼすものである場合、その再構成の要求に応答して RCM フレームワークは自動的にスクリプトを起動させます。

以前は、リソースを動的に削除するには、アプリケーションからリソースを手動で解放する必要がありました。または、cfgadm コマンドを -f オプションとともに使用して再構成の操作を強制的に実行することもできますが、このオプションでは、アプリケーションが認識されない状態のままになってしまいます。また、アプリケーションからリソースを手動で解放すると、エラーを引き起こすこともよくあります。

RCM スクリプト機能は、動的再構成のプロセスをシンプルにし、制御性を向上させます。RCM スクリプトの作成により、次のことが可能になります。

RCM スクリプトとは

RCM スクリプトとは :

RCM スクリプトで何ができるか

デバイスを動的に削除する際、RCM スクリプトを使用してアプリケーションからデバイスを解放することができます。また、デバイスが現在開かれている状態の場合は、RCM スクリプトはそのデバイスを閉じます。

たとえば、テープのバックアップアプリケーション用の RCM スクリプトは、そのテープのバックアップアプリケーションに対して、テープドライブを閉じるよう通知したり、そのテープのバックアップアプリケーションをシャットダウンするよう通知したりすることができます。

RCM スクリプトのプロセスはどのように機能するか

次のようにして、スクリプトを起動できます。


$ script-name command [args ...]

1 つのスクリプトは、次のような基本手順を実行します。

  1. コマンド行の引数から RCM コマンドを取得します。

  2. そのコマンドを実行します。

  3. 結果を、名前 - 値のペアとして stdout (標準出力) に書き込みます。

  4. 適切な終了ステータスで終了します。

RCM デーモンは、1 度に 1 スクリプトの 1 つのインスタンスを実行します。たとえば、1 つのスクリプトが実行されている時は、RCM デーモンは最初のスクリプトが終了するまで同じスクリプトを実行しません。

RCM スクリプトのコマンド

次の RCM コマンドは、RCM スクリプト内に含める必要があります。

次の RCM コマンドは、必要に応じて一部またはすべてを含めることができます。

これらの RCM コマンドの詳細な説明は、rcmscript(4) のマニュアルページを参照してください。

RCM スクリプトの処理の環境

ユーザーがデバイスを動的に削除する際、RCM デーモンは以下を実行します。

RCM スクリプトのタスク

次の節では、アプリケーション開発者およびシステム管理者のための RCM スクリプトのタスクについて記述します。

アプリケーション開発者の RCM スクリプトのタスク

次の表では、RCM スクリプトを作成するアプリケーション開発者のタスクを記載しています。

表 17–1 アプリケーション開発者のための RCM スクリプトのタスクマップ

タスク 

説明 

手順の参照先 

1. アプリケーションが使用するリソースを明確にする。 

動的に削除できる可能性がある、アプリケーションが使用するリソース (デバイス名) を明確にする。 

cfgadm(1m) のマニュアルページ

2. リソースを解放するためのコマンドを明確にする。 

アプリケーションからリソースをクリーンに解放するよう、アプリケーションに通知するためのコマンドを明確にする。 

アプリケーションのマニュアル 

3. リソースの削除後に実行するコマンドを明確にする。 

リソースの削除をアプリケーションに通知するためのコマンドを含める。 

rcmscript(4) のマニュアルページ

4. リソースの削除が失敗した場合のコマンドを明確にする。 

利用可能なリソースをアプリケーションに通知するためのコマンドを含める。 

rcmscript(4) のマニュアルページ

5. RCM スクリプトを書く。 

 

テープのバックアップ用 RCM スクリプトの例

6. RCM スクリプトをインストールする。 

スクリプトを適切なスクリプトのディレクトリに追加する。 

RCM スクリプトをインストールするには

7. RCM スクリプトをテストする。 

スクリプトのコマンドを手動で実行し、動的再構成の操作を開始して、スクリプトをテストする。 

RCM スクリプトをテストするには

システム管理者の RCM スクリプトのタスク

次の表では、サイトにおけるカスタマイズのために RCM スクリプトを作成するシステム管理者のタスクを記載しています。

表 17–2 システム管理者のための RCM スクリプトのタスクマップ

タスク 

説明 

参照先 

1. 動的に削除されるリソースを明確にする。 

cfgadm -l コマンドの使用により、削除される可能性のあるリソース (デバイス名) を明確にします。

cfgadm(1m) のマニュアルページ

2. 停止されるアプリケーションを明確にする。 

アプリケーションをクリーンに停止させるためのコマンドを明確にする。 

アプリケーションのマニュアル 

3. リソースの削除前および削除後に実行するコマンドを明確にする。 

リソースが削除される前と後に実行するアクションを明確にします。 

rcmscript(4) のマニュアルページ

4. RCM スクリプトを書く。 

 

テープのバックアップ用 RCM スクリプトの例

5. RCM スクリプトをインストールする。 

スクリプトを適切なスクリプトのディレクトリに追加する。 

RCM スクリプトをインストールするには

6. RCM スクリプトをテストする。 

スクリプトのコマンドを手動で実行し、動的再構成の操作を開始して、スクリプトをテストする。 

RCM スクリプトをテストするには

RCM スクリプトの名付け方

スクリプトは、次の定義に従って vendor,service と名付ける必要があります。

vendor

そのスクリプトを提供するベンダーのストックシンボル (株式記号) であるか、またはそのベンダーを明確に識別できる名前。 

service

そのスクリプトが行うサービスの名前。 

RCM スクリプトのインストールまたは削除

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

任意のハードウェア用のスクリプト 

RCM スクリプトをインストールするには

  1. スーパーユーザーになります。

  2. スクリプトを、表 17–3 に記載されているように適切なディレクトリにコピーします。

    たとえば、次のようにします。


    # cp SUNW,sample.pl /usr/lib/rcm/scripts
    
  3. スクリプトのユーザー ID とグループ ID を希望する値に変更します。

    たとえば、次のようにします。


    # chown user:group /usr/lib/rcm/scripts/SUNW,sample.pl
    
  4. SIGHUP を RCM デーモンに送信します。


    # pkill -HUP -x -u root rcm_daemon
    

RCM スクリプトを削除するには

  1. スーパーユーザーになります。

  2. RCM スクリプトのディレクトリから、スクリプトを削除します。

    たとえば、次のようにします。


    # rm /usr/lib/rcm/scripts/SUNW,sample.pl
    
  3. SIGHUP を RCM デーモンに送信します。


    # pkill -HUP -x -u root rcm_daemon
    

RCM スクリプトをテストするには

  1. スクリプトを実行する前に、コマンド行のシェルで RCM_ENV_FORCE などの環境変数を設定します。

    たとえば、Korn シェルでは、以下を使用します。


    $ export RCM_ENV_FORCE=TRUE
    
  2. コマンド行からスクリプトのコマンドを手動で実行して、スクリプトをテストします。

    たとえば、次のようにします。


    $ script-name scriptinfo
    $ script-name register
    $ script-name preremove resource-name
    $ script-name postremove resource-name
    
  3. スクリプト内の各 RCM スクリプトコマンドが stdout (標準出力) に適切な出力をプリントすることを確認します。

  4. スクリプトを適切なスクリプトのディレクトリにインストールします。

    詳細は、RCM スクリプトをインストールするには を参照してください。

  5. 動的な削除の操作を開始して、スクリプトをテストします。

    たとえば、スクリプトがデバイス /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 スクリプトは、次の手順を実行します。

  1. RCM コマンドのディスパッチテーブルをセットアップします。

  2. 指定した RCM コマンドに対応するディスパッチルーチンを呼び出し、実装されていない RCM コマンドについてはステータス 2 で終了します。

  3. scriptinfo セクションをセットアップします。


    rcm_script_func_info=Tape backup appl script for DR
  4. すべてのテープドライブデバイス名を stdout (標準出力) に出力して、システム内のすべてのテープドライブを登録します。


    rcm_resource_name=/dev/rmt/$f
    エラーが発生した場合は、エラー情報を stdout に出力します。


    rcm_failure_reason=$errmsg
  5. テープデバイスのリソース情報を設定します。


    rcm_resource_usage_info=Backup Tape Unit Number $unit
  6. バックアップアプリケーションがそのデバイスを使用しているかどうかをチェックして、preremove 情報をセットアップします。バックアップアプリケーションがそのデバイスを使用していない場合は、動的再構成の操作はそのまま継続します。バックアップアプリケーションがそのデバイスを使用している場合は、スクリプトは RCM_ENV_FORCE をチェックします。RCM_ENV_FORCEFALSE に設定されている場合は、スクリプトは動的再構成の操作を否定し、次のようなメッセージを出力します。


    rcm_failure_reason=tape backup in progress pid=...

    RCM_ENV_FORCETRUE に設定されている場合は、バックアップアプリケーションが停止され、再構成の操作が進められます。

テープバックアップ再構成のシナリオの結果

次に、RCM スクリプトを使用せずに、cfgadm コマンドを使用してテープデバイスを削除する場合に起こる結果を示します。

次に、RCM スクリプトを使用して、cfgadm コマンドを使用してテープデバイスを削除する場合に起こる結果を示します。

例 - テープのバックアップ用の RCM スクリプト


#! /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);
            }
    }