ETERNUS SF AdvancedCopy Manager 運用手引書 テープバックアップ連携編 13.0 -Microsoft(R) Windows(R) 2000/Microsoft(R) Windows Sever(TM) 2003-, -Solaris-, -HP-UX-, -Linux-, -AIX-
目次 索引 前ページ次ページ

付録A バックアップ/リストア/テープコピーの前後処理

本章では、AdvancedCopy Managerのバックアップ、リストア、およびテープコピーの前後処理を行うシェルスクリプトについて説明します。

A.1 概要 

バックアップ/リストア/テープコピーの前後処理のシェルスクリプトは、「バックアップ実行コマンド(acmbackup)」、「リストア実行コマンド(acmrestore)」、または「テープコピーコマンド(acmtphistcopy)」を実行した際、バックアップ処理/リストア処理/テープコピー処理の前後で起動されます。
これらのシェルスクリプトには、AdvancedCopy Managerテープバックアップが、業務ボリュームのバックアップ/リストア/テープコピーを行う際に必要な処理を記述します。

この章では、前後処理の設定について説明します。

A.2 バックアップの前後処理 

バックアップの前後処理は、以下のようにacmbackupコマンドを実行したときのディスクバックアップ処理で実行されます。

バックアップの前後処理については、StorageサーバのOSに対応する『ETERNUS SF AdvancedCopy Manager 運用手引書』の付録「バックアップの前後処理」を参照してください。

A.3 リストアの前後処理 

リストアの前後処理は、acmrestoreコマンドを実行したときに常に実行されます。

リストアの前後処理については、StorageサーバのOSに対応する『ETERNUS SF AdvancedCopy Manager 運用手引書』の付録「リストアの前後処理」を参照してください。

A.4 テープコピーの前後処理 

テープコピーの前後処理は、以下のようにacmbackupコマンドを実行したときのテープバックアップ処理で実行されます。

また、acmhistcopyコマンドを実行したときに常に実行されます。

■Storageサーバがシングル構成の場合

[Solaris/Linux/HP-UX/AIXの場合]

AdvancedCopy Managerでのテープコピーでは、基本的にテープコピー対象のバックアップボリュームがアンマウントされた状態で処理を行う必要があります。

そのため、通常、前処理では、テープコピー対象のバックアップ履歴のバックアップボリュームから、そのボリュームのマウント状態を獲得し、次の処理を行います。

バックアップボリュームの状態

前処理

マウントされている

バックアップボリュームをアンマウントします。

アンマウントされている

何も処理しません。

後処理は、テープコピーでは何も行いません。このため、テープコピー実行前にマウントされていたバックアップボリュームは、テープコピー実行後にはアンマウントされた状態となります。

ユーザー固有の処理を前後処理に追加する必要がある場合は、テープコピー前後処理スクリプトに処理を追加します。

[Windowsの場合]

AdvancedCopy Managerでのバックアップは、基本的に業務ボリュームが他のプロセスからアクセスできない状態で処理を行う必要があります。

そのため、通常前処理では、バックアップボリュームをロックします。

後処理では、バックアップボリュームのロックの解除をします

また、このロックおよびロック解除の処理は、プログラム内で実施します。このロック処理の動作は、テープコピー用バックアップボリュームロック動作指定ファイルと呼ばれる設定ファイルを作成することにより変更できます。

ユーザー固有の処理を前後処理に追加する必要がある場合は、テープコピー前後処理スクリプトに処理を追加します。

これらのスクリプトはJScript言語で記述されており、Windows Scripting Host(WSH)上で実行されます。

■Storageサーバがクラスタ構成の場合

[Solaris/Linux/HP-UX/AIXの場合]

クラスタ環境に適応するように、前処理シェルスクリプトを変更する必要があります。

シングル構成の場合、前述の通り、AdvancedCopy Managerでのテープコピーでは、基本的にテープコピー対象のバックアップボリュームがアンマウントされた状態で処理を行う必要があります。一方、クラスタ構成では、バックアップボリュームのアンマウント処理の代わりにオフライン処理を行う必要があります。

例えば、クラスタシステムとしてSolarisのVERITASクラスタサービスを使用している場合、以下のように前処理シェルスクリプト(「テープコピー実行時の前処理」に記載されているTapeCopy.preファイル)を書き換えます。

現在

(lines 74) /usr/sbin/umount $cur_mount_point 2>/dev/null
(lines 83) /usr/sbin/umount $cur_mount_point > $err_log_path/$dev.umount 2>&1

書き換え後

/opt/VRTSvcs/bin/hares -offline resouce_name -sys system_name

マウントポイントリソースに対するオフライン操作を実施してからボリュームが実際にアンマウントされるまでに時間差があります。このため、以下のように、オフラインの成否判定を行っている箇所の後に、アンマウント完了を待ち合わせる処理(例えば、sleepコマンドやdfコマンドの結果の監視)を追加してください。
テープコピー実行時の前処理」に記載されているTapeCopy.preでは、102行目と103行目の間に以下の行を追加します。

while /usr/sbin/df -l "$device">/dev/null 2>&1; do :; done

Storageサーバをクラスタ運用する場合の注意事項については、StorageサーバのOSに対応する『ETERNUS SF AdvancedCopy Manager 運用手引書』の以下の節を参照してください。

[Windowsの場合]

Storageサーバがシングル構成の場合と同様です。

A.4.1 Solarisのテープコピー実行時の前処理

