ETERNUS SF AdvancedCopy Manager 運用手引書 13.1 -AIX- |
目次
索引
![]() ![]() |
付録B レプリケーションの前後処理 | > B.2 レプリケーションの前後処理 |
後処理スクリプトには複写元ボリューム(RepSrc.Post)と複写先ボリューム(RepDst.Post)を用意し、以下のディレクトリ配下に格納されています。処理の必要性に応じてスクリプトをカスタマイズしてください。
非クラスタ運用の場合
/etc/opt/FJSVswsrp/shディレクトリ配下 |
クラスタ運用の場合
/etc/opt/FJSVswsrp/<論理ノード名>/shディレクトリ配下 |
RepSrc.post(複写元ボリューム後処理スクリプト)
1: #!/bin/sh 2: 3: # AdvancedCopy Manager 4: # All Rights Reserved, Copyright FUJITSU LIMITED, 2004-2007 5: 6: # 7: # Postprocessing of Replication(Source) processing 8: # 9: # Argument: $1 Device name of Source disk 10: # 11: # Error number 12: # 2: Argument error 13: # 11: mount error 14: 15: # Argument check 16: case $# in 17: 1) 18: ;; 19: *) 20: exit 2 21: ;; 22: esac 23: 24: device=$1 25: 26: # Determination of postprocessing file name 27: if [ "`echo $device | /usr/bin/grep "/dev/hdisk"`" != "" ] 28: then 29: dev_type="lvm_pv" 30: # /dev/hdisk? -> hdisk? 31: dev="`echo $device | /usr/bin/awk -F\/ '{ print $3 }'`" 32: 33: elif [ "`echo $device | /usr/bin/grep "/dev/vx/dmp/"`" != "" ] 34: then 35: dev_type="vxvm_pv" 36: # /dev/vx/dmp/device -> device 37: dev="`echo $device | /usr/bin/awk -F\/ '{ print $5 }'`" 38: 39: elif [ "`echo $device | /usr/bin/grep "/dev/"`" != "" ] 40: then 41: dev_type="lvm_vg" 42: # /dev/VG_Name -> VG_Name 43: dev="`echo $device | /usr/bin/awk -F\/ '{ print $3 }'`" 44: 45: else 46: # Other Volume 47: exit 0 48: fi 49: post_file="/etc/opt/FJSVswsrp/"$SWSTGNODE"/data/DEFAULT/"$dev".spre" 50: 51: err_log_path="/var/opt/FJSVswsrp/"$SWSTGNODE"/log" 52: 53: # Confirmation of postprocessing 54: if [ ! -r $post_file ] 55: then 56: exit 0 57: fi 58: 59: post="`/usr/bin/cat $post_file`" 60: 61: # mount processing 62: if [ "$post" = "mount" ] 63: then 64: 65: # When devices of volume group can be unmounted 66: #Specify the name of volume group to mount 67: 68: if [ "$device" = "/dev/vgXX" ] 69: then 70: mount_error=0 71: # Mount all logical volumes of the volume group 72: lvname="/dev/XX" 73: lv_mount_point="/XX" 74: mount_status=`/usr/sbin/mount | /usr/bin/nawk -v lv=${lvname} 'lv==$1{flag=1; exit;} END{if(flag==1) print "mounted"; else print "not_mounted";}'` 75: if [ $mount_status = "not_mounted" ] 76: then 77: /usr/sbin/mount $lvname $lv_mount_point 2> /dev/null 78: if [ $? != 0 ] 79: then 80: retry_count=3 81: sleep_time=1 82: result_flag=1 83: 84: while [ $retry_count -gt 0 ] 85: do 86: /usr/sbin/mount $lvname $lv_mount_point > $err_log_path/$dev.mount 2>&1 87: if [ $? != 0 ] 88: then 89: retry_count=`expr $retry_count - 1` 90: /usr/bin/sleep $sleep_time 91: else 92: /usr/bin/rm -f $err_log_path/$dev.mount 93: result_flag=0 94: break 95: fi 96: done 97: 98: if [ $result_flag != 0 ] 99: then 100: mount_error=1 101: fi 102: fi 103: fi 104: 105: # lvname="/dev/XX" 106: # lv_mount_point="/XX" 107: # mount_status=`/usr/sbin/mount | /usr/bin/nawk -v lv=${lvname} 'lv==$1{flag=1; exit;} END{if(flag==1) print "mounted"; else print "not_mounted";}'` 108: # if [ $mount_status = "not_mounted" ] 109: # then 110: # /usr/sbin/mount $lvname $lv_mount_point 2>/dev/null 111: # if [ $? != 0 ] 112: # then 113: # retry_count=3 114: # sleep_time=1 115: # result_flag=1 116: # 117: # while [ $retry_count -gt 0 ] 118: # do 119: # /usr/sbin/mount $lvname $lv_mount_point > $err_log_path/$dev.mount 2>&1 120: # if [ $? != 0 ] 121: # then 122: # retry_count=`expr $retry_count - 1` 123: # /usr/bin/sleep $sleep_time 124: # else 125: # rm -f $err_log_path/$dev.mount 126: # result_flag=0 127: # break 128: # fi 129: # done 130: # 131: # if [ $result_flag != 0 ] 132: # then 133: # mount_error=1 134: # fi 135: # fi 136: # fi 137: 138: if [ $mount_error != 0 ] 139: then 140: exit 11 141: fi 142: fi 143: fi 144: 145: /usr/bin/rm -rf $post_file 2> /dev/null 146: exit 0 |
RepDst.post(複写先ボリューム後処理スクリプト)
1: #!/bin/sh 2: 3: # AdvancedCopy Manager 4: # All Rights Reserved, Copyright FUJITSU LIMITED, 2004-2007 5: 6: # 7: # Postprocessing of Replication(Destination) processing 8: # 9: # Argument: $1 Device name of Destination disk 10: # 11: # Error number 12: # 2: Argument error 13: # 11: mount error 14: # 53: chdev error 15: # 54: exportvg error 16: # 56: recreatevg error 17: # 52: chfs error 18: 19: # Reconstruct volume group function. 20: ReconstructVG () 21: { 22: 23: # delete PV temporally. 24: /usr/sbin/chdev -l $pvname -a pv=clear > /dev/null 2>&1 25: if [ $? != 0 ] 26: then 27: /usr/sbin/chdev -l $pvname -a pv=clear > $err_log_path/$dev.chdev 2>&1 28: if [ $? != 0 ] 29: then 30: return 53 31: else 32: /usr/bin/rm -f $err_log_path/$dev.chdev 33: fi 34: fi 35: 36: # export destination volume group 37: /usr/sbin/exportvg $dev > /dev/null 2>&1 38: if [ $? != 0 ] 39: then 40: /usr/sbin/exportvg $dev > $err_log_path/$dev.exportvg 2>&1 41: if [ $? != 0 ] 42: then 43: return 54 44: else 45: /usr/bin/rm -f $err_log_path/$dev.exportvg 46: fi 47: fi 48: 49: # recreate destination volume group 50: prefix="/fs" 51: /usr/sbin/recreatevg -l $conv_file -L $prefix -y $dev $pvname > /dev/null 2>&1 52: if [ $? != 0 ] 53: then 54: /usr/sbin/recreatevg -l $conv_file -L $prefix -y $dev $pvname > $err_log_path/$dev.recreatevg 2>&1 55: if [ $? != 0 ] 56: then 57: return 56 58: else 59: /usr/bin/rm -f $err_log_path/$dev.recreatevg 60: fi 61: fi 62: 63: return 0 64: } 65: 66: # Mount Logical Volume function 67: MountLV () 68: { 69: mount_status=`/usr/sbin/mount | /usr/bin/nawk -v lv=${lvname} 'lv==$1{flag=1; exit;} END{if(flag==1) print "mounted"; else print "not_mounted";}'` 70: if [ $mount_status = "not_mounted" ] 71: then 72: /usr/sbin/mount $lvname $dst_mount_point 2> /dev/null 73: if [ $? != 0 ] 74: then 75: retry_count=3 76: sleep_time=1 77: result_flag=1 78: 79: while [ $retry_count -gt 0 ] 80: do 81: /usr/sbin/mount $lvname $dst_mount_point > $err_log_path/$dev.mount 2>&1 82: if [ $? != 0 ] 83: then 84: retry_count=`expr $retry_count - 1` 85: /usr/bin/sleep $sleep_time 86: else 87: /usr/bin/rm -f $err_log_path/$dev.mount 88: result_flag=0 89: break 90: fi 91: done 92: 93: if [ $result_flag != 0 ] 94: then 95: exit 11 96: fi 97: fi 98: fi 99: } 100: 101: # Change mount point function 102: ChangeMountPoint () 103: { 104: /usr/sbin/chfs -m $dst_mount_point $prefix$src_mount_point > /dev/null 2>&1 105: if [ $? != 0 ] 106: then 107: /usr/sbin/chfs -m $dst_mount_point $prefix$dst_mount_point > /dev/null 2>&1 108: if [ $? != 0 ] 109: then 110: /usr/sbin/chfs -m $dst_mount_point $prefix$dst_mount_point > $err_log_path/$dev.chfs 2>&1 111: if [ $? != 0 ] 112: then 113: exit 52 114: else 115: /usr/bin/rm -f $err_log_path/$dev.chfs 116: fi 117: fi 118: fi 119: } 120: 121: ############################### 122: # 123: # RepDst.post Main process. 124: # 125: ############################### 126: 127: # Argument check 128: case $# in 129: 1) 130: ;; 131: *) 132: exit 2 133: ;; 134: esac 135: 136: device=$1 137: 138: # Determination of postprocessing file name 139: if [ "`echo $device | /usr/bin/grep "/dev/hdisk"`" != "" ] 140: then 141: dev_type="lvm_pv" 142: # /dev/hdisk? -> hdisk? 143: dev="`echo $device | /usr/bin/awk -F\/ '{ print $3 }'`" 144: 145: elif [ "`echo $device | /usr/bin/grep "/dev/vx/dmp/"`" != "" ] 146: then 147: dev_type="vxvm_pv" 148: # /dev/vx/dmp/device -> device 149: dev="`echo $device | /usr/bin/awk -F\/ '{ print $5 }'`" 150: 151: elif [ "`echo $device | /usr/bin/grep "/dev/"`" != "" ] 152: then 153: dev_type="lvm_vg" 154: # /dev/VG_Name -> VG_Name 155: dev="`echo $device | /usr/bin/awk -F\/ '{ print $3 }'`" 156: 157: else 158: # Other Volume 159: exit 0 160: fi 161: post_file="/etc/opt/FJSVswsrp/"$SWSTGNODE"/data/DEFAULT/"$dev".dpre" 162: conv_file="/etc/opt/FJSVswsrp/"$SWSTGNODE"/data/DEFAULT/"$dev".tmp" 163: 164: err_log_path="/var/opt/FJSVswsrp/"$SWSTGNODE"/log" 165: 166: # Confirmation of postprocessing 167: if [ ! -r $post_file ] 168: then 169: exit 0 170: fi 171: # When the Destination disk is a volume group ############################# 172: if [ "$dev_type" = "lvm_vg" ] 173: then 174: 175: post="`/usr/bin/cat $post_file | /usr/bin/cut -d',' -f1`" 176: vg_status="`/usr/bin/cat $post_file | /usr/bin/cut -d',' -f2`" 177: 178: if [ "$vg_status" = "varyon" ] 179: then 180: if [ "$device" = "/dev/vgXX" ] 181: then 182: pvname="hdiskXX" 183: 184: # decide conversion of LV name 185: /usr/bin/rm -rf $conv_file 2> /dev/null 186: echo "SrclvXXXX:DstlvXXXXX" >> $conv_file 187: echo "DstlvXXXX:DstlvXXXXX" >> $conv_file 188: # echo "SrclvXXXX:DstlvXXXXX" >> $conv_file 189: # echo "DstlvXXXX:DstlvXXXXX" >> $conv_file 190: 191: # Reconstruct Volume Group 192: ReconstructVG 193: result=$? 194: if [ $result != 0 ] 195: then 196: exit $result 197: fi 198: 199: # delete tmpfile 200: /usr/bin/rm -rf $conv_file 2> /dev/null 201: fi 202: fi 203: 204: if [ "$device" = "/dev/vgXX" ] 205: then 206: 207: # decide new mount point 208: lvname="/dev/XX" 209: src_mount_point="/XX" 210: dst_mount_point="/XX" 211: 212: if [ "$vg_status" = "varyon" ] 213: then 214: # Change mount point 215: ChangeMountPoint 216: fi 217: 218: if [ "$post" = "mount" ] 219: then 220: # Mount all logical volumes of the volume group 221: MountLV 222: fi 223: 224: # lvname="/dev/XX" 225: # src_mount_point="/XX" 226: # dst_mount_point="/XX" 227: # 228: # if [ "$vg_status" = "varyon" ] 229: # then 230: # # Change mount point 231: # ChangeMountPoint 232: # fi 233: # 234: # if [ "$post" = "mount" ] 235: # then 236: # # Mount all logical volumes of the volume group 237: # MountLV 238: # fi 239: 240: fi 241: fi 242: 243: /usr/bin/rm -rf $post_file 2> /dev/null 244: exit 0 245: |
ファイルシステムが構築された論理ボリュームを含むボリュームグループがレプリケーション対象の場合は、前後処理スクリプトを修正する必要があります。
複写元ボリューム前処理スクリプトの64〜128行目、および複写元ボリューム後処理スクリプトの68〜142行目について、ファイルシステムが構築された全ての論理ボリュームに対して、アンマウント/マウント処理が行われるように記述を適宜修正してください。(“X”で示す箇所は実際の環境に合わせて変更してください。また、複写元ボリューム前処理スクリプトの99〜127行目および、複写元ボリューム後処理スクリプトの105〜136行目のコメントをはずし、これらの処理をボリューム数分記述してください。)
複写先ボリューム前処理スクリプトの68〜133行目、および複写先ボリューム後処理スクリプトの180〜201、204〜240行目について、ファイルシステムが構築された全ての論理ボリュームに対して、アンマウント/マウント処理が行われるように記述を適宜修正してください。(“X”で示す箇所は実際の環境に合わせて変更してください。
また、複写先ボリューム前処理スクリプトの103〜131行目および、複写先ボリューム後処理スクリプトの188〜189、224〜238行目のコメントをはずし、これらの処理をボリューム数分記述してください。)
複写先ボリューム後処理スクリプトの編集方法は以下のとおりです。
182行目は、複写先ボリュームの物理ボリューム名を記述してください。
186行目のクオートの中は、複写元ボリュームと複写先ボリュームの論理ボリューム名の対応関係を記述します。 “複写元ボリュームの論理ボリューム名:複写先ボリュームの論理ボリューム名”の形式で記述してください。なお複写元ボリューム内に複数の論理ボリュームが存在する場合は、論理ボリュームの数分186行目の内容を記述してください。
187行目のクオートの中は、複写先ボリュームの論理ボリューム名を記述します。 “複写先ボリュームの論理ボリューム名:複写先ボリュームの論理ボリューム名”の形式で記述してください。なお複写先ボリューム内に複数の論理ボリュームが存在する場合は、論理ボリュームの数分187行目の内容を記述してください。
208行目は、複写先ボリュームの論理ボリューム名を記述してください。
209行目は、208行目に記述した論理ボリュームについて、複写元ボリュームにおけるマウントポイントを記述してください。
210行目は、208行目に記述した論理ボリュームについて、複写先ボリュームにおけるマウントポイントを記述してください。
スクリプトに対して必要な修正を実施後,複写元ボリューム前処理スクリプトの60行目および複写先ボリューム前処理スクリプトの64行目のexit文をコメント(“#”)化してください。
また、ファイルシステムが構築されていない論理ボリュームを含むボリュームグループがレプリケーション対象の場合は、上記修正に加えて、複写先ボリューム後処理スクリプトの212〜217行目の処理をコメント(“#”)化してください。
カスタマイズをしていない状態では、ボリュームグループに対する前処理はエラーとなります。
mountコマンドなどのOSコマンドのパラメーターやオプションなどは運用に合わせて,適宜修正してください。
複写先のボリュームグループを活性化する運用を行っている場合、複写先ボリュームの後処理スクリプトにおいて、LVM管理情報の書き換え(recreatevg)を実施します。この処理には時間がかかる場合があります。
VERITAS Cluster Serverでクラスタ運用を行う場合で、複写先,複写元ボリュームのマウントポイントがクラスタ業務に登録されている場合は前後処理スクリプトのカスタマイズが必要となります。
前後処理スクリプト内のアンマウント/マウント処理を、マウントポイントリソースのオフライン/オンライン処理に変更してください。
また、マウントポイントリソースのオフライン/オンラインを行ってから、実際にボリュームがアンマウント/マウントされるまでに時間差があります。そのため実際にアンマウント/マウントされるまで待ち合わせる処理(sleepやdfコマンドの結果を監視するなど)をオフライン/オンラインの成否を判定する個所の後に追加してください。
以下に前後処理スクリプトのカスタマイズ例を示します。
[例] 複写元ボリューム前処理スクリプト(RepSrc.pre)のアンマウント処理変更
[70、79、100、109行目]
(変更前) |
/usr/sbin/umount $mount_point |
(変更後) |
/opt/VRTSvcs/bin/hares -offline リソース名 -sys システム名 |
[例] 複写元ボリューム前処理スクリプト(RepSrc.pre)のアンマウント待ち処理の追加
[98、128行目]
(追加) |
mount_status="mounted" |
[例] 複写先ボリューム前処理スクリプト(RepDst.pre)のアンマウント処理変更
[74、83、104、113行目]
(変更前) |
/usr/sbin/umount $mount_point |
(変更後) |
/opt/VRTSvcs/bin/hares -offline リソース名 -sys システム名 |
[例] 複写先ボリューム前処理スクリプト(RepDst.pre)のアンマウント待ち処理追加
[102、132行目]
(追加) |
mount_status="mounted" |
[例] 複写元ボリューム後処理スクリプト(RepSrc.post)のマウント処理変更
[77、86、110、119行目]
(変更前) |
/usr/sbin/mount $lvname $lv_mount_point |
(変更後) |
/opt/VRTSvcs/bin/hares -online リソース名 -sys システム名 |
[例] 複写元ボリューム後処理スクリプト(RepSrc.post)のマウント待ち処理追加
[104、137行目]
(追加) |
mount_status="not_mounted" |
[例] 複写先ボリューム後処理スクリプト(RepDst.post)のマウント処理変更
[72、81行目]
(変更前) |
/usr/sbin/mount $lvname $lv_mount_point |
(変更後) |
/opt/VRTSvcs/bin/hares -online リソース名 -sys システム名 |
[例] 複写先ボリューム後処理スクリプト(RepDst.post)のマウント待ち処理追加
[99行目]
(追加) |
mount_status="not_mounted" |
目次
索引
![]() ![]() |