123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- #!/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
|