ETERNUS SF AdvancedCopy Manager 運用手引書 テープバックアップ連携編 13.0 -Microsoft(R) Windows(R) 2000/Microsoft(R) Windows Sever(TM) 2003-, -Solaris-, -HP-UX-, -Linux-, -AIX- |
目次 索引 |
本章では、AdvancedCopy Managerのバックアップ、リストア、およびテープコピーの前後処理を行うシェルスクリプトについて説明します。
バックアップ/リストア/テープコピーの前後処理のシェルスクリプトは、「バックアップ実行コマンド(acmbackup)」、「リストア実行コマンド(acmrestore)」、または「テープコピーコマンド(acmtphistcopy)」を実行した際、バックアップ処理/リストア処理/テープコピー処理の前後で起動されます。
これらのシェルスクリプトには、AdvancedCopy Managerテープバックアップが、業務ボリュームのバックアップ/リストア/テープコピーを行う際に必要な処理を記述します。
この章では、前後処理の設定について説明します。
バックアップの前後処理は、以下のようにacmbackupコマンドを実行したときのディスクバックアップ処理で実行されます。
バックアップの前後処理については、StorageサーバのOSに対応する『ETERNUS SF AdvancedCopy Manager 運用手引書』の付録「バックアップの前後処理」を参照してください。
リストアの前後処理は、acmrestoreコマンドを実行したときに常に実行されます。
リストアの前後処理については、StorageサーバのOSに対応する『ETERNUS SF AdvancedCopy Manager 運用手引書』の付録「リストアの前後処理」を参照してください。
テープコピーの前後処理は、以下のようにacmbackupコマンドを実行したときのテープバックアップ処理で実行されます。
また、acmhistcopyコマンドを実行したときに常に実行されます。
[Solaris/Linux/HP-UX/AIXの場合]
AdvancedCopy Managerでのテープコピーでは、基本的にテープコピー対象のバックアップボリュームがアンマウントされた状態で処理を行う必要があります。
そのため、通常、前処理では、テープコピー対象のバックアップ履歴のバックアップボリュームから、そのボリュームのマウント状態を獲得し、次の処理を行います。
バックアップボリュームの状態 |
前処理 |
---|---|
マウントされている |
バックアップボリュームをアンマウントします。 |
アンマウントされている |
何も処理しません。 |
後処理は、テープコピーでは何も行いません。このため、テープコピー実行前にマウントされていたバックアップボリュームは、テープコピー実行後にはアンマウントされた状態となります。
ユーザー固有の処理を前後処理に追加する必要がある場合は、テープコピー前後処理スクリプトに処理を追加します。
[Windowsの場合]
AdvancedCopy Managerでのバックアップは、基本的に業務ボリュームが他のプロセスからアクセスできない状態で処理を行う必要があります。
そのため、通常前処理では、バックアップボリュームをロックします。
後処理では、バックアップボリュームのロックの解除をします
また、このロックおよびロック解除の処理は、プログラム内で実施します。このロック処理の動作は、テープコピー用バックアップボリュームロック動作指定ファイルと呼ばれる設定ファイルを作成することにより変更できます。
ユーザー固有の処理を前後処理に追加する必要がある場合は、テープコピー前後処理スクリプトに処理を追加します。
これらのスクリプトはJScript言語で記述されており、Windows Scripting Host(WSH)上で実行されます。
[Solaris/Linux/HP-UX/AIXの場合]
クラスタ環境に適応するように、前処理シェルスクリプトを変更する必要があります。
シングル構成の場合、前述の通り、AdvancedCopy Managerでのテープコピーでは、基本的にテープコピー対象のバックアップボリュームがアンマウントされた状態で処理を行う必要があります。一方、クラスタ構成では、バックアップボリュームのアンマウント処理の代わりにオフライン処理を行う必要があります。
例えば、クラスタシステムとしてSolarisのVERITASクラスタサービスを使用している場合、以下のように前処理シェルスクリプト(「テープコピー実行時の前処理」に記載されているTapeCopy.preファイル)を書き換えます。
現在 |
(lines 74) /usr/sbin/umount $cur_mount_point 2>/dev/null |
書き換え後 |
/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サーバがシングル構成の場合と同様です。
テープコピー実行時の前処理のシェルスクリプト名は、以下の通りです。
/etc/opt/FJSVswsts/sh/TapeCopy.pre
/etc/opt/FJSVswsts/<論理ノード名>/sh/TapeCopy.pre
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 |
テープコピー実行時の後処理のシェルスクリプト名は、以下の通りです。
/etc/opt/FJSVswsts/sh/TapeCopy.post
/etc/opt/FJSVswsts/<論理ノード名>/sh/TapeCopy.post
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 |
テープコピー実行時の前処理のシェルスクリプト名は、以下の通りです。
/etc/opt/FJSVswsts/sh/TapeCopy.pre
/etc/opt/FJSVswsts/<論理ノード名>/sh/TapeCopy.pre
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 |
テープコピー実行時の後処理のシェルスクリプト名は、以下の通りです。
/etc/opt/FJSVswsts/sh/TapeCopy.post
/etc/opt/FJSVswsts/<論理ノード名>/sh/TapeCopy.post
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 |
テープコピー実行時の前処理のシェルスクリプト名は、以下の通りです。
/etc/opt/FJSVswsts/sh/TapeCopy.pre
/etc/opt/FJSVswsts/<論理ノード名>/sh/TapeCopy.pre
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 |
テープコピー実行時の後処理のシェルスクリプト名は、以下の通りです。
/etc/opt/FJSVswsts/sh/TapeCopy.post
/etc/opt/FJSVswsts/<論理ノード名>/sh/TapeCopy.post
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 |
テープコピー実行時の前処理のシェルスクリプト名は、以下の通りです。
/etc/opt/FJSVswsts/sh/TapeCopy.pre
/etc/opt/FJSVswsts/<論理ノード名>/sh/TapeCopy.pre
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 |
テープコピー実行時の後処理のシェルスクリプト名は、以下の通りです。
/etc/opt/FJSVswsts/sh/TapeCopy.post
/etc/opt/FJSVswsts/<論理ノード名>/sh/TapeCopy.post
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 |
テープコピー実行時の前処理のスクリプトファイル名は、以下の通りです。
“環境設定ディレクトリ”\etc\backup\scripts\TapeCopyPre.js
<共有ディスク>:\etc\opt\swstorage\etc\backup\scripts\TapeCopyPre.js
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 |
テープコピー実行時の後処理のスクリプトファイル名は、以下の通りです。
“環境設定ディレクトリ”\etc\backup\scripts\TapeCopyPost.js
<共有ディスク>:\etc\opt\swstorage\etc\backup\scripts\TapeCopyPost.js
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のテープコピー用バックアップボリュームロック動作指定ファイル」を参照してください)。
ただし、テープコピー処理実行時に他のプロセスが処理対象ボリュームを使用しないための対策が適切に行われている場合は、通常はこのファイルを作成する必要はありません。
Windowsのテープコピーの前処理では、バックアップボリュームに対して他アプリケーションとの一時的なアクセス競合を回避するために、ロック処理に失敗した場合、ロック処理のリトライを実施します。
標準のリトライ動作は以下の通りです。
リトライ上限(デフォルト値=20回)とリトライ間隔(デフォルト値=1秒)は、テープコピー用バックアップボリュームロック動作指定ファイルと呼ばれる設定ファイルを作成することにより変更できます。
また、この設定ファイルでは、テープコピーの前処理に対して、以下の動作を指示することもできます。
テープコピー用バックアップボリュームロック動作指定ファイルは、資源バックアップコマンド(swstresback)ではバックアップされません。テープコピー用バックアップボリュームロック動作指定ファイルを使用する運用の場合は、copyコマンドなどを使用してバックアップしておく必要があります。
テープコピー用バックアップボリュームロック動作指定ファイルは以下のファイル名で作成してください。
ファイル名 |
[クラスタ運用でない場合] [クラスタ運用の場合] |
テープコピー用バックアップボリュームロック動作指定ファイルの設定例を以下に示します。
[g1d2p1] LockForceMode=on LockRetryNumber=10 LockRetryInterval=10 [g1d2p2] NoPrePost=on [ANY] LockForceMode=off LockRetryNumber=20 LockRetryInterval=100
テープコピー用バックアップボリュームロック動作指定ファイルの作成方法は以下の通りです。
キー |
説明 |
---|---|
LockForceMode |
バックアップボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、リトライを実施する前にボリュームのマウントを解除することを指定します。 off(デフォルト値)=ロックのリトライ前にマウント解除を実施しない ボリュームのマウントが解除されると、そのボリュームに対して開いているハンドルは、全て無効となります。 ※マウント解除後にすぐにボリュームが使用中になってしまう場合には、ロックが取得できないことがあります。 NoPrePostがonに設定されている場合は、本パラメーターは無効となります。 |
LockRetryNumber |
バックアップボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、本パラメーターでリトライ回数を指定します。指定可能な数値は、1から10000までです。 デフォルトの設定値は20(回)です。 指定されたリトライ回数、リトライを実施しても業務ボリュームのロックができない場合は、処理を中断してコマンドを異常終了させます。 NoPrePostがonに設定されている場合は、本パラメーターは無効となります。 |
LockRetryInterval |
バックアップボリュームのロックに失敗した場合、ロック処理のリトライを実施しますが、本オプションでリトライの間隔(ミリ秒単位)を指定します。指定可能な数値は、1から600000(10分)までです。デフォルトの設定値は1000(1秒)です。 NoPrePostがonに設定されている場合は、本パラメーターは無効となります。 |
NoPrePost |
テープコピーの前後処理を実施しないことを指定します。 off(デフォルト値)=テープコピーの前後処理を実施する on=テープコピーの前後処理を実施しない NoPrePostがonに設定されている場合は、他のパラメーター(LockForceMode、LockRetryNumber、LockRetryInterval)はすべて無効となります。 |
目次 索引 |