テープコピー実行時の前処理のシェルスクリプト名は、以下の通りです。

     1    #!/bin/sh
     2    
     3    # AdvancedCopy Manager
     4    # All Rights Reserved, Copyright FUJITSU LIMITED, 2005-2006
     5    
     6    #
     7    #   Preprocessing of tape copy processing
     8    #
     9    #       Argument: $1 Device name of backup disk
    10    #                 $2 Reserve
    11    #
    12    #    Error number
    13    #         2: Argument error
    14    #        10: umount error
    15    
    16    
    17    # Argument check
    18    case $# in
    19    1)
    20        ;;
    21    2)
    22        ;;
    23    *)
    24        exit 2
    25        ;;
    26    esac
    27    
    28    device="`echo $1`"
    29    
    30    # Determination postprocessing file name
    31    
    32    if [ "$SWSTGNODE" != "" ]
    33    then
    34        swstg_node="/`echo $SWSTGNODE`"
    35    else
    36        swstg_node=""
    37    fi
    38    
    39    err_log_path="/var/opt/FJSVswsts"$swstg_node"/log"
    40    
    41    if [ "`echo $device | /usr/bin/grep "/dev/dsk/"`" != "" ]
    42    then
    43        # /dev/dsk/c?t?d?s? -> c?t?d?s?
    44        dev="`echo $device | /usr/bin/sed "s/\/dev\/dsk\///"`"
    45    elif [ "`echo $device | /usr/bin/grep "/dev/FJSV"`" != "" ]
    46    then
    47        # /dev/FJSVmphd/dsk/mplb?s? -> /dev/FJSVmphd/dsk/mplb?s?
    48        # /dev/FJSVmphd/dsk/mphd?s? -> /dev/FJSVmphd/dsk/mphd?s?
    49        dev="`echo $device | /usr/bin/cut -d/ -f5`"
    50    elif [ "`echo $device | /usr/bin/grep "/dev/sfdsk/"`" != "" ]
    51    then
    52        # /dev/sfdsk/class/dsk/volume -> _gds_class_volume
    53        dev="_gds_`echo $device | /usr/bin/sed "s/\/dev\/sfdsk\///"`"
    54        dev="`echo $dev | /usr/bin/sed "s/\/dsk\//_/"`"
    55    elif [ "`echo $device | /usr/bin/grep "/dev/vx/dsk/"`" != "" ]
    56    then
    57        # /dev/vx/dsk/volume -> _vx_rootdg_volume
    58        # /dev/vx/dsk/disk-group/volume -> _vx_disk-group_volume
    59        dev=_vx_"`echo $device | /usr/bin/awk -F\/ '{ if (NF == 6) { print $5"_"$6 } else print "rootdg_"$5 }'`"
    60    elif [ "`echo $device | /usr/bin/grep "/dev/vx/dmp/"`" != "" ]
    61    then
    62        # /dev/vx/dmp/device -> _vx_pv_device
    63        dev=_vx_pv_"`echo $device | /usr/bin/cut -d/ -f5`"
    64    else
    65        exit 0
    66    fi
    67    post_file="/etc/opt/FJSVswsts"$swstg_node"/data/DEFAULT/"$dev".pre"
    68    
    69    # Device unmount process.
    70    #
    71    cur_mount_point=`/usr/sbin/mount | grep "$device " | cut -f1 -d' '`
    72    if [ "$cur_mount_point" != "" ]
    73    then
    74        /usr/sbin/umount $cur_mount_point 2>/dev/null
    75        if [ $? != 0 ]
    76        then
    77            retry_count=3
    78            sleep_time=1
    79            result_flag=1
    80    
    81            while [ $retry_count -gt 0 ]
    82            do
    83                /usr/sbin/umount $cur_mount_point > $err_log_path/$dev.umount 2>&1
    84                if [ $? != 0 ]
    85                then
    86                    retry_count=`expr $retry_count - 1`
    87                    /usr/bin/sleep $sleep_time
    88                else
    89                    /usr/bin/rm -f $err_log_path/$dev.umount
    90                    result_flag=0
    91                    break
    92                fi
    93            done
    94    
    95            if [ $result_flag != 0 ]
    96            then
    97                /usr/sbin/fuser -cu $cur_mount_point> $err_log_path/$dev.fuser 2>&1 
    98                /usr/bin/ps -ef > $err_log_path/$dev.ps 2>&1 
    99    
   100                exit 10
   101            fi
   102        fi
   103        echo "mount" > $post_file
   104    
   105    # When device was not mounted
   106    #
   107    else
   108        echo "none" > $post_file
   109    fi
   110    exit 0

A.4.2 Solarisのテープコピー実行時の後処理 

