Beta labs: RHEV3 hypervisor ”bonding problem” / RHEV3 Hypervisorin bonding-ongelma

Virtualisoidut työasemat – Case Kankaanpää
4.11.2011
Beta labs: Finally managed to connect IPA server to RHEV 3 beta
7.11.2011
Show all

Beta labs: RHEV3 hypervisor ”bonding problem” / RHEV3 Hypervisorin bonding-ongelma

Netorek - Red Hat Enterprize Virtualization

Red Hat Enterprize Virtualization

RHEV3 hypervisor still has a ”bonding problem”, i.e. bonding fails if you try to use an adapter which is in use. You can not bond it using management UI.

I have fixed this by writing my own scripts which unpersist -> modify -> persist ifcfg files. For more complicated operations, I have written scripts system (OO) which is intended to run in a virtual machine – system injects hypervisor machine(s) during the system startup – if one does not want to persist changes to the runtime image. System configures things like network devices, iptables and selinux.

Download the vaccinate script







#!/bin/sh
#
#	vaccinate_hypervisor_for_arlslab_turku for arlslab-base
#
#	@ arl		// 2011		// (c) arlslab / Netorek

#
#	Configurable options.
#

BASEDIR="/etc/sysconfig/network-scripts"
TZ="UTC-3"

#DEBUG=echo

#
#	Configurable setup.
#

bonds="bond0"

bond0_eths="eth0,eth1"

eths="eth0,eth1"

# helper - could be checked from bonds 
eth0_bond=bond0
eth1_bond=bond0

bridges="rhevm,core,base,comm,mgmt"

rhevm_vlan=0
mgmt_vlan=50
core_vlan=51
base_vlan=52
comm_vlan=53

#
#	Manifest.
#

HYPERVISOR=`ifconfig rhevm | grep "inet addr" | sed -e 's%^.*inet addr:[0-9]*.[0-9]*.[0-9]*.([0-9]*) .*$%1%'`

echo "HYPERVISOR: ${HYPERVISOR=}"

#
#	Subroutines.
#

backup()
{
	SUBDIR=`TZ=${TZ} date +%Y%m%d-%H%M`
	mkdir -p "${BASEDIR}/.SAVE/${SUBDIR}"
	cp "${BASEDIR}"/ifcfg-* "${BASEDIR}/.SAVE/${SUBDIR}/"
}

do_unpersist()
{
	if [ -f "$1" ]; then
		unpersist "$1"
	fi
}

do_persist()
{
	persist "$1"
}

do_persist_all()
{
	persist "${BASEDIR}/ifcfg-"*
}

do_check()
{
	if [ -f "${BASEDIR}/vaccinate_hypervisor" ]; then
		echo "Already vaccinated"
		exit 42
	fi
}

do_tag()
{
	touch "${BASEDIR}/vaccinate_hypervisor"
	do_persist "${BASEDIR}/vaccinate_hypervisor"
}

networking_start()
{
	service network start
}

networking_stop()
{
	service network stop
}

bonding_modprobe()
{
	if [ -f /etc/modprobe.d/bonding.conf ]; then
		do_unpersist /etc/modprobe.d/bonding.conf
		mv /etc/modprobe.d/bonding.conf /var/tmp/
	else
		touch /etc/modprobe.d/bonding.conf
		do_persist /etc/modprobe.d/bonding.conf
		do_unpersist /etc/modprobe.d/bonding.conf
	fi

cat > "/etc/modprobe.d/bonding.conf" <<EOF
#
#	/etc/modprobe.d/bonding.conf for a RHEV hypervisor
#
#	@ arl	// 2010-2011	// (c) arlslab
#
#	bond0
#
alias bond0 bonding
options bond0 mode=0 miimon=150
#
#
# EOF
EOF

	do_persist /etc/modprobe.d/bonding.conf
}

#
#	Remove *runtime* interfaces so that there would be no conflicts
#	when networks is started again.
#

vlan_interfaces_remove()
{
	ls /sys/class/net/ | egrep -E 'eth(.*).([0-9]*)' | while read interface
	do
		ETH=`echo $interface | cut -f1 -d.`
		VLAN=`echo $interface | cut -f2 -d.`

		ifconfig $interface down
		vconfig rem $interface
	done

	echo $eths | sed -e 's%,%n%g' | while read interface
	do
		unpersist "${BASEDIR}/ifcfg-"$interface"."*
		rm -f "${BASEDIR}/ifcfg-"$interface"."*
	done
}

