]>
Commit | Line | Data |
---|---|---|
178cd55f HZ |
1 | #!/bin/bash |
2 | ||
3 | # This example script creates bonding network devices based on synthetic NIC | |
4 | # (the virtual network adapter usually provided by Hyper-V) and the matching | |
5 | # VF NIC (SRIOV virtual function). So the synthetic NIC and VF NIC can | |
6 | # function as one network device, and fail over to the synthetic NIC if VF is | |
7 | # down. | |
8 | # | |
9 | # Usage: | |
10 | # - After configured vSwitch and vNIC with SRIOV, start Linux virtual | |
11 | # machine (VM) | |
12 | # - Run this scripts on the VM. It will create configuration files in | |
13 | # distro specific directory. | |
14 | # - Reboot the VM, so that the bonding config are enabled. | |
15 | # | |
16 | # The config files are DHCP by default. You may edit them if you need to change | |
17 | # to Static IP or change other settings. | |
18 | # | |
19 | ||
20 | sysdir=/sys/class/net | |
21 | netvsc_cls={f8615163-df3e-46c5-913f-f2d2f965ed0e} | |
22 | bondcnt=0 | |
23 | ||
24 | # Detect Distro | |
25 | if [ -f /etc/redhat-release ]; | |
26 | then | |
27 | cfgdir=/etc/sysconfig/network-scripts | |
28 | distro=redhat | |
29 | elif grep -q 'Ubuntu' /etc/issue | |
30 | then | |
31 | cfgdir=/etc/network | |
32 | distro=ubuntu | |
33 | elif grep -q 'SUSE' /etc/issue | |
34 | then | |
35 | cfgdir=/etc/sysconfig/network | |
36 | distro=suse | |
37 | else | |
38 | echo "Unsupported Distro" | |
39 | exit 1 | |
40 | fi | |
41 | ||
42 | echo Detected Distro: $distro, or compatible | |
43 | ||
44 | # Get a list of ethernet names | |
45 | list_eth=(`cd $sysdir && ls -d */ | cut -d/ -f1 | grep -v bond`) | |
46 | eth_cnt=${#list_eth[@]} | |
47 | ||
48 | echo List of net devices: | |
49 | ||
50 | # Get the MAC addresses | |
51 | for (( i=0; i < $eth_cnt; i++ )) | |
52 | do | |
53 | list_mac[$i]=`cat $sysdir/${list_eth[$i]}/address` | |
54 | echo ${list_eth[$i]}, ${list_mac[$i]} | |
55 | done | |
56 | ||
57 | # Find NIC with matching MAC | |
58 | for (( i=0; i < $eth_cnt-1; i++ )) | |
59 | do | |
60 | for (( j=i+1; j < $eth_cnt; j++ )) | |
61 | do | |
62 | if [ "${list_mac[$i]}" = "${list_mac[$j]}" ] | |
63 | then | |
64 | list_match[$i]=${list_eth[$j]} | |
65 | break | |
66 | fi | |
67 | done | |
68 | done | |
69 | ||
70 | function create_eth_cfg_redhat { | |
71 | local fn=$cfgdir/ifcfg-$1 | |
72 | ||
73 | rm -f $fn | |
74 | echo DEVICE=$1 >>$fn | |
75 | echo TYPE=Ethernet >>$fn | |
76 | echo BOOTPROTO=none >>$fn | |
fd7aabb0 | 77 | echo UUID=`uuidgen` >>$fn |
178cd55f | 78 | echo ONBOOT=yes >>$fn |
178cd55f HZ |
79 | echo PEERDNS=yes >>$fn |
80 | echo IPV6INIT=yes >>$fn | |
81 | echo MASTER=$2 >>$fn | |
82 | echo SLAVE=yes >>$fn | |
83 | } | |
84 | ||
85 | function create_eth_cfg_pri_redhat { | |
86 | create_eth_cfg_redhat $1 $2 | |
87 | } | |
88 | ||
89 | function create_bond_cfg_redhat { | |
90 | local fn=$cfgdir/ifcfg-$1 | |
91 | ||
92 | rm -f $fn | |
93 | echo DEVICE=$1 >>$fn | |
94 | echo TYPE=Bond >>$fn | |
95 | echo BOOTPROTO=dhcp >>$fn | |
fd7aabb0 | 96 | echo UUID=`uuidgen` >>$fn |
178cd55f | 97 | echo ONBOOT=yes >>$fn |
178cd55f HZ |
98 | echo PEERDNS=yes >>$fn |
99 | echo IPV6INIT=yes >>$fn | |
100 | echo BONDING_MASTER=yes >>$fn | |
101 | echo BONDING_OPTS=\"mode=active-backup miimon=100 primary=$2\" >>$fn | |
102 | } | |
103 | ||
1a4691b2 | 104 | function del_eth_cfg_ubuntu { |
9aef88ec HZ |
105 | local mainfn=$cfgdir/interfaces |
106 | local fnlist=( $mainfn ) | |
107 | ||
108 | local dirlist=(`awk '/^[ \t]*source/{print $2}' $mainfn`) | |
109 | ||
110 | local i | |
111 | for i in "${dirlist[@]}" | |
112 | do | |
113 | fnlist+=(`ls $i 2>/dev/null`) | |
114 | done | |
115 | ||
1a4691b2 HZ |
116 | local tmpfl=$(mktemp) |
117 | ||
118 | local nic_start='^[ \t]*(auto|iface|mapping|allow-.*)[ \t]+'$1 | |
119 | local nic_end='^[ \t]*(auto|iface|mapping|allow-.*|source)' | |
120 | ||
9aef88ec HZ |
121 | local fn |
122 | for fn in "${fnlist[@]}" | |
123 | do | |
124 | awk "/$nic_end/{x=0} x{next} /$nic_start/{x=1;next} 1" \ | |
125 | $fn >$tmpfl | |
1a4691b2 | 126 | |
9aef88ec HZ |
127 | cp $tmpfl $fn |
128 | done | |
1a4691b2 HZ |
129 | |
130 | rm $tmpfl | |
131 | } | |
132 | ||
178cd55f HZ |
133 | function create_eth_cfg_ubuntu { |
134 | local fn=$cfgdir/interfaces | |
135 | ||
1a4691b2 | 136 | del_eth_cfg_ubuntu $1 |
178cd55f HZ |
137 | echo $'\n'auto $1 >>$fn |
138 | echo iface $1 inet manual >>$fn | |
139 | echo bond-master $2 >>$fn | |
140 | } | |
141 | ||
142 | function create_eth_cfg_pri_ubuntu { | |
143 | local fn=$cfgdir/interfaces | |
144 | ||
a22431a3 | 145 | del_eth_cfg_ubuntu $1 |
146 | echo $'\n'allow-hotplug $1 >>$fn | |
147 | echo iface $1 inet manual >>$fn | |
148 | echo bond-master $2 >>$fn | |
178cd55f HZ |
149 | echo bond-primary $1 >>$fn |
150 | } | |
151 | ||
152 | function create_bond_cfg_ubuntu { | |
153 | local fn=$cfgdir/interfaces | |
154 | ||
1a4691b2 HZ |
155 | del_eth_cfg_ubuntu $1 |
156 | ||
178cd55f HZ |
157 | echo $'\n'auto $1 >>$fn |
158 | echo iface $1 inet dhcp >>$fn | |
159 | echo bond-mode active-backup >>$fn | |
160 | echo bond-miimon 100 >>$fn | |
161 | echo bond-slaves none >>$fn | |
162 | } | |
163 | ||
164 | function create_eth_cfg_suse { | |
165 | local fn=$cfgdir/ifcfg-$1 | |
166 | ||
167 | rm -f $fn | |
168 | echo BOOTPROTO=none >>$fn | |
169 | echo STARTMODE=auto >>$fn | |
170 | } | |
171 | ||
172 | function create_eth_cfg_pri_suse { | |
2d68f0a4 | 173 | local fn=$cfgdir/ifcfg-$1 |
174 | ||
175 | rm -f $fn | |
176 | echo BOOTPROTO=none >>$fn | |
177 | echo STARTMODE=hotplug >>$fn | |
178cd55f HZ |
178 | } |
179 | ||
180 | function create_bond_cfg_suse { | |
181 | local fn=$cfgdir/ifcfg-$1 | |
182 | ||
183 | rm -f $fn | |
184 | echo BOOTPROTO=dhcp >>$fn | |
185 | echo STARTMODE=auto >>$fn | |
186 | echo BONDING_MASTER=yes >>$fn | |
187 | echo BONDING_SLAVE_0=$2 >>$fn | |
188 | echo BONDING_SLAVE_1=$3 >>$fn | |
189 | echo BONDING_MODULE_OPTS=\'mode=active-backup miimon=100 primary=$2\' >>$fn | |
190 | } | |
191 | ||
192 | function create_bond { | |
193 | local bondname=bond$bondcnt | |
194 | local primary | |
195 | local secondary | |
196 | ||
197 | local class_id1=`cat $sysdir/$1/device/class_id 2>/dev/null` | |
198 | local class_id2=`cat $sysdir/$2/device/class_id 2>/dev/null` | |
199 | ||
200 | if [ "$class_id1" = "$netvsc_cls" ] | |
201 | then | |
202 | primary=$2 | |
203 | secondary=$1 | |
204 | elif [ "$class_id2" = "$netvsc_cls" ] | |
205 | then | |
206 | primary=$1 | |
207 | secondary=$2 | |
208 | else | |
209 | return 0 | |
210 | fi | |
211 | ||
212 | echo $'\nBond name:' $bondname | |
213 | ||
214 | echo configuring $primary | |
215 | create_eth_cfg_pri_$distro $primary $bondname | |
216 | ||
217 | echo configuring $secondary | |
218 | create_eth_cfg_$distro $secondary $bondname | |
219 | ||
220 | echo creating: $bondname with primary slave: $primary | |
221 | create_bond_cfg_$distro $bondname $primary $secondary | |
222 | ||
223 | let bondcnt=bondcnt+1 | |
224 | } | |
225 | ||
226 | for (( i=0; i < $eth_cnt-1; i++ )) | |
227 | do | |
228 | if [ -n "${list_match[$i]}" ] | |
229 | then | |
230 | create_bond ${list_eth[$i]} ${list_match[$i]} | |
231 | fi | |
232 | done |