テープコピー実行時の後処理のシェルスクリプト名は、以下の通りです。

     1    #!/bin/sh
     2    
     3    # AdvancedCopy Manager
     4    # All Rights Reserved, Copyright FUJITSU LIMITED, 2005-2006
     5    
     6    #
     7    #   Postprocessing of tape copy processing
     8    #
     9    #        Argument: $1 Device name of backup disk
    10    #                  $2 Reserve
    11    #
    12    #    Error number
    13    #         2: Argument error
    14    
    15    # Argument check
    16    case $# in
    17    1)
    18        ;;
    19    2)
    20        ;;
    21    *)
    22        exit 2
    23        ;;
    24    esac
    25    
    26    device="`echo $1`"
    27    
    28    # Determination of postprocessing file name
    29    
    30    if [ "$SWSTGNODE" != "" ]
    31    then
    32    swstg_node="/`echo $SWSTGNODE`"
    33    else
    34    swstg_node=""
    35    fi
    36    
    37    err_log_path="/var/opt/FJSVswsts"$swstg_node"/log"
    38    
    39    if [ "`echo $device | /usr/bin/grep "/dev/dsk/"`" != "" ]
    40    then
    41        # /dev/dsk/c?t?d?s? -> c?t?d?s?
    42        dev="`echo $device | /usr/bin/sed "s/\/dev\/dsk\///"`"
    43    elif [ "`echo $device | /usr/bin/grep "/dev/FJSV"`" != "" ]
    44    then
    45        # /dev/FJSVmphd/dsk/mplb?s? -> /dev/FJSVmphd/dsk/mplb?s?
    46        # /dev/FJSVmphd/dsk/mphd?s? -> /dev/FJSVmphd/dsk/mphd?s?
    47        dev="`echo $device | /usr/bin/cut -d/ -f5`"
    48    elif [ "`echo $device | /usr/bin/grep "/dev/sfdsk/"`" != "" ]
    49    then
    50        # /dev/sfdsk/class/dsk/volume -> _gds_class_volume
    51        dev="_gds_`echo $device | /usr/bin/sed "s/\/dev\/sfdsk\///"`"
    52        dev="`echo $dev | /usr/bin/sed "s/\/dsk\//_/"`"
    53    elif [ "`echo $device | /usr/bin/grep "/dev/vx/dsk/"`" != "" ]
    54    then
    55        # /dev/vx/dsk/volume -> _vx_rootdg_volume
    56        # /dev/vx/dsk/disk-group/volume -> _vx_disk-group_volume
    57        dev=_vx_"`echo $device | /usr/bin/awk -F\/ '{ if (NF == 6) { print $5"_"$6 } else print "rootdg_"$5 }'`"
    58    elif [ "`echo $device | /usr/bin/grep "/dev/vx/dmp/"`" != "" ]
    59    then
    60        # /dev/vx/dmp/device -> _vx_pv_device
    61        dev=_vx_pv_"`echo $device | /usr/bin/cut -d/ -f5`"
    62    else
    63        exit 0
    64    fi
    65    post_file="/etc/opt/FJSVswsts"$swstg_node"/data/DEFAULT/"$dev".pre"
    66    
    67    # Confirmation of postprocessing
    68    if [ ! -r $post_file ]
    69    then
    70        exit 0
    71    fi
    72    
    73    /usr/bin/rm -f $post_file 2> /dev/null
    74    exit 0

A.4.3 Linuxのテープコピー実行時の前処理 

テープコピー実行時の前処理のシェルスクリプト名は、以下の通りです。

     1    #!/bin/sh
     2    
     3    # AdvancedCopy Manager
     4    # All Rights Reserved, Copyright FUJITSU LIMITED, 2005-2006
     5    
     6    #
     7    #   Preprocessing of tape copy processing
     8    #
     9    #       Argument: $1 Device name of backup disk
    10    #                 $2 Reserve
    11    #
    12    #    Error number
    13    #         2: Argument error
    14    #        10: umount error
    15    #        13: Illegal mount type (bind/stack mount)
    16    
    17    
    18    # Argument check
    19    case $# in
    20    1)
    21        ;;
    22    2)
    23        ;;
    24    *)
    25        exit 2
    26        ;;
    27    esac
    28    
    29    device="`echo $1`"
    30    
    31    # Determination postprocessing file name
    32    
    33    if [ "$SWSTGNODE" != "" ]
    34    then
    35    swstg_node="/`echo $SWSTGNODE`"
    36    else
    37    swstg_node=""
    38    fi
    39    
    40    err_log_path="/var/opt/FJSVswsts"$swstg_node"/log"
    41    
    42    if [ "`echo $device | /bin/grep "/dev/sd"`" != "" ]
    43    then
    44        # /dev/sd? -> sd?
    45        dev="`echo $device | /bin/sed "s/\/dev\///"`"
    46    elif [ "`echo $device | /bin/grep "/dev/FJSV"`" != "" ]
    47    then
    48        # /dev/FJSVmphd/dsk/mplb?s? -> mplb?s?
    49        # /dev/FJSVmphd/dsk/mphd?s? -> mphd?s?
    50        dev="`echo $device | /bin/cut -d/ -f5`"
    51    elif [ "`echo $device | /bin/grep "/dev/sfdsk/"`" != "" ]
    52    then
    53        # /dev/sfdsk/class/dsk/volume -> _gds_class_volume
    54        dev="_gds_`echo $device | /bin/sed "s/\/dev\/sfdsk\///"`"
    55        dev="`echo $dev | /bin/sed "s/\/dsk\//_/"`"
    56    else
    57        exit 0
    58    fi
    59    post_file="/etc/opt/FJSVswsts"$swstg_node"/data/DEFAULT/"$dev".pre"
    60    
    61    cur_mount_point=`/bin/mount | grep "$device " | cut -f3 -d' '`
    62    if [ "$cur_mount_point" != "" ]
    63    then
    64    
    65        if [ `/bin/cat /proc/mounts |/bin/cut -d' ' -f 2|/bin/grep "^$cur_mount_point\$"|/usr/bin/wc -w` != 1 ]; then
    66            # stack mount (multi device on $cur_mount_point)
    67            /bin/mount  > $err_log_path/$dev.umount 2>&1
    68            exit 13
    69        fi
    70        if [ `/bin/cat /proc/mounts |/bin/cut -d' ' -f 1|/bin/grep "^$device\$"|/usr/bin/wc -w` != 1 ]; then
    71            # bind mount (device has multi mount point)
    72            /bin/mount  > $err_log_path/$dev.umount 2>&1
    73            exit 13
    74        fi
    75    
    76        /bin/umount $cur_mount_point 2>/dev/null
    77        if [ $? != 0 ]
    78        then
    79            retry_count=3
    80            sleep_time=1
    81            result_flag=1
    82    
    83            while [ $retry_count -gt 0 ]
    84            do
    85                /bin/umount $cur_mount_point > $err_log_path/$dev.umount 2>&1
    86                if [ $? != 0 ]
    87                then
    88                    retry_count=`expr $retry_count - 1`
    89                    /bin/sleep $sleep_time
    90                else
    91                    /bin/rm -f $err_log_path/$dev.umount
    92                    result_flag=0
    93                    break
    94                fi
    95            done
    96    
    97            if [ $result_flag != 0 ]
    98            then
    99                /sbin/fuser -vu $cur_mount_point> $err_log_path/$dev.fuser 2>&1 
   100                /bin/ps -ef > $err_log_path/$dev.ps 2>&1 
   101    
   102                exit 10
   103            fi
   104        fi
   105        echo "mount" > $post_file
   106    
   107    # When device was not mounted
   108    #
   109    else
   110        echo "none" > $post_file
   111    fi
   112    
   113    exit 0

