SPECS/hyper-v/bondvf.sh
8a4ec746
 #!/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