ETERNUS SF AdvancedCopy Manager 運用手引書 13.2 -HP-UX- |
目次
索引
![]() ![]() |
付録A バックアップ/リストアの前後処理 | > A.3 リストアの前後処理 |
リスト実行時の後処理のシェルスクリプト名は、以下のとおりです。
非クラスタ運用の場合
/etc/opt/FJSVswsts/sh/OpcRestore.post |
クラスタ運用の場合
/etc/opt/FJSVswsts/<論理ノード名>/sh/OpcRestore.post |
シェルスクリプトの内容は、以下のとおりです。
1: #!/bin/sh 2: 3: # AdvancedCopy Manager 4: # All Rights Reserved, Copyright FUJITSU LIMITED, 2002-2007 5: 6: # 7: # Postprocessing of restoration processing 8: # 9: # Argument: $1 Device or VG name of transaction disk 10: # $2 Mount point of transaction disk 11: # 12: # Error number 13: # 2: Argument error 14: # 11: mount error 15: # 31: vfcfgrestore error 16: # 12: fsck error 17: 18: # Argument check 19: case $# in 20: 1) 21: ;; 22: 2) 23: ;; 24: *) 25: exit 2 26: ;; 27: esac 28: 29: device=$1 30: mount_point=$2 31: 32: # Determination of postprocessing file name 33: 34: if [ "$SWSTGNODE" != "" ] 35: then 36: swstg_node="/`echo $SWSTGNODE`" 37: else 38: swstg_node="" 39: fi 40: 41: err_log_path="/var/opt/FJSVswsts"$swstg_node"/log" 42: 43: trans="`echo $device | /usr/bin/grep "/dev/dsk/"`" 44: lvmtrans="`echo $device | /usr/bin/grep "/dev/"`" 45: vxpvtrans="`echo $device | /usr/bin/grep "/dev/vx/dmp/"`" 46: if [ "$trans" != "" ] 47: then 48: dev_type="physical" 49: dev="`echo $device | /usr/bin/sed "s/\/dev\/dsk\///"`" 50: post_file="/etc/opt/FJSVswsts"$swstg_node"/data/DEFAULT/"$dev".pre" 51: fstype_file="/etc/opt/FJSVswsts"$swstg_node"/data/DEFAULT/"$dev".fstype" 52: elif [ "$vxpvtrans" != "" ] 53: then 54: dev_type="vxvm_pv" 55: # /dev/vx/dmp/XXXX -> XXXX 56: dev="`echo $device | /usr/bin/awk -F\/ '{ print $5 }'`" 57: post_file="/etc/opt/FJSVswsts"$swstg_node"/data/DEFAULT/"$dev".pre" 58: fstype_file="/etc/opt/FJSVswsts"$swstg_node"/data/DEFAULT/"$dev".fstype" 59: elif [ "$lvmtrans" != "" ] 60: then 61: dev_type="logical" 62: # /dev/vgXX -> vgXX 63: dev="`echo $device | /usr/bin/awk -F\/ '{ print $3 }'`" 64: post_file="/etc/opt/FJSVswsts"$swstg_node"/data/DEFAULT/"$dev".pre" 65: fstype_file="/etc/opt/FJSVswsts"$swstg_node"/data/DEFAULT/"$dev".fstype" 66: else 67: exit 0 68: fi 69: 70: # Confirmation of postprocessing 71: if [ ! -r $post_file ] 72: then 73: exit 0 74: fi 75: post="`/usr/bin/cat $post_file`" 76: 77: # Confirmation of FStype 78: if [ ! -r $fstype_file ] 79: then 80: fs="" 81: else 82: fs="`/usr/bin/cat $fstype_file`" 83: fi 84: 85: # Restore VG Configuration 86: if [ "$dev_type" = "logical" ] 87: then 88: vg_name="`echo $device | /usr/bin/awk -F\/ '{ print $3 }'`" 89: cfg_file="/etc/lvmconf/"$vg_name".conf" 90: if [ ! -r $cfg_file ] 91: then 92: exit 31 93: fi 94: pv_rname="`/usr/sbin/vgcfgrestore -n $device -l 2> /dev/null | /usr/bin/awk '{print $1}' | /usr/bin/grep \"/dev/rdsk\"`" 95: if [ "$pv_rname" = "" ] 96: then 97: echo "NULL: /usr/sbin/vgcfgrestore -n $device -l 2> /dev/null | /usr/bin/awk '{print $1}' | /usr/bin/grep \"/dev/rdsk\"" > $err_log_path/$dev.vgcfgrestore 2>&1 98: exit 31 99: fi 100: /usr/sbin/vgchange -a n $device > /dev/null 2>&1 101: reststatus=0 102: for pv_rname1 in $pv_rname 103: do 104: /usr/sbin/vgcfgrestore -n $device $pv_rname1 > /dev/null 2>&1 105: if [ $? != 0 ] 106: then 107: /usr/sbin/vgcfgrestore -n $device $pv_rname1 >> $err_log_path/$dev.vgcfgrestore 2>&1 108: fi 109: if [ $? = 0 ] 110: then 111: /usr/bin/rm -f $err_log_path/$dev.vgcfgrestore 112: reststatus=1 113: break 114: fi 115: done 116: if [ "$SWSTGNODE" != "" ] 117: then 118: /usr/sbin/vgchange -c y $device > /dev/null 2>&1 119: /usr/sbin/vgchange -a e $device > /dev/null 2>&1 120: else 121: /usr/sbin/vgchange -a y $device > /dev/null 2>&1 122: fi 123: if [ $reststatus = 0 ] 124: then 125: exit 31 126: fi 127: fi 128: 129: # No processing 130: # When device was not mounted --- 2 131: # When devices of volume group was not mounted --- 4 132: # When the transaction disk is a VxVM physical volume --- 5 133: if [ "$post" = "none" ] 134: then 135: /usr/bin/rm -rf $post_file 2> /dev/null 136: /usr/bin/rm -rf $fstype_file 2> /dev/null 137: exit 0 138: fi 139: 140: # mount processing 141: if [ "$post" = "mount" ] 142: then 143: 144: # When device was mounted --- 1 145: if [ "$dev_type" = "physical" ] 146: then 147: /usr/bin/df -l $device > /dev/null 2>&1 148: if [ $? != 0 ] 149: then 150: if [ ! -r $fstype_file ] 151: then 152: /usr/sbin/mount $device $mount_point 2> /dev/null 153: else 154: if [ "$fs" = "" ] 155: then 156: /usr/sbin/mount $device $mount_point 2> /dev/null 157: else 158: /usr/sbin/mount -F $fs $device $mount_point 2> /dev/null 159: fi 160: fi 161: if [ $? != 0 ] 162: then 163: retry_count=3 164: sleep_time=1 165: result_flag=1 166: 167: while [ $retry_count -gt 0 ] 168: do 169: if [ ! -r $fstype_file ] 170: then 171: /usr/sbin/mount $device $mount_point > $err_log_path/$dev.mount 2>&1 172: else 173: if [ "$fs" = "" ] 174: then 175: /usr/sbin/mount $device $mount_point > $err_log_path/$dev.mount 2>&1 176: else 177: /usr/sbin/mount -F $fs $device $mount_point > $err_log_path/$dev.mount 2>&1 178: fi 179: fi 180: if [ $? != 0 ] 181: then 182: retry_count=`expr $retry_count - 1` 183: /usr/bin/sleep $sleep_time 184: else 185: /usr/bin/rm -f $err_log_path/$dev.mount 186: result_flag=0 187: break 188: fi 189: done 190: 191: if [ $result_flag != 0 ] 192: then 193: exit 11 194: fi 195: fi 196: fi 197: # elif [ "$dev_type" = "logical" ] 198: # then 199: # 200: # When devices of volume group was mounted --- 3 201: # # Specify the name of volume group to mount 202: # if [ "$device" = "/dev/vgXX" ] 203: # then 204: # # Mount all logical volumes of the volume group 205: # fs="hfs" 206: # lvname="/dev/vgXX/XXXXX" 207: # lv_mount_point="/XX" 208: # 209: # fsck -F $fs -y $lvname > /dev/null 2>&1 210: # if [ $? != 0 ] 211: # then 212: # fsck -F $fs -y $lvname > $err_log_path/$dev.fsck 2>&1 213: # if [ $? != 0 ] 214: # then 215: # exit 12 216: # else 217: # rm -f $err_log_path/$dev.fsck 218: # fi 219: # fi 220: # /usr/bin/df -l $lvname > /dev/null 2>&1 221: # if [ $? != 0 ] 222: # then 223: # /usr/sbin/mount -F $fs $lvname $lv_mount_point 2> /dev/null 224: # if [ $? != 0 ] 225: # then 226: # retry_count=3 227: # sleep_time=1 228: # result_flag=1 229: # 230: # while [ $retry_count -gt 0 ] 231: # do 232: # /usr/sbin/mount -F $fs $lvname $lv_mount_point > $err_log_path/$dev.mount 2>&1 233: # if [ $? != 0 ] 234: # then 235: # retry_count=`expr $retry_count - 1` 236: # /usr/bin/sleep $sleep_time 237: # else 238: # rm -f $err_log_path/$dev.mount 239: # result_flag=0 240: # break 241: # fi 242: # done 243: # 244: # if [ $result_flag != 0 ] 245: # then 246: # exit 11 247: # fi 248: # fi 249: # fi 250: # fi 251: fi 252: /usr/bin/rm -rf $post_file 2> /dev/null 253: /usr/bin/rm -rf $fstype_file 2> /dev/null 254: exit 0 255: fi 256: 257: exit 0 |
ファイルシステムが構築された論理ボリュームを含むボリュームグループがリストア対象の場合は、前後処理スクリプトを修正する必要があります。
スクリプトを修正後,前処理スクリプト(OpcRestore.pre)の130行目のexit文をコメント(“#”)化してください。
◆前処理スクリプト(OpcRestore.pre)の134〜170行目のコメント(“#”)および後処理スクリプト(OpcRestore.post)の197、198、202〜250行目のコメント(“#”)をエディタ等で消去し、ファイルシステムが構築された全ての論理ボリュームに対してアンマウント/マウント処理が実施されるようにコメント内の記述を適宜修正してください。(“X”で示す箇所は実際の環境に合わせて変更してください。また、複数の論理ボリュームが対象となる場合は、前処理スクリプト(OpcRestore.pre)の138〜168行目の処理および、後処理スクリプト(OpcRestore.post)の206〜249行目の処理をボリューム数分記述してください。)
◆バックアップ時に業務ボリュームがマウントされていた場合、かつバックアップボリュームに対してfsckを実施していない場合は、リストア後に業務ボリューム内のファイルシステムが構築された全ての論理ボリュームに対してfsckを実施する必要があります。
カスタマイズをしていない状態では、ボリュームグループに対する前処理はエラーとなります。
業務ボリュームがボリュームグループの場合は、リストア後処理において、業務ボリュームをLVMとして使用可能にするためにvgcfgrestoreコマンドによってボリュームグループ構成情報のリストアを実施しています。上記のスクリプトでは、標準のバックアップファイル「/etc/lvmconf/“ボリュームグループ名”.conf」からボリューム構成情報のリストアを行っています。ボリュームグループ構成情報が別ファイルにバックアップされている場合は、スクリプトをカスタマイズしてください。
クラスタ運用している場合は、クラスタを構成する各ノードにボリュームグループ構成情報が存在している必要があります。
mountコマンドやfsckコマンドなどのOSコマンドのパラメーターやオプションなどは運用に合わせて,適宜修正してください。
共有モードのボリュームグループの場合
共有モードのボリュームグループの再構成は、後処理スクリプト(OpcRestore.post)の96-127、133、134および138をコメント化して、後処理スクリプトではボリュームグループの再構成を実施しないようにしてください。
リストア実行後に手動で以下の操作を行い、ボリュームグループの再構成を行ってください。
ボリュームグループの停止(業務を構成している全ノードで実行します)
# /usr/sbin/vgchange -a n <vg_name> # |
ボリュームグループ構成情報のリストア(ボリュームグループを作成したノードで実行します)
# /usr/sbin/vgcfgrestore -n <vg_name> <pv_path> # |
共有可能なボリュームグループのマーク(ボリュームグループを作成したノードで実行します)
# /usr/sbin/vgchange -S y -c y <vg_name> # |
ボリュームグループの起動(業務を構成している全ノードで実行します)
# /usr/sbin/vgchange -a s <vg_name> # |
VERITAS Cluster Serverでクラスタ運用を行う場合で、業務ボリュームのマウントポイントがクラスタ業務に登録されている場合は、前後処理のカスタマイズが必要となります。
前後処理スクリプト内のマウント/アンマウント処理を、マウントポイントリソースのオフライン/オンライン処理に変更してください。
また、マウントポイントリソースのオフライン/オンラインを行ってから、実際にボリュームがアンマウント/マウントされるまでに時間差があります。そのため実際にアンマウント/マウントされるまで待ち合わせる処理(sleepやdfコマンドの結果を監視するなど)をオフライン/オンラインの成否を判定する個所の後に追加してください。
以下に前後処理スクリプトの変更例を示します
[例] リストア前処理スクリプト(OpcRestore.pre)のアンマウント処理変更
[80、89、139、148行目]
(変更前) |
/usr/sbin/umount $mount_point |
(変更後) |
/opt/VRTSvcs/bin/hares -offline リソース名 -sys システム名 |
[例] リストア前処理スクリプト(OpcRestore.pre)のアンマウント待ち処理追加
[110、169行目]
(追加) |
while /usr/bin/df -l "$device">/dev/null 2>&1; do :; done |
[例] リストア後処理スクリプト(OpcRestore.post)のマウント処理変更
[152、156、158、171、175、177、223、232行目]
(変更前) |
/usr/sbin/mount $device $mount_point |
(変更後) |
/opt/VRTSvcs/bin/hares -online リソース名 -sys システム名 |
[例] リストア後処理スクリプト(OpcRestore.post)のマウント待ち処理追加
[197、251行目]
(追加) |
while ! /usr/bin/df -l "$device">/dev/null 2>&1; do :; done |
目次
索引
![]() ![]() |