|
@@ -0,0 +1,193 @@
|
|
|
+#!/bin/bash
|
|
|
+
|
|
|
+# This example script creates bonding network devices based on synthetic NIC
|
|
|
+# (the virtual network adapter usually provided by Hyper-V) and the matching
|
|
|
+# VF NIC (SRIOV virtual function). So the synthetic NIC and VF NIC can
|
|
|
+# function as one network device, and fail over to the synthetic NIC if VF is
|
|
|
+# down.
|
|
|
+#
|
|
|
+# Usage:
|
|
|
+# - After configured vSwitch and vNIC with SRIOV, start Linux virtual
|
|
|
+# machine (VM)
|
|
|
+# - Run this scripts on the VM. It will create configuration files in
|
|
|
+# distro specific directory.
|
|
|
+# - Reboot the VM, so that the bonding config are enabled.
|
|
|
+#
|
|
|
+# The config files are DHCP by default. You may edit them if you need to change
|
|
|
+# to Static IP or change other settings.
|
|
|
+#
|
|
|
+
|
|
|
+sysdir=/sys/class/net
|
|
|
+netvsc_cls={f8615163-df3e-46c5-913f-f2d2f965ed0e}
|
|
|
+bondcnt=0
|
|
|
+
|
|
|
+# Detect Distro
|
|
|
+if [ -f /etc/redhat-release ];
|
|
|
+then
|
|
|
+ cfgdir=/etc/sysconfig/network-scripts
|
|
|
+ distro=redhat
|
|
|
+elif grep -q 'Ubuntu' /etc/issue
|
|
|
+then
|
|
|
+ cfgdir=/etc/network
|
|
|
+ distro=ubuntu
|
|
|
+elif grep -q 'SUSE' /etc/issue
|
|
|
+then
|
|
|
+ cfgdir=/etc/sysconfig/network
|
|
|
+ distro=suse
|
|
|
+else
|
|
|
+ echo "Unsupported Distro"
|
|
|
+ exit 1
|
|
|
+fi
|
|
|
+
|
|
|
+echo Detected Distro: $distro, or compatible
|
|
|
+
|
|
|
+# Get a list of ethernet names
|
|
|
+list_eth=(`cd $sysdir && ls -d */ | cut -d/ -f1 | grep -v bond`)
|
|
|
+eth_cnt=${#list_eth[@]}
|
|
|
+
|
|
|
+echo List of net devices:
|
|
|
+
|
|
|
+# Get the MAC addresses
|
|
|
+for (( i=0; i < $eth_cnt; i++ ))
|
|
|
+do
|
|
|
+ list_mac[$i]=`cat $sysdir/${list_eth[$i]}/address`
|
|
|
+ echo ${list_eth[$i]}, ${list_mac[$i]}
|
|
|
+done
|
|
|
+
|
|
|
+# Find NIC with matching MAC
|
|
|
+for (( i=0; i < $eth_cnt-1; i++ ))
|
|
|
+do
|
|
|
+ for (( j=i+1; j < $eth_cnt; j++ ))
|
|
|
+ do
|
|
|
+ if [ "${list_mac[$i]}" = "${list_mac[$j]}" ]
|
|
|
+ then
|
|
|
+ list_match[$i]=${list_eth[$j]}
|
|
|
+ break
|
|
|
+ fi
|
|
|
+ done
|
|
|
+done
|
|
|
+
|
|
|
+function create_eth_cfg_redhat {
|
|
|
+ local fn=$cfgdir/ifcfg-$1
|
|
|
+
|
|
|
+ rm -f $fn
|
|
|
+ echo DEVICE=$1 >>$fn
|
|
|
+ echo TYPE=Ethernet >>$fn
|
|
|
+ echo BOOTPROTO=none >>$fn
|
|
|
+ echo ONBOOT=yes >>$fn
|
|
|
+ echo NM_CONTROLLED=no >>$fn
|
|
|
+ echo PEERDNS=yes >>$fn
|
|
|
+ echo IPV6INIT=yes >>$fn
|
|
|
+ echo MASTER=$2 >>$fn
|
|
|
+ echo SLAVE=yes >>$fn
|
|
|
+}
|
|
|
+
|
|
|
+function create_eth_cfg_pri_redhat {
|
|
|
+ create_eth_cfg_redhat $1 $2
|
|
|
+}
|
|
|
+
|
|
|
+function create_bond_cfg_redhat {
|
|
|
+ local fn=$cfgdir/ifcfg-$1
|
|
|
+
|
|
|
+ rm -f $fn
|
|
|
+ echo DEVICE=$1 >>$fn
|
|
|
+ echo TYPE=Bond >>$fn
|
|
|
+ echo BOOTPROTO=dhcp >>$fn
|
|
|
+ echo ONBOOT=yes >>$fn
|
|
|
+ echo NM_CONTROLLED=no >>$fn
|
|
|
+ echo PEERDNS=yes >>$fn
|
|
|
+ echo IPV6INIT=yes >>$fn
|
|
|
+ echo BONDING_MASTER=yes >>$fn
|
|
|
+ echo BONDING_OPTS=\"mode=active-backup miimon=100 primary=$2\" >>$fn
|
|
|
+}
|
|
|
+
|
|
|
+function create_eth_cfg_ubuntu {
|
|
|
+ local fn=$cfgdir/interfaces
|
|
|
+
|
|
|
+ echo $'\n'auto $1 >>$fn
|
|
|
+ echo iface $1 inet manual >>$fn
|
|
|
+ echo bond-master $2 >>$fn
|
|
|
+}
|
|
|
+
|
|
|
+function create_eth_cfg_pri_ubuntu {
|
|
|
+ local fn=$cfgdir/interfaces
|
|
|
+
|
|
|
+ create_eth_cfg_ubuntu $1 $2
|
|
|
+ echo bond-primary $1 >>$fn
|
|
|
+}
|
|
|
+
|
|
|
+function create_bond_cfg_ubuntu {
|
|
|
+ local fn=$cfgdir/interfaces
|
|
|
+
|
|
|
+ echo $'\n'auto $1 >>$fn
|
|
|
+ echo iface $1 inet dhcp >>$fn
|
|
|
+ echo bond-mode active-backup >>$fn
|
|
|
+ echo bond-miimon 100 >>$fn
|
|
|
+ echo bond-slaves none >>$fn
|
|
|
+}
|
|
|
+
|
|
|
+function create_eth_cfg_suse {
|
|
|
+ local fn=$cfgdir/ifcfg-$1
|
|
|
+
|
|
|
+ rm -f $fn
|
|
|
+ echo BOOTPROTO=none >>$fn
|
|
|
+ echo STARTMODE=auto >>$fn
|
|
|
+}
|
|
|
+
|
|
|
+function create_eth_cfg_pri_suse {
|
|
|
+ create_eth_cfg_suse $1
|
|
|
+}
|
|
|
+
|
|
|
+function create_bond_cfg_suse {
|
|
|
+ local fn=$cfgdir/ifcfg-$1
|
|
|
+
|
|
|
+ rm -f $fn
|
|
|
+ echo BOOTPROTO=dhcp >>$fn
|
|
|
+ echo STARTMODE=auto >>$fn
|
|
|
+ echo BONDING_MASTER=yes >>$fn
|
|
|
+ echo BONDING_SLAVE_0=$2 >>$fn
|
|
|
+ echo BONDING_SLAVE_1=$3 >>$fn
|
|
|
+ echo BONDING_MODULE_OPTS=\'mode=active-backup miimon=100 primary=$2\' >>$fn
|
|
|
+}
|
|
|
+
|
|
|
+function create_bond {
|
|
|
+ local bondname=bond$bondcnt
|
|
|
+ local primary
|
|
|
+ local secondary
|
|
|
+
|
|
|
+ local class_id1=`cat $sysdir/$1/device/class_id 2>/dev/null`
|
|
|
+ local class_id2=`cat $sysdir/$2/device/class_id 2>/dev/null`
|
|
|
+
|
|
|
+ if [ "$class_id1" = "$netvsc_cls" ]
|
|
|
+ then
|
|
|
+ primary=$2
|
|
|
+ secondary=$1
|
|
|
+ elif [ "$class_id2" = "$netvsc_cls" ]
|
|
|
+ then
|
|
|
+ primary=$1
|
|
|
+ secondary=$2
|
|
|
+ else
|
|
|
+ return 0
|
|
|
+ fi
|
|
|
+
|
|
|
+ echo $'\nBond name:' $bondname
|
|
|
+
|
|
|
+ echo configuring $primary
|
|
|
+ create_eth_cfg_pri_$distro $primary $bondname
|
|
|
+
|
|
|
+ echo configuring $secondary
|
|
|
+ create_eth_cfg_$distro $secondary $bondname
|
|
|
+
|
|
|
+ echo creating: $bondname with primary slave: $primary
|
|
|
+ create_bond_cfg_$distro $bondname $primary $secondary
|
|
|
+
|
|
|
+ let bondcnt=bondcnt+1
|
|
|
+}
|
|
|
+
|
|
|
+for (( i=0; i < $eth_cnt-1; i++ ))
|
|
|
+do
|
|
|
+ if [ -n "${list_match[$i]}" ]
|
|
|
+ then
|
|
|
+ create_bond ${list_eth[$i]} ${list_match[$i]}
|
|
|
+ fi
|
|
|
+done
|