A.4.4 Linuxのテープコピー実行時の後処理 

テープコピー実行時の後処理のシェルスクリプト名は、以下の通りです。

     1    #!/bin/sh
     2    
     3    # AdvancedCopy Manager
     4    # All Rights Reserved, Copyright FUJITSU LIMITED, 2005-2006
     5    
     6    #
     7    #   Postprocessing of tape copy processing
     8    #
     9    #        Argument: $1 Device name of backup disk
    10    #                  $2 Reserve
    11    #
    12    #    Error number
    13    #         2: Argument error
    14    
    15    # Argument check
    16    case $# in
    17    1)
    18        ;;
    19    2)
    20        ;;
    21    *)
    22        exit 2
    23        ;;
    24    esac
    25    
    26    device="`echo $1`"
    27    
    28    # Determination of postprocessing file name
    29    
    30    if [ "$SWSTGNODE" != "" ]
    31    then
    32    swstg_node="/`echo $SWSTGNODE`"
    33    else
    34    swstg_node=""
    35    fi
    36    
    37    err_log_path="/var/opt/FJSVswsts"$swstg_node"/log"
    38    
    39    if [ "`echo $device | /bin/grep "/dev/sd"`" != "" ]
    40    then
    41        # /dev/sd? -> sd?
    42        dev="`echo $device | /bin/sed "s/\/dev\///"`"
    43    elif [ "`echo $device | /bin/grep "/dev/FJSV"`" != "" ]
    44    then
    45        # /dev/FJSVmphd/dsk/mplb?s? -> mplb?s?
    46        # /dev/FJSVmphd/dsk/mphd?s? -> mphd?s?
    47        dev="`echo $device | /bin/cut -d/ -f5`"
    48    elif [ "`echo $device | /bin/grep "/dev/sfdsk/"`" != "" ]
    49    then
    50        # /dev/sfdsk/class/dsk/volume -> _gds_class_volume
    51        dev="_gds_`echo $device | /bin/sed "s/\/dev\/sfdsk\///"`"
    52        dev="`echo $dev | /bin/sed "s/\/dsk\//_/"`"
    53    else
    54        exit 0
    55    fi
    56    post_file="/etc/opt/FJSVswsts"$swstg_node"/data/DEFAULT/"$dev".pre"
    57    
    58    # Confirmation of postprocessing
    59    if [ ! -r $post_file ]
    60    then
    61        exit 0
    62    fi
    63    /bin/rm -f $post_file 2> /dev/null
    64    
    65    exit 0

A.4.5 HP-UXのテープコピー実行時の前処理 

テープコピー実行時の前処理のシェルスクリプト名は、以下の通りです。

     1    #!/bin/sh
     2    
     3    # AdvancedCopy Manager
     4    # All Rights Reserved, Copyright FUJITSU LIMITED, 2005-2006
     5    
     6    #
     7    #   Preprocessing of tape copy processing
     8    #
     9    #       Argument: $1 Device or VG name of backup disk
    10    #                 $2 Reserve
    11    #
    12    #       Error number
    13    #               2: Argument error
    14    #              10: umount error
    15    
    16    
    17    # Argument check
    18    case $# in
    19    1)
    20            ;;
    21    2)
    22            ;;
    23    *)
    24            exit 2
    25            ;;
    26    esac
    27    
    28    device=$1
    29    
    30    # Determination postprocessing file name
    31    if [ "$SWSTGNODE" != "" ]
    32    then
    33            swstg_node="/`echo $SWSTGNODE`"
    34    else
    35            swstg_node=""
    36    fi
    37    
    38    err_log_path="/var/opt/FJSVswsts"$swstg_node"/log"
    39    
    40    # Device type check
    41    trans="`echo $device | /usr/bin/grep "/dev/dsk/"`"
    42    lvmtrans="`echo $device | /usr/bin/grep "/dev/"`"
    43    vxpvtrans="`echo $device | /usr/bin/grep "/dev/vx/dmp/"`"
    44    if [ "$trans" != "" ]
    45    then
    46            dev="`echo $device | /usr/bin/sed "s/\/dev\/dsk\///"`"
    47    elif [ "$vxpvtrans" != "" ]
    48    then
    49            dev_type="vxvm_pv"
    50            # /dev/vx/dmp/XXXX -> XXXX
    51            dev="`echo $device | /usr/bin/awk -F\/ '{ print $5 }'`"
    52    elif [ "$lvmtrans" != "" ]
    53    then
    54            # /dev/XXXX -> XXXX
    55            dev="`echo $device | /usr/bin/awk -F\/ '{ print $3 }'`"
    56    else
    57            exit 0
    58    fi
    59    
    60    post_file="/etc/opt/FJSVswsts"$swstg_node"/data/DEFAULT/"$dev".pre"
    61    
    62    if [ "$trans" != "" ]
    63    then
    64        # Physical volume
    65        cur_mount_list=`/usr/sbin/mount | grep " $device" | cut -f1 -d' '`
    66    elif [ "$vxpvtrans" != "" ]
    67    then
    68        # VxVM PV
    69        cur_mount_list=""
    70    else
    71        # Logical volume
    72        cur_mount_list=`/usr/sbin/mount | grep " $device/" | cut -f1 -d' '`
    73    fi
    74    # Device unmount process.
    75    #
    76    if [ "$cur_mount_list" != "" ]
    77    then
    78        for cur_mount in $cur_mount_list
    79        do
    80            /usr/sbin/umount $cur_mount 2>/dev/null
    81            if [ $? != 0 ]
    82            then
    83                retry_count=3
    84                sleep_time=1
    85                result_flag=1
    86    
    87                while [ $retry_count -gt 0 ]
    88                do
    89                    /usr/sbin/umount $cur_mount > $err_log_path/$dev.umount 2>&1
    90                    if [ $? != 0 ]
    91                    then
    92                        retry_count=`expr $retry_count - 1`
    93                        /usr/bin/sleep $sleep_time
    94                    else
    95                        /usr/bin/rm -f $err_log_path/$dev.umount
    96                        result_flag=0
    97                        break
    98                    fi
    99                done
   100    
   101                if [ $result_flag != 0 ]
   102                then
   103                    /usr/sbin/fuser -cu $cur_mount> $err_log_path/$dev.fuser 2>&1
   104                    /usr/bin/ps -ef > $err_log_path/$dev.ps 2>&1 
   105                    exit 10
   106                fi
   107            fi
   108        done
   109        echo "mount" > $post_file
   110    
   111    # When device was not mounted
   112    #
   113    else
   114        echo "none" > $post_file
   115    fi
   116    
   117    exit 0

