後処理のシェルスクリプトには複写元ボリューム(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 0RepDst.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: