ETERNUS SF AdvancedCopy Manager 運用手引書 13.0 -Linux- |
目次
索引
![]() ![]() |
本章では、AdvancedCopy Managerのレプリケーションの前後処理を行うシェルスクリプトについて説明します。
レプリケーションの前後処理のシェルスクリプトは、レプリケーション(複製)処理の前後で起動されます。
これらのシェルスクリプトには、AdvancedCopy Managerが、複製元ボリュームおよび複製先ボリュームに必要な処理を記述します。
この章では、前後処理の設定について説明します。
AdvancedCopy Managerでのレプリケーションの前後処理は、複製元/複製先ボリュームの双方に対して実施する必要がありますが、その目的は異なります。
複製元ボリュームに対する前後処理
複製元データを一時的に整合性の保証された状態で凍結することを目的としています。前処理で複製元データを一時的に凍結し、複製作成後、後処理で凍結状態を解除します。
複製先ボリュームに対する前後処理
レプリケーション(複製)処理中にアプリケーションが複製先ボリュームにアクセスさせないことを目的としています。前処理で複製先データをアクセス禁止状態とし、複製作成後、後処理でアクセス禁止状態を解除します。
前後処理で行う具体的な処理は、そのボリュームのデータ内容によって異なります。次章では、ファイルシステムとデータベースの前後処理についてそれぞれ説明します。
ファイルシステムの前後処理とは、ファイルシステムのアンマウント/マウント処理です。複製元ボリュームに対する前後処理は、複製元データを保証するためのものです。複製先ボリュームに対する前後処理は、同期処理実行中やスナップショットコピー時に他プロセスからのアクセスを不可能にするためのものです。ボリュームがマウントされていない場合は、前後処理は実施されません。
ファイルシステムの前後処理の実施状況を以下に示します。この表は、前後処理が実行されるかどうかは、コマンド種別によって異なり、さらに、そのコマンドを実行したときのコピー状態によっても異なることを示しています。
コマンド |
コピー状態 |
複製元/複製先 |
前処理 |
後処理 |
---|---|---|---|---|
複製開始コマンド (swsrpstartsync) |
未コピー状態または 複製確立状態 |
複製元 |
× |
× |
複製先 |
○--(1) |
× |
||
複製作成コマンド (swsrpmake) |
等価性維持状態 |
複製元 |
○ |
○ |
複製先 |
× |
○--(2) |
||
複製解除コマンド (swsrpcancel) |
等価性維持状態 |
複製元 |
○ |
○ |
複製先 |
× |
○--(2) |
||
複製確立状態 |
複製元 |
× |
× |
|
複製先 |
× |
× |
||
コピー中 |
複製元 |
× |
× |
|
複製先 |
× |
× |
||
スナップショット複製作成コマンド (swsrpmake) |
未コピー状態 |
複製元 |
○ |
○ |
複製先 |
○ |
○ |
(1)で行った前処理に対する後処理は(2)で行われます。(2)の後処理では、(1)の前処理でアンマウントしたマウントポイントに再マウントを行います。
ファイルシステムの前後処理は、カスタマイズ可能なようにスクリプトになっています。レプリケーション管理コマンドを実施した際に、上の表にしたがって起動されます。また、サーバ間レプリケーションの場合、接続されていないボリュームの前後処理は、TCP/IPによるリモート実行でこれらのスクリプトが実行されます。
図 C.1 に前後処理の動作イメージを示します。
前後処理で標準の前後処理以外で必要な処理がある場合はそれぞれのスクリプトをカスタマイズしてください。
スクリプトをカスタマイズする場合、エラーコードは以下の規約に従ってください。
エラーコード |
用途 |
---|---|
0-99 |
使用不可(AdvancedCopy Managerが予約) |
100-255 |
使用可能 |
データベースの前後処理については、AdvancedCopy Managerでは機能を提供しませんので、AdvancedCopy Managerコマンド実行の前後で独自に実施する必要があります。
前処理スクリプトには複写元ボリューム(RepSrc.Pre)と複写先ボリューム(RepDst.Pre)を用意し、以下のディレクトリ配下に格納されています。処理の必要性に応じてスクリプトをカスタマイズしてください。
非クラスタ運用の場合
/etc/opt/FJSVswsrp/shディレクトリ配下
クラスタ運用の場合
/etc/opt/FJSVswsrp/<論理ノード名>/shディレクトリ配下
RepSrc.pre(複写元ボリューム前処理スクリプト)
1: #!/bin/sh 2: 3: # AdvancedCopy Manager 4: # All Rights Reserved, Copyright FUJITSU LIMITED, 2002-2006 5: 6: # 7: # Preprocessing of Replication(Source) processing 8: # 9: # Argument: $1 Device name of Source disk 10: # $2 Mount point of Source disk 11: # 12: # Error number 13: # 2: Argument error 14: # 10: umount error 15: # 13: Illegal mount type (stack/bind mount) 16: 17: # Argument check 18: case $# in 19: 2) 20: ;; 21: *) 22: exit 2 23: ;; 24: esac 25: 26: device=$1 27: mount_point=$2 28: 29: # Determination postprocessing file name 30: if [ "`echo $device | /bin/grep "/dev/sd"`" != "" ] 31: then 32: # /dev/sd? -> sd? 33: dev="`echo $device | /bin/sed "s/\/dev\///"`" 34: elif [ "`echo $device | /bin/grep "/dev/FJSV"`" != "" ] 35: then 36: # /dev/FJSVmphd/dsk/mplb?s? -> mplb?s? 37: # /dev/FJSVmphd/dsk/mphd?s? -> mphd?s? 38: dev="`echo $device | /bin/cut -d/ -f5`" 39: elif [ "`echo $device | /bin/grep "/dev/sfdsk/"`" != "" ] 40: then 41: if [ "`echo $device | /bin/grep ":"`" != "" ] 42: then 43: # /dev/sfdsk/class/dsk/volume:sd? -> class_volume_sd? 44: dev="`echo $device | /bin/sed "s/\/dev\/sfdsk\///"`" 45: dev="`echo $dev | /bin/sed "s/\/dsk\//_/"`" 46: dev="`echo $dev | /bin/sed "s/:/_/"`" 47: device="`echo $device | /bin/cut -d: -f1`" 48: else 49: # /dev/sfdsk/class/dsk/volume -> _gds_class_volume 50: dev="_gds_`echo $device | /bin/sed "s/\/dev\/sfdsk\///"`" 51: dev="`echo $dev | /bin/sed "s/\/dsk\//_/"`" 52: fi 53: else 54: exit 0 55: fi 56: post_file="/etc/opt/FJSVswsrp/"$SWSTGNODE"/data/DEFAULT/"$dev".spre" 57: fstype_file="/etc/opt/FJSVswsrp/"$SWSTGNODE"/data/DEFAULT/"$dev".sfstype" 58: 59: err_log_path="/var/opt/FJSVswsrp/"$SWSTGNODE"/log" 60: 61: if [ "$mount_point" != "" ] 62: # When device was mounted 63: # 64: then 65: 66: if [ `/bin/cat /proc/mounts |/bin/cut -d' ' -f 2|/bin/grep "^$mount_point\$"|/usr/bin/wc -w` != 1 ]; then 67: # stack mount (multi device on $mount_point) 68: /bin/mount > $err_log_path/$dev.umount 2>&1 69: exit 13 70: fi 71: if [ `/bin/cat /proc/mounts |/bin/cut -d' ' -f 1|/bin/grep "^$device\$"|/usr/bin/wc -w` != 1 ]; then 72: # bind mount (device has multi mount point) 73: /bin/mount > $err_log_path/$dev.umount 2>&1 74: exit 13 75: fi 76: 77: /bin/awk "\$2==\"$mount_point\" {print \$3}" /proc/mounts > $fstype_file 78: 79: /bin/umount $mount_point 2>/dev/null 80: 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: /bin/umount $mount_point > $err_log_path/$dev.umount 2>&1 90: if [ $? != 0 ] 91: then 92: retry_count=`expr $retry_count - 1` 93: /bin/sleep $sleep_time 94: else 95: /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: /sbin/fuser -vu $mount_point> $err_log_path/$dev.fuser 2>&1 104: /bin/ps -ef > $err_log_path/$dev.ps 2>&1 105: exit 10 106: fi 107: fi 108: 109: echo "mount,$mount_point" > $post_file 110: 111: # When device was not mounted 112: # 113: else 114: echo "none" > $post_file 115: fi 116: 117: exit 0 |
RepDst.pre(複写先ボリューム前処理スクリプト)
1: #!/bin/sh 2: 3: # AdvancedCopy Manager 4: # All Rights Reserved, Copyright FUJITSU LIMITED, 2002-2006 5: 6: # 7: # Preprocessing of Replication(Destination) processing 8: # 9: # Argument: $1 Device name of Destination disk 10: # $2 Mount point of Destination disk 11: # 12: # Error number 13: # 2: Argument error 14: # 10: umount error 15: # 13: Illegal mount type (bind/stack mount) 16: 17: # Argument check 18: case $# in 19: 2) 20: ;; 21: *) 22: exit 2 23: ;; 24: esac 25: 26: device=$1 27: mount_point=$2 28: 29: # Determination postprocessing file name 30: if [ "`echo $device | /bin/grep "/dev/sd"`" != "" ] 31: then 32: # /dev/sd? -> sd? 33: dev="`echo $device | /bin/sed "s/\/dev\///"`" 34: elif [ "`echo $device | /bin/grep "/dev/FJSV"`" != "" ] 35: then 36: # /dev/FJSVmphd/dsk/mplb?s? -> mplb?s? 37: # /dev/FJSVmphd/dsk/mphd?s? -> mphd?s? 38: dev="`echo $device | /bin/cut -d/ -f5`" 39: elif [ "`echo $device | /bin/grep "/dev/sfdsk/"`" != "" ] 40: then 41: if [ "`echo $device | /bin/grep ":"`" != "" ] 42: then 43: # /dev/sfdsk/class/dsk/volume:sd? -> class_volume_sd? 44: dev="`echo $device | /bin/sed "s/\/dev\/sfdsk\///"`" 45: dev="`echo $dev | /bin/sed "s/\/dsk\//_/"`" 46: dev="`echo $dev | /bin/sed "s/:/_/"`" 47: device="`echo $device | /bin/cut -d: -f1`" 48: else 49: # /dev/sfdsk/class/dsk/volume -> _gds_class_volume 50: dev="_gds_`echo $device | /bin/sed "s/\/dev\/sfdsk\///"`" 51: dev="`echo $dev | /bin/sed "s/\/dsk\//_/"`" 52: fi 53: else 54: exit 0 55: fi 56: post_file="/etc/opt/FJSVswsrp/"$SWSTGNODE"/data/DEFAULT/"$dev".dpre" 57: fstype_file="/etc/opt/FJSVswsrp/"$SWSTGNODE"/data/DEFAULT/"$dev".dfstype" 58: 59: err_log_path="/var/opt/FJSVswsrp/"$SWSTGNODE"/log" 60: 61: if [ "$mount_point" != "" ] 62: # When device was mounted 63: # 64: then 65: 66: if [ `/bin/cat /proc/mounts |/bin/cut -d' ' -f 2|/bin/grep "^$mount_point\$"|/usr/bin/wc -w` != 1 ]; then 67: # stack mount (multi device on $mount_point) 68: /bin/mount > $err_log_path/$dev.umount 2>&1 69: exit 13 70: fi 71: if [ `/bin/cat /proc/mounts |/bin/cut -d' ' -f 1|/bin/grep "^$device\$"|/usr/bin/wc -w` != 1 ]; then 72: # bind mount (device has multi mount point) 73: /bin/mount > $err_log_path/$dev.umount 2>&1 74: exit 13 75: fi 76: 77: /bin/awk "\$2==\"$mount_point\" {print \$3}" /proc/mounts > $fstype_file 78: 79: /bin/umount $mount_point 2>/dev/null 80: 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: /bin/umount $mount_point > $err_log_path/$dev.umount 2>&1 90: if [ $? != 0 ] 91: then 92: retry_count=`expr $retry_count - 1` 93: /bin/sleep $sleep_time 94: else 95: /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: /sbin/fuser -vu $mount_point> $err_log_path/$dev.fuser 2>&1 104: /bin/ps -ef > $err_log_path/$dev.ps 2>&1 105: exit 10 106: fi 107: fi 108: 109: echo "mount,$mount_point" > $post_file 110: 111: # When device was not mounted 112: # 113: else 114: echo "none" > $post_file 115: fi 116: 117: exit 0 |
マウントされているがアンマウントしたくない複写元ボリュームに対しては、本マニュアルの『バックアップの前後処理』を参考にしてスクリプトをカスタマイズしてください。
この操作は、ファイルシステムが以下の場合のみ可能です。
ext2
ext3
後処理スクリプトには複写元ボリューム(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, 2002-2006 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 | /bin/grep "/dev/sd"`" != "" ] 28: then 29: # /dev/sd? -> sd? 30: dev="`echo $device | /bin/sed "s/\/dev\///"`" 31: elif [ "`echo $device | /bin/grep "/dev/FJSV"`" != "" ] 32: then 33: # /dev/FJSVmphd/dsk/mplb?s? -> mplb?s? 34: # /dev/FJSVmphd/dsk/mphd?s? -> mphd?s? 35: dev="`echo $device | /bin/cut -d/ -f5`" 36: elif [ "`echo $device | /bin/grep "/dev/sfdsk/"`" != "" ] 37: then 38: if [ "`echo $device | /bin/grep ":"`" != "" ] 39: then 40: # /dev/sfdsk/class/dsk/volume:sd? -> class_volume_sd? 41: dev="`echo $device | /bin/sed "s/\/dev\/sfdsk\///"`" 42: dev="`echo $dev | /bin/sed "s/\/dsk\//_/"`" 43: dev="`echo $dev | /bin/sed "s/:/_/"`" 44: device="`echo $device | /bin/cut -d: -f1`" 45: else 46: # /dev/sfdsk/class/dsk/volume -> _gds_class_volume 47: dev="_gds_`echo $device | /bin/sed "s/\/dev\/sfdsk\///"`" 48: dev="`echo $dev | /bin/sed "s/\/dsk\//_/"`" 49: fi 50: else 51: exit 0 52: fi 53: post_file="/etc/opt/FJSVswsrp/"$SWSTGNODE"/data/DEFAULT/"$dev".spre" 54: fstype_file="/etc/opt/FJSVswsrp/"$SWSTGNODE"/data/DEFAULT/"$dev".sfstype" 55: 56: err_log_path="/var/opt/FJSVswsrp/"$SWSTGNODE"/log" 57: 58: # Confirmation of postprocessing 59: if [ ! -r $post_file ] 60: then 61: exit 0 62: fi 63: post="`/bin/cat $post_file | /bin/cut -d',' -f1`" 64: mount_point="`/bin/cat $post_file | /bin/cut -d',' -f2`" 65: 66: # Confirmation of FStype 67: if [ ! -r $fstype_file ] 68: then 69: fs="" 70: else 71: fs="`/bin/cat $fstype_file`" 72: fi 73: 74: # No processing 75: if [ "$post" = "none" ] 76: then 77: /bin/rm -rf $post_file 2> /dev/null 78: /bin/rm -rf $fstype_file 2> /dev/null 79: exit 0 80: fi 81: 82: # mount processing 83: if [ "$post" = "mount" ] 84: then 85: Result="`/bin/df -l | /bin/grep "$device " | /bin/awk 'END {print NR}'`" 86: if [ "$Result" != "1" ] 87: then 88: if [ ! -r $fstype_file ] 89: then 90: /bin/mount $device $mount_point 2> /dev/null 91: else 92: Result1="`echo $fs | /bin/awk 'END {print NR}'`" 93: if [ "$Result1" != "1" ] 94: then 95: /bin/mount $device $mount_point 2> /dev/null 96: else 97: /bin/mount -t $fs $device $mount_point 2> /dev/null 98: fi 99: fi 100: if [ $? != 0 ] 101: then 102: retry_count=3 103: sleep_time=1 104: result_flag=1 105: 106: while [ $retry_count -gt 0 ] 107: do 108: if [ ! -r $fstype_file ] 109: then 110: /bin/mount $device $mount_point > $err_log_path/$dev.mount 2>&1 111: else 112: Result1="`echo $fs | /bin/awk 'END {print NR}'`" 113: if [ "$Result1" != "1" ] 114: then 115: /bin/mount $device $mount_point > $err_log_path/$dev.mount 2>&1 116: else 117: /bin/mount -t $fs $device $mount_point > $err_log_path/$dev.mount 2>&1 118: fi 119: fi 120: if [ $? != 0 ] 121: then 122: retry_count=`expr $retry_count - 1` 123: /bin/sleep $sleep_time 124: else 125: /bin/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: exit 11 134: fi 135: fi 136: fi 137: /bin/rm -rf $post_file 2> /dev/null 138: /bin/rm -rf $fstype_file 2> /dev/null 139: exit 0 140: fi 141: 142: exit 0 |
RepDst.post(複写先ボリューム後処理スクリプト)
1: #!/bin/sh 2: 3: # AdvancedCopy Manager 4: # All Rights Reserved, Copyright FUJITSU LIMITED, 2002-2006 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: 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 | /bin/grep "/dev/sd"`" != "" ] 28: then 29: # /dev/sd? -> sd? 30: dev="`echo $device | /bin/sed "s/\/dev\///"`" 31: elif [ "`echo $device | /bin/grep "/dev/FJSV"`" != "" ] 32: then 33: # /dev/FJSVmphd/dsk/mplb?s? -> mplb?s? 34: # /dev/FJSVmphd/dsk/mphd?s? -> mphd?s? 35: dev="`echo $device | /bin/cut -d/ -f5`" 36: elif [ "`echo $device | /bin/grep "/dev/sfdsk/"`" != "" ] 37: then 38: if [ "`echo $device | /bin/grep ":"`" != "" ] 39: then 40: # /dev/sfdsk/class/dsk/volume:sd? -> class_volume_sd? 41: dev="`echo $device | /bin/sed "s/\/dev\/sfdsk\///"`" 42: dev="`echo $dev | /bin/sed "s/\/dsk\//_/"`" 43: dev="`echo $dev | /bin/sed "s/:/_/"`" 44: device="`echo $device | /bin/cut -d: -f1`" 45: else 46: # /dev/sfdsk/class/dsk/volume -> _gds_class_volume 47: dev="_gds_`echo $device | /bin/sed "s/\/dev\/sfdsk\///"`" 48: dev="`echo $dev | /bin/sed "s/\/dsk\//_/"`" 49: fi 50: else 51: exit 0 52: fi 53: post_file="/etc/opt/FJSVswsrp/"$SWSTGNODE"/data/DEFAULT/"$dev".dpre" 54: fstype_file="/etc/opt/FJSVswsrp/"$SWSTGNODE"/data/DEFAULT/"$dev".dfstype" 55: 56: err_log_path="/var/opt/FJSVswsrp/"$SWSTGNODE"/log" 57: 58: # Confirmation of postprocessing 59: if [ ! -r $post_file ] 60: then 61: exit 0 62: fi 63: post="`/bin/cat $post_file | /bin/cut -d',' -f1`" 64: mount_point="`/bin/cat $post_file | /bin/cut -d',' -f2`" 65: 66: # Confirmation of FStype 67: if [ ! -r $fstype_file ] 68: then 69: fs="" 70: else 71: fs="`/bin/cat $fstype_file`" 72: fi 73: 74: # No processing 75: if [ "$post" = "none" ] 76: then 77: /bin/rm -rf $post_file 2> /dev/null 78: /bin/rm -rf $fstype_file 2> /dev/null 79: exit 0 80: fi 81: 82: # mount processing 83: if [ "$post" = "mount" ] 84: then 85: # df -l $device > /dev/null 2>&1 86: # if [ $? != 0 ] 87: Result="`/bin/df -l | /bin/grep "$device " | /bin/awk 'END {print NR}'`" 88: if [ "$Result" != "1" ] 89: then 90: if [ ! -r $fstype_file ] 91: then 92: /bin/mount $device $mount_point 2> /dev/null 93: else 94: Result1="`echo $fs | /bin/awk 'END {print NR}'`" 95: if [ "$Result1" != "1" ] 96: then 97: /bin/mount $device $mount_point 2> /dev/null 98: else 99: /bin/mount -t $fs $device $mount_point 2> /dev/null 100: fi 101: fi 102: if [ $? != 0 ] 103: then 104: retry_count=3 105: sleep_time=1 106: result_flag=1 107: 108: while [ $retry_count -gt 0 ] 109: do 110: if [ ! -r $fstype_file ] 111: then 112: /bin/mount $device $mount_point > $err_log_path/$dev.mount 2>&1 113: else 114: Result1="`echo $fs | /bin/awk 'END {print NR}'`" 115: if [ "$Result1" != "1" ] 116: then 117: /bin/mount $device $mount_point > $err_log_path/$dev.mount 2>&1 118: else 119: /bin/mount -t $fs $device $mount_point > $err_log_path/$dev.mount 2>&1 120: fi 121: fi 122: if [ $? != 0 ] 123: then 124: retry_count=`expr $retry_count - 1` 125: /bin/sleep $sleep_time 126: else 127: /bin/rm -f $err_log_path/$dev.mount 128: result_flag=0 129: break 130: fi 131: done 132: 133: if [ $result_flag != 0 ] 134: then 135: exit 11 136: fi 137: fi 138: fi 139: /bin/rm -rf $post_file 2> /dev/null 140: /bin/rm -rf $fstype_file 2> /dev/null 141: exit 0 142: fi 143: 144: exit 0 |
目次
索引
![]() ![]() |