A.4.6 HP-UXのテープコピー実行時の後処理 

テープコピー実行時の後処理のシェルスクリプト名は、以下の通りです。

     1    #!/bin/sh
     2    
     3    # AdvancedCopy Manager
     4    # All Rights Reserved, Copyright FUJITSU LIMITED, 2005-2006
     5    
     6    #
     7    #   Postprocessing of tape copy processing
     8    #
     9    #               Argument: $1 Device or VG name of backup disk
    10    #                         $2 Reserve
    11    #
    12    #       Error number
    13    #                2: Argument error
    14    
    15    # Argument check
    16    case $# in
    17    1)
    18            ;;
    19    2)
    20            ;;
    21    *)
    22            exit 2
    23            ;;
    24    esac
    25    
    26    device=$1
    27    
    28    # Determination of postprocessing file name
    29    
    30    if [ "$SWSTGNODE" != "" ]
    31    then
    32            swstg_node="/`echo $SWSTGNODE`"
    33    else
    34            swstg_node=""
    35    fi
    36    
    37    err_log_path="/var/opt/FJSVswsts"$swstg_node"/log"
    38    
    39    # Device type check
    40    trans="`echo $device | /usr/bin/grep "/dev/dsk/"`"
    41    lvmtrans="`echo $device | /usr/bin/grep "/dev/"`"
    42    vxpvtrans="`echo $device | /usr/bin/grep "/dev/vx/dmp/"`"
    43    if [ "$trans" != "" ]
    44    then
    45            dev="`echo $device | /usr/bin/sed "s/\/dev\/dsk\///"`"
    46    elif [ "$vxpvtrans" != "" ]
    47    then
    48            dev_type="vxvm_pv"
    49            # /dev/vx/dmp/XXXX -> XXXX
    50            dev="`echo $device | /usr/bin/awk -F\/ '{ print $5 }'`"
    51    elif [ "$lvmtrans" != "" ]
    52    then
    53            # /dev/vgXX -> vgXX
    54            dev="`echo $device | /usr/bin/awk -F\/ '{ print $3 }'`"
    55    else
    56            exit 0
    57    fi
    58    post_file="/etc/opt/FJSVswsts"$swstg_node"/data/DEFAULT/"$dev".pre"
    59    
    60    # Confirmation of postprocessing
    61    if [ ! -r $post_file ]
    62    then
    63            exit 0
    64    fi
    65    /usr/bin/rm -f $post_file 2> /dev/null
    66    
    67    exit 0

A.4.7 AIXのテープコピー実行時の前処理 

テープコピー実行時の前処理のシェルスクリプト名は、以下の通りです。

     1    #!/bin/sh
     2    
     3    # AdvancedCopy Manager
     4    # All Rights Reserved, Copyright FUJITSU LIMITED, 2005-2006
     5    
     6    #
     7    #   Preprocessing of tape copy processing
     8    #
     9    #       Argument: $1 VG name of backup disk
    10    #                 $2 Reserve
    11    #
    12    #       Error number
    13    #               2: Argument error
    14    #              10: umount error
    15    
    16    # Argument check
    17    case $# in
    18    1)
    19            ;;
    20    2)
    21            ;;
    22    *)
    23            exit 2
    24            ;;
    25    esac
    26    
    27    device=$1
    28    
    29    if [ "$SWSTGNODE" != "" ]
    30    then
    31            swstg_node="/`echo $SWSTGNODE`"
    32    else
    33            swstg_node=""
    34    fi
    35    
    36    err_log_path="/var/opt/FJSVswsts"$swstg_node"/log"
    37    
    38    # Determination of postprocessing file name
    39    if [ "`echo $device | /usr/bin/grep "/dev/hdisk"`" != "" ]
    40    then
    41        dev_type="lvm_pv"
    42        # /dev/hdisk? -> hdisk?
    43        dev="`echo $device | /usr/bin/awk -F\/ '{ print $3 }'`"
    44    
    45    elif [ "`echo $device | /usr/bin/grep "/dev/vx/dmp/"`" != "" ]
    46    then
    47        dev_type="vxvm_pv"
    48        # /dev/vx/dmp/device -> device
    49        dev="`echo $device | /usr/bin/awk -F\/ '{ print $5 }'`"
    50    
    51    elif [ "`echo $device | /usr/bin/grep "/dev/"`" != "" ]
    52    then
    53        dev_type="lvm_vg"
    54        # /dev/VG_Name -> VG_Name
    55        dev="`echo $device | /usr/bin/awk -F\/ '{ print $3 }'`"
    56    
    57    else
    58        # Other Volume
    59        exit 0
    60    fi
    61    
    62    post_file="/etc/opt/FJSVswsts"$swstg_node"/data/DEFAULT/"$dev".pre"
    63    
    64    # When the backup disk is a volume group #####################################
    65    if [ "$dev_type" = "lvm_vg" ]
    66    then
    67    
    68            # Devices is volume group and script not customize
    69            exit 99
    70    
    71    # When devices of volume group was mounted
    72    #        # Specify the name of volume group to unmount
    73    #        if [ "$device" = "/dev/vg**" ]
    74    #        then
    75    #
    76    #               # Unmount all logical volumes of the volume group
    77    #               mount_point="/**"
    78    #               /usr/sbin/umount $mount_point 2>/dev/null
    79    #               if [ $? != 0 ]
    80    #               then
    81    #                   retry_count=3
    82    #                   sleep_time=1
    83    #                   result_flag=1
    84    #
    85    #                   while [ $retry_count -gt 0 ]
    86    #                   do
    87    #                       /usr/sbin/umount $mount_point > $err_log_path/$dev.umount 2>&1
    88    #                       if [ $? != 0 ]
    89    #                       then
    90    #                           retry_count=`expr $retry_count - 1`
    91    #                           /usr/bin/sleep $sleep_time
    92    #                       else
    93    #                           /usr/bin/rm -f $err_log_path/$dev.umount
    94    #                           result_flag=0
    95    #                           break
    96    #                       fi
    97    #                   done
    98    #
    99    #                   if [ $result_flag != 0 ]
   100    #                   then
   101    #                       /usr/sbin/fuser -cu $mount_point> $err_log_path/$dev.fuser 2>&1 
   102    #                       /usr/bin/ps -ef > $err_log_path/$dev.ps 2>&1 
   103    #
   104    #                       exit 10
   105    #                   fi
   106    #               fi
   107    #               echo "mount" > $post_file
   108    #        fi
   109    
   110    # When the backup disk is a VxVM physical volume #############################
   111    elif [ "$dev_type" = "vxvm_pv" ]
   112    then
   113            # Nothing is done to VxVM physical volume. 
   114            echo "none" > $post_file
   115    
   116    # When the backup disk is a LVM physical volume ##############################
   117    elif [ "$dev_type" = "lvm_pv" ]
   118    then
   119            # Nothing is done to LVM physical volume. 
   120            echo "none" > $post_file
   121    
   122    fi
   123    exit 0

A.4.8 AIXのテープコピー実行時の後処理 

テープコピー実行時の後処理のシェルスクリプト名は、以下の通りです。

     1    #!/bin/sh
     2    
     3    # AdvancedCopy Manager
     4    # All Rights Reserved, Copyright FUJITSU LIMITED, 2005-2006
     5    
     6    #
     7    #   Postprocessing of tape copy processing
     8    #
     9    #               Argument: $1 VG name of backup disk
    10    #                         $2 Reserve
    11    #
    12    #       Error number
    13    #                2: Argument error
    14    
    15    # Argument check
    16    case $# in
    17    1)
    18            ;;
    19    2)
    20            ;;
    21    *)
    22            exit 2
    23            ;;
    24    esac
    25    
    26    device=$1
    27    
    28    if [ "$SWSTGNODE" != "" ]
    29    then
    30            swstg_node="/`echo $SWSTGNODE`"
    31    else
    32            swstg_node=""
    33    fi
    34    
    35    err_log_path="/var/opt/FJSVswsts"$swstg_node"/log"
    36    
    37    # Determination of postprocessing file name
    38    if [ "`echo $device | /usr/bin/grep "/dev/hdisk"`" != "" ]
    39    then
    40        dev_type="lvm_pv"
    41        # /dev/hdisk? -> hdisk?
    42        dev="`echo $device | /usr/bin/awk -F\/ '{ print $3 }'`"
    43    
    44    elif [ "`echo $device | /usr/bin/grep "/dev/vx/dmp/"`" != "" ]
    45    then
    46        dev_type="vxvm_pv"
    47        # /dev/vx/dmp/device -> device
    48        dev="`echo $device | /usr/bin/awk -F\/ '{ print $5 }'`"
    49    
    50    elif [ "`echo $device | /usr/bin/grep "/dev/"`" != "" ]
    51    then
    52        dev_type="lvm_vg"
    53        # /dev/VG_Name -> VG_Name
    54        dev="`echo $device | /usr/bin/awk -F\/ '{ print $3 }'`"
    55    
    56    else
    57        # Other Volume
    58        exit 0
    59    fi
    60    
    61    post_file="/etc/opt/FJSVswsts"$swstg_node"/data/DEFAULT/"$dev".pre"
    62    
    63    # Confirmation of postprocessing
    64    if [ ! -r $post_file ]
    65    then
    66            exit 0
    67    fi
    68    
    69    /usr/bin/rm -f $post_file 2> /dev/null
    70    exit 0

A.4.9 Windowsのテープコピー実行時の前処理 

