]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blob - tools/hv/bondvf.sh
UBUNTU: Start new release
[mirror_ubuntu-artful-kernel.git] / tools / hv / bondvf.sh
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
77 echo UUID=`uuidgen` >>$fn
78 echo ONBOOT=yes >>$fn
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
96 echo UUID=`uuidgen` >>$fn
97 echo ONBOOT=yes >>$fn
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
104 function del_eth_cfg_ubuntu {
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
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
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
126
127 cp $tmpfl $fn
128 done
129
130 rm $tmpfl
131 }
132
133 function create_eth_cfg_ubuntu {
134 local fn=$cfgdir/interfaces
135
136 del_eth_cfg_ubuntu $1
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
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
149 echo bond-primary $1 >>$fn
150 }
151
152 function create_bond_cfg_ubuntu {
153 local fn=$cfgdir/interfaces
154
155 del_eth_cfg_ubuntu $1
156
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 {
173 local fn=$cfgdir/ifcfg-$1
174
175 rm -f $fn
176 echo BOOTPROTO=none >>$fn
177 echo STARTMODE=hotplug >>$fn
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