系统管理指南:设备和文件系统

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 脚本

必须按以下形式命名脚本,vendor,service,其中:

vendor

提供脚本的供应商的股票代号,或标识供应商的任何独特名称。

service

脚本表示的服务名称。

安装或删除 RCM 脚本

必须是超级用户 (root) 才能安装或删除 RCM 脚本。使用下表可确定应安装 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

任何硬件的脚本 

Procedure如何安装 RCM 脚本

  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
    

Procedure如何删除 RCM 脚本

  1. 成为超级用户。

  2. 从 RCM 脚本目录中删除脚本。

    例如:


    # rm /usr/lib/rcm/scripts/SUNW,sample.pl
    
  3. SIGHUP 发送到 RCM 守护进程。


    # pkill -HUP -x -u root rcm_daemon
    

Procedure如何测试 RCM 脚本

  1. 运行脚本之前,在命令行 shell 中设置环境变量,如 RCM_ENV_FORCE

    例如,在 Korn shell 中,请使用以下命令:


    $ 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_FORCE 设置为 FALSE,则该脚本将拒绝动态重新配置操作,并列显以下消息:


    rcm_failure_reason=tape backup in progress pid=...

    如果将 RCM_ENV_FORCE 设置为 TRUE,则将停止备份应用程序,重新配置操作则继续进行。

磁带备份重新配置方案的结果

以下是使用 cfgadm 命令移除不包含 RCM 脚本的磁带设备时的各种结果。

以下是使用 cfgadm 命令移除包含 RCM 脚本的磁带设备时的各种结果。

示例-磁带备份 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);

            }

    }