テープコピー実行時の前処理のスクリプトファイル名は、以下の通りです。

     1    // AdvancedCopy Manager for Windows
     2    // All Rights Reserved, Copyright FUJITSU LIMITED, 2005-2006
     3    //
     4    // TapeCopyPre.js: Pre-Processing Script for tape copy
     5    //
     6    // [Parameters]
     7    // 1st argument: device name of backup volume
     8    //
     9    // [Return Values]
    10    // 0: The script ended normally.
    11    // 2: The number of the arguments is incorrect.
    12    // 4: An error other than the above occurred.
    13    
    14    try {
    15        // create global objects
    16        var WshShell = WScript.CreateObject("WScript.Shell");              // create Shell object
    17        var WshEnv = WshShell.Environment("PROCESS");                      // create Environment object
    18        var fsObj    = WScript.CreateObject("Scripting.FileSystemObject"); // create FileSystemObject object
    19    
    20        // create SwstTapeCopyPreProc object
    21        var proc = new SwstTapeCopyPreProc();
    22    
    23        // there is nothing to do if the pre/post-processing is not customized
    24        proc.doNothingForDriveLetter();
    25    
    26        SwstQuit(0);
    27    } catch (e) {
    28        SwstQuit(4);
    29    }
    30    
    31    function SwstTapeCopyPreProc()
    32    {
    33        // member variables
    34        this.bvName       = WScript.Arguments.length!=1?SwstQuit(1):WScript.Arguments.Item(0); // device name of transaction volume
    35        this.postFileName = getDataPathName() + "\\" + getPutFileName(this.bvName) + ".pre";   // name of postprocessing file
    36    
    37        // member functions
    38        this.doNothingForDriveLetter = doNothingForDriveLetter; // self-explanatory
    39        this.writePostFile           = writePostFile;           // self-explanatory
    40    }
    41    
    42    function doNothingForDriveLetter()
    43    {
    44        this.writePostFile(this.postFileName, "none");
    45    }
    46    
    47    function writePostFile(postfile, postdata)
    48    {
    49        var overwrite = true; // means to overwrite a file if it exists.
    50        var postFileStream = fsObj.CreateTextFile(postfile, overwrite);
    51        postFileStream.Write(postdata);
    52        postFileStream.Close();
    53    }
    54    
    55    function SwstQuit(exitStatus)
    56    {
    57        switch(exitStatus) {
    58        case 0:
    59            WScript.Quit(0);
    60        case 1:
    61            WScript.Echo("[Tape copy Preprocessing] The number of the arguments is incorrect.");
    62            WScript.Quit(2);
    63        default:
    64            WScript.Echo("[Tape copy Preprocessing] The script exited abnormally.");
    65            WScript.Quit(4);
    66        }
    67    }
    68    
    69    function getDataPathName()
    70    {
    71        return WshShell.RegRead(getSetupInfoKey() + "\\etcPathName") + "\\etc\\backup\\data\\DEFAULT";
    72    }
    73    
    74    function getSetupInfoKey()
    75    {
    76        var nodeName = WshEnv.Item("SWSTGNODE");
    77        if( nodeName != "" ){
    78            return "HKEY_LOCAL_MACHINE\\SOFTWARE\\Fujitsu\\AdvancedCopy Manager\\CurrentVersion\\" + nodeName;
    79        }
    80        return "HKEY_LOCAL_MACHINE\\SOFTWARE\\Fujitsu\\AdvancedCopy Manager\\CurrentVersion";
    81    }
    82    
    83    function getPutFileName(deviceName){
    84        var fileName;
    85        fileName = deviceName;
    86        return(fileName);
    87    }
    88    

A.4.10 Windowsのテープコピー実行時の後処理 

テープコピー実行時の後処理のスクリプトファイル名は、以下の通りです。

     1    // AdvancedCopy Manager for Windows
     2    // All Rights Reserved, Copyright FUJITSU LIMITED, 2005-2006
     3    //
     4    // TapeCopyPost.js: Post-Processing Script for tape copy
     5    //
     6    // [Parameters]
     7    // 1st argument: device name of backup volume
     8    //
     9    // [Return Values]
    10    // 0: The script ended normally.
    11    // 2: The number of the arguments is incorrect.
    12    // 4: An error other than the above occurred.
    13    
    14    try {
    15        // create global objects
    16        var WshShell = WScript.CreateObject("WScript.Shell");              // create Shell object
    17        var WshEnv = WshShell.Environment("PROCESS");                      // create Environment object
    18        var fsObj    = WScript.CreateObject("Scripting.FileSystemObject"); // create FileSystemObject object
    19    
    20        // create SwstTapeCopyPostProc object
    21        var proc = new SwstTapeCopyPostProc();
    22    
    23        // do nothing if postprocessing file exists
    24        if (fsObj.FileExists(proc.postFileName) == false) {
    25            SwstQuit(0);
    26        }
    27    
    28        // get postprocessing type
    29        var postProcType = proc.getPostProcData(proc.postFileName);
    30        switch(postProcType) {
    31        case "none":
    32            proc.doNothing();
    33            break;
    34        }
    35    
    36        // clear temporary files
    37        proc.deletePostFile(proc.postFileName);
    38        SwstQuit(0);
    39    } catch (e) {
    40        SwstQuit(6);
    41    }
    42    
    43    function SwstTapeCopyPostProc()
    44    {
    45        // member variables
    46        this.bvName       = WScript.Arguments.length!=1?SwstQuit(1):WScript.Arguments.Item(0); // device name of transaction volume
    47        this.postFileName = getDataPathName() + "\\" + getPutFileName(this.bvName) + ".pre";   // name of postprocessing file
    48    
    49        // member functions
    50        this.getPostProcData     = getPostProcData;             // self-explanatory
    51        this.doNothing           = doNothing;                   // self-explanatory
    52        this.deletePostFile      = deletePostFile;              // self-explanatory
    53    }
    54    
    55    function getPostProcData(postfile)
    56    {
    57        var iomode = 1;     // means read-only mode
    58        var create = false; // means not to create a file
    59        var postFileStream = fsObj.OpenTextFile(postfile, iomode, create);
    60        var postData = postFileStream.ReadAll();
    61        postFileStream.Close();
    62        return postData;
    63    }
    64    
    65    function doNothing()
    66    {
    67        // do nothing
    68    }
    69    
    70    function deletePostFile(postfile)
    71    {
    72        if (fsObj.FileExists(postfile) == true) {
    73            fsObj.DeleteFile(postfile);
    74        }
    75    }
    76    
    77    function SwstQuit(exitStatus)
    78    {
    79        switch(exitStatus) {
    80        case 0:
    81            WScript.Quit(0);
    82        case 1:
    83            WScript.Echo("[Tape copy Postprocessing] The number of the arguments is incorrect.");
    84            WScript.Quit(2);
    85        default:
    86            WScript.Echo("[Tape copy Postprocessing] The script exited abnormally.");
    87            WScript.Quit(4);
    88        }
    89    }
    90    
    91    function getDataPathName()
    92    {
    93        return WshShell.RegRead(getSetupInfoKey() + "\\etcPathName") + "\\etc\\backup\\data\\DEFAULT";
    94    }
    95    
    96    function getSetupInfoKey()
    97    {
    98        var nodeName = WshEnv.Item("SWSTGNODE");
    99        if( nodeName != "" ){
   100            return "HKEY_LOCAL_MACHINE\\SOFTWARE\\Fujitsu\\AdvancedCopy Manager\\CurrentVersion\\" + nodeName;
   101        }
   102        return "HKEY_LOCAL_MACHINE\\SOFTWARE\\Fujitsu\\AdvancedCopy Manager\\CurrentVersion";
   103    }
   104    
   105    function getPutFileName(deviceName){
   106        var fileName;
   107        fileName = deviceName;
   108        return(fileName);
   109    }