eth_construct_interface()
{
	do_unpersist "${BASEDIR}/ifcfg-$1"

	MAC=`grep HWADDR ${BASEDIR}/ifcfg-$1`

	BOND=`eval echo \$$1_bond`

#	$DEBUG "eth $1: bond: $BOND"

cat > "${BASEDIR}/ifcfg-$1" <<EOF
#
#	$1
#
DEVICE=$1
#
#	Linux setup
#
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
#
#	Device setup
#
$MAC
MASTER=$BOND
SLAVE=yes
#
#       Network setup
#
#VLAN=yes
#
#
# EOF
EOF

	do_persist "${BASEDIR}/ifcfg-$1"
}

eth_construct_interfaces()
{
	echo $eths | sed -e 's%,%n%g' | while read interface
	do
		eth_construct_interface $interface
	done
}

bond_construct_vlan()
{
	echo $bridges | sed -e 's%,%n%g' | while read interface
	do
		VLAN=`eval echo \$${interface}_vlan`

#		$DEBUG "bond $1: VLAN = $VLAN (interface: $interface)"

		if [ "$VLAN"x = "0x" ]; then
			do_unpersist "${BASEDIR}/ifcfg-$1"

cat > "${BASEDIR}/ifcfg-$1" <<EOF
#
#	$1
#
DEVICE=$1
#
#	Linux setup
#
BOOTPROTO=none
ONBOOT=yes
BRIDGE=$interface
#
#	Network setup
#
#VLAN=no
#
#
# EOF
EOF

			do_persist "${BASEDIR}/ifcfg-$1"
		else

			do_unpersist "${BASEDIR}/ifcfg-$1.$VLAN"

cat > "${BASEDIR}/ifcfg-$1.$VLAN" <<EOF
#
#	$1.$VLAN
#
DEVICE=$1.$VLAN
#
#	Linux setup
#
BOOTPROTO=none
ONBOOT=yes
BRIDGE=$interface
#
#	Network setup
#
VLAN=yes
#
#
# EOF
EOF

			do_persist "${BASEDIR}/ifcfg-$1.$VLAN"
		fi

	done
}

bond_construct_interface()
{
	do_unpersist "${BASEDIR}/ifcfg-$1"

	ETHS=`eval echo \$$1_eths`

	SLAVE0=`echo $ETHS | cut -f1 -d,`
	SLAVE1=`echo $ETHS | cut -f2 -d,`

cat > "${BASEDIR}/ifcfg-$1" <<EOF
#
#       $1
#
DEVICE=$1
#
#       Linux setup
#
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
#
#       Network setup
#
VLAN=yes
#
#       Bonding setup
#
BONDING_MASTER=yes
BONDING_SLAVE0=$SLAVE0
BONDING_SLAVE1=$SLAVE1
#
#
# EOF
EOF

	bond_construct_vlan $1

	do_persist "${BASEDIR}/ifcfg-$1"
}

bond_construct_interfaces()
{
	echo $bonds | sed -e 's%,%n%g' | while read interface
	do
		bond_construct_interface $interface
	done
}

bridge_construct_interface()
{

	do_unpersist "${BASEDIR}/ifcfg-$1"

	BOOTPROTO=none

	if [ "$1" = "rhevm" ]; then
		BOOTPROTO=dhcp 
	fi

cat > "${BASEDIR}/ifcfg-$1" <<EOF
#
#	$1
#
DEVICE=$1
#
#	Linux setup
#
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=$BOOTPROTO
#
#	Network setup
#

#
#	Bridge setup
#
DELAY=0
STP=on
#
#
# EOF
EOF

	do_persist "${BASEDIR}/ifcfg-$1"
}

bridge_construct_interfaces()
{
	echo $bridges | sed -e 's%,%n%g' | while read interface
	do
		bridge_construct_interface $interface
	done
}

bridge_interface_remove()
{
	ifconfig $1 down
	brctl delbr $1
}

bridge_interfaces_remove()
{
	echo $bridges | sed -e 's%,%n%g' | while read interface
	do
		bridge_interface_remove $interface
	done
}

#
#	MAIN
#

do_check

networking_stop

backup

vlan_interfaces_remove

# safety
networking_stop

eth_construct_interfaces

bond_construct_interfaces

bridge_interfaces_remove

bridge_construct_interfaces

bonding_modprobe

networking_start

do_persist_all

do_tag

#
#
# EOF