Solaris のシステム管理 (デバイスとファイルシステム)

RCM スクリプトでの作業

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

アプリケーション開発者 RCM スクリプト (作業マップ)

次の作業マップでは、RCM スクリプトを作成するアプリケーション開発者の作業について説明します。

作業 

説明 

参照先 

1. アプリケーションが使用するリソースを特定します。 

アプリケーションが使用するリソース (デバイス名) を特定します。このデバイスは動的に取り外される可能性があります。 

cfgadm(1m)

2. リソースを解放するコマンドを特定します。 

アプリケーションからリソースを完全に解放するようにアプリケーションに通知するコマンドを特定します。 

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

3. リソースを取り外した後に使用するコマンドを特定します。 

リソースを取り外したことをアプリケーションに通知するコマンドを含めます。 

rcmscript(4)

4. リソースの取り外しに失敗した場合のコマンドを特定します。 

使用可能なリソースについてアプリケーションに通知するコマンドを含めます。  

rcmscript(4)

5. RCM スクリプトを記述します。 

作業 1 - 4 で特定した情報に基づいて RCM スクリプトを記述します。 

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

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

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

「RCM スクリプトのインストール方法」

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

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

「RCM スクリプトのテスト方法」

システム管理者 RCM スクリプト (作業マップ)

ここでは、サイトをカスタマイズするために RCM スクリプトを作成するシステム管理者の作業について説明します。

作業 

説明 

参照先 

1. 動的に削除するリソースを特定します。 

cfgadm -l コマンドを使って削除する可能性があるリソース (デバイス名) を特定します。

cfgadm(1m)

2. 停止するアプリケーションを特定します。 

アプリケーションを完全に停止させるコマンドを特定します。 

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

3. リソースの取り外し前および取り外し後のコマンドを特定します。 

リソースを取り外す前後の動作を特定します。 

rcmscript(4)

4. RCM スクリプトを記述します。 

作業 1 - 3 で特定した情報に基づいて RCM スクリプトを記述します。 

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

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

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

「RCM スクリプトのインストール方法」

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

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

「RCM スクリプトのテスト方法」

RCM スクリプトに名前を付ける

次の規則に従って、スクリプトに vendorservice という名前を付ける必要があります。

vendor

スクリプトを提供するベンダーのストックシンボル、またはベンダーを識別する固有名です。

service

スクリプトが表すサービス名です。

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

RCM スクリプトのインストールまたは削除を行うには、スーパーユーザー (root) の権限が必要です。この表を使用して、RCM スクリプトをインストールするディレクトリを判断してください。

表 6–1 RCM スクリプトディレクトリ

ディレクトリの位置 

スクリプトタイプ 

/etc/rcm/scripts

特定のシステム用のスクリプト 

/usr/platform/`uname -i`/lib/rcm/scripts

特定のハードウェア実装用のスクリプト 

/usr/platform/`uname -m`/lib/rcm/scripts

特定のハードウェアクラス用のスクリプト 

/usr/lib/rcm/scripts

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

ProcedureRCM スクリプトのインストール方法

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

  2. 適切なディレクトリにスクリプトをコピーします。

    表 6–1 を参照してください。

    次に例を示します。


    # 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
    

ProcedureRCM スクリプトの削除方法

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

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

    次に例を示します。


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


    # pkill -HUP -x -u root rcm_daemon
    

ProcedureRCM スクリプトのテスト方法

  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);
            }
    }