バックアップボリュームのロック/ロック解除処理はスクリプトではなく、プログラム内で実施されています。したがって、テープコピーの前処理スクリプト、テープコピーの後処理スクリプトは、ボリュームのロック/ロック解除処理の直前、直後にそれぞれ実行されます。テープコピーの前後処理スクリプトでは、実質的に何も処理を実施していません。

テープコピーの前処理では、他アプリケーションとの一時的なアクセス競合を回避するために、ロック処理に失敗した場合、ロック処理のリトライを実施します。既定のリトライ回数を超えた場合、コマンドは異常終了します。この場合、バックアップボリュームを使用しているプロセスが存在していますので、アプリケーションやサービスの停止を行う等の対処を実施して、他のプロセスからボリュームが使用されていない状態にしてください。なお、ボリュームロック動作指定ファイルと呼ばれる設定ファイルを作成することにより、規定のリトライ回数の変更を行うことが可能です(詳細は「Windowsのテープコピー用バックアップボリュームロック動作指定ファイル」を参照してください)。

ただし、テープコピー処理実行時に他のプロセスが処理対象ボリュームを使用しないための対策が適切に行われている場合は、通常はこのファイルを作成する必要はありません。

A.4.11 Windowsのテープコピー用バックアップボリュームロック動作指定ファイル

Windowsのテープコピーの前処理では、バックアップボリュームに対して他アプリケーションとの一時的なアクセス競合を回避するために、ロック処理に失敗した場合、ロック処理のリトライを実施します。

標準のリトライ動作は以下の通りです。

リトライ上限(デフォルト値=20回)とリトライ間隔(デフォルト値=1秒)は、テープコピー用バックアップボリュームロック動作指定ファイルと呼ばれる設定ファイルを作成することにより変更できます。

また、この設定ファイルでは、テープコピーの前処理に対して、以下の動作を指示することもできます。

テープコピー用バックアップボリュームロック動作指定ファイルは、資源バックアップコマンド(swstresback)ではバックアップされません。テープコピー用バックアップボリュームロック動作指定ファイルを使用する運用の場合は、copyコマンドなどを使用してバックアップしておく必要があります。

■バックアップ用バックアップボリュームロック動作指定ファイルの作成方法

テープコピー用バックアップボリュームロック動作指定ファイルは以下のファイル名で作成してください。

ファイル名

[クラスタ運用でない場合]
環境設定ディレクトリ\etc\backup\data\TCBACKLOCK.INI

[クラスタ運用の場合]
<共用ディスク>:\etc\opt\swstorage\etc\backup\data\TCBACKLOCK.INI

テープコピー用バックアップボリュームロック動作指定ファイルの設定例を以下に示します。

[g1d2p1]
LockForceMode=on
LockRetryNumber=10
LockRetryInterval=10
[g1d2p2]
NoPrePost=on
[ANY]
LockForceMode=off
LockRetryNumber=20
LockRetryInterval=100

テープコピー用バックアップボリュームロック動作指定ファイルの作成方法は以下の通りです。

◆TCBACKLOCK.INIの設定項目

キー

説明

LockForceMode

バックアップボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、リトライを実施する前にボリュームのマウントを解除することを指定します。

off(デフォルト値)=ロックのリトライ前にマウント解除を実施しない
on =ロックのリトライ前にマウント解除を実施する

ボリュームのマウントが解除されると、そのボリュームに対して開いているハンドルは、全て無効となります。

※マウント解除後にすぐにボリュームが使用中になってしまう場合には、ロックが取得できないことがあります。

NoPrePostがonに設定されている場合は、本パラメーターは無効となります。

LockRetryNumber

バックアップボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、本パラメーターでリトライ回数を指定します。指定可能な数値は、1から10000までです。

デフォルトの設定値は20(回)です。

指定されたリトライ回数、リトライを実施しても業務ボリュームのロックができない場合は、処理を中断してコマンドを異常終了させます。

NoPrePostがonに設定されている場合は、本パラメーターは無効となります。

LockRetryInterval

バックアップボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、本オプションでリトライの間隔(ミリ秒単位)を指定します。指定可能な数値は、1から600000(10分)までです。デフォルトの設定値は1000(1秒)です。

NoPrePostがonに設定されている場合は、本パラメーターは無効となります。

NoPrePost

テープコピーの前後処理を実施しないことを指定します。

off(デフォルト値)=テープコピーの前後処理を実施する

on=テープコピーの前後処理を実施しない

NoPrePostがonに設定されている場合は、他のパラメーター(LockForceMode、LockRetryNumber、LockRetryInterval)はすべて無効となります。


目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2006