After figuring out the SnapVault stuff, I needed to implement a whole bunch of SnapMirror relations. As I am lazy (as in click-lazy), I ended up writing a somewhat short Bash script, that’ll either establish a bunch of SnapMirror relations (for a single host) or just for a single volume.
The script expects, that SSH public key authentification has been set up, and that the source for the SnapMirror exists and is online/not-restricted.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
| #!/bin/bash -f
# Create a SnapMirror relation between two volumes
# 1) create volume on target, if it doesn't exist
# 2) set snapshot reserve on target
# 3) start the snapmirror relationship
KEY_FILE="/root/.ssh/netapp.dsa"
SSH_OPTS="/root/.ssh/netapp-ssh_config"
usage() {
echo "Usage: fas-snapmirror-start.sh <MODE> <VOLUME|HOSTNAME> <SM_PRIMARY> <SM_SECONDARY> [SM_RATE_LIMIT]"
echo ""
if [ -n "$1" ] ; then
echo "$1"
echo ""
fi
echo "Required parameters:"
echo ""
echo " - MODE: Either host or volume (case sensitive)."
echo ""
echo " - VOLUME: Volume for which to configure SnapMirror (if mode is set to volume)"
echo " - HOSTNAME: Host for which to configure SnapMirror (if mode is set to host)"
echo " - SM_SECONDARY: Hostname of the SnapMirror Secondary"
echo " - SM_PRIMARY: Hostname of the SnapMirror Primary"
echo ""
echo "Optional parameters:"
echo ""
echo " - SM_RATE_LIMIT: Limit the SnapMirror transfer to xx kb, may help on busy systems."
echo " Defaults to no limit at all, may cause harm to already busy FAS"
echo " controllers."
echo ""
exit 1
}
ssh_fas() {
# $@: commands for Data ONTAP
COMMANDS="$@"
/usr/bin/ssh -i $KEY_FILE -l root -F $SSH_OPTS $COMMANDS
}
snapmirror_setup() {
if [ "$#" -lt 4 ] ; then
break
fi
# $1: sm_secondary
# $2: sm_primary
# $4: volume
# $6: sm_rate_limit
sm_secondary=$1
sm_primary=$2
volume=$3
sm_rate_limit=$4
# Check if snapmirror access is configured correctly
sm_secondary_ip="$( ssh_fas $sm_secondary rdfile /etc/hosts | grep $sm_secondary-e0a | awk '{ print $1 }' )"
sm_access="$( ssh_fas $sm_primary options snapmirror.access | grep $sm_secondary_ip )"
if [ -z "$sm_access" ] ; then
echo "Please make sure, that SnapMirror access is correctly"
echo "configured on $sm_primary, so that $sm_secondary"
echo "can access it using snapmirror."
echo
echo "Hint: options snapmirror.access should look like this:"
echo " options snapmirror.access host=$sm_secondary_ip"
echo
exit 1
fi
# Get FlexVol size from SM_PRIMARY (SnapMirror destination has the same
# size as the SnapMirror source)
VOL_SIZE="$( ssh_fas $sm_primary vol size $volume | awk '{ print $8 }' | sed "s,.,," )"
# Check if the is a qtree on SM_PRIMARY
QTREE="$( ssh_fas $sm_primary qtree status | grep $volume | cut -d -f2 | sed '/^$/d' )"
if [ -z "$QTREE" ] ; then
echo
echo "SnapDrive only supports Qtree to Qtree relations!"
echo "Please create a qtree (qtree create /vol/${volume}/sv"
echo
exit 1
fi
# Assume to always use aggr1 on SM_SECONDARY
echo "SnapMirror operations for FlexVol: $volume"
echo " - Creating FlexVol"
ssh_fas $sm_secondary vol create $volume -s none aggr1 $VOL_SIZE &>/dev/null
echo " - Disabling Unicode/atime/automatic snapshotting"
ssh_fas $sm_secondary vol options $volume fractional_reserve 100
ssh_fas $sm_secondary vol options $volume no_atime_update on
ssh_fas $sm_secondary vol options $volume create_ucode off
ssh_fas $sm_secondary vol options $volume nosnap on
ssh_fas $sm_secondary vol options $volume convert_ucode off
ssh_fas $sm_secondary vol autosize $volume off &>/dev/null
ssh_fas $sm_secondary snap reserve $volume $SNAP_RESERVE &>/dev/null
echo " - Restricting volume on $sm_secondary"
ssh_fas $sm_secondary vol restrict $volume &>/dev/null
# Now create the SnapMirror relationship between SM_SECONDARY and SM_PRIMARY
if [ -n $sm_rate_limit ] ; then
smi_rate_limit="-k $sm_rate_limit"
smc_rate_limit="kbs=$sm_rate_limit"
else
smc_rate_limit="-"
fi
echo " - Starting SnapMirror relation between $sm_secondary and $sm_primary"
ssh_fas $sm_secondary snapmirror initialize $smi_rate_limit
-S $sm_primary-e0a:$volume $sm_secondary:$volume &>/dev/null
echo " - Updating snapmirror.conf on $sm_secondary"
smc_opts="$sm_primary-e0a:$volume $sm_secondary:$volume $smc_rate_limit * 0-23/1 * *"
ssh_fas $sm_secondary wrfile -a /etc/snapmirror.conf $smc_opts
echo
echo "You can monitor the SnapMirror initialization on the SnapMirror Secondary ($sm_secondary)"
echo "by using the following command:"
echo
echo " 'snapmirror status $volume'"
echo
}
# Main script starts here.
#set -x
if [ "$#" -lt 4 ] ; then
usage
fi
case $1 in
host) MODE="host"; HOST=$2 ;;
volume) MODE="volume"; VOLUME=$2 ;;
*) usage "Invalid mode specified"
esac
SM_PRIMARY=$3
SM_SECONDARY=$4
SM_RATE_LIMIT=${5:-10000}
if [ "$MODE" == "host" ] ; then
# Get the LUN list
VOLUME_LIST="$( ssh_fas $SM_PRIMARY lun show | grep -i $HOST | grep -v windows_ | awk '{ print $1 }' | cut -d/ -f3 | sort -u | tr 'n' ' ' | sort -u )"
for vol in $VOLUME_LIST; do
# Check if snapreserve is enabled
SNAP="$( ssh_fas $SM_PRIMARY snap reserve $vol | cut -d -f7 | sed "s,%,," )"
if [ $SNAP -ne "0" ] ; then
snapmirror_setup $SM_SECONDARY $SM_PRIMARY $vol $SM_RATE_LIMIT
else
echo "No snap reserve configured for $vol"
fi
done
elif [ "$MODE" == "volume" ] ; then
SNAP="$( ssh_fas $SM_PRIMARY snap reserve $VOLUME | cut -d -f7 | sed "s,%,," )"
if [ $SNAP -ne "0" ] ; then
snapmirror_setup $SM_SECONDARY $SM_PRIMARY $VOLUME $SM_RATE_LIMIT
else
echo "No snap reserve configured for $vol"
fi
fi
#set -x
|