Updated.
1. Скрипт для удаления влана номер VLANID из виртуала номер VEID (при этом также удаляется соответствующий veth-девайс из соответствующего же бриджа).
#!/bin/bash
# usage: ./down-vzvlan.sh VEID VLANID
if [ "$#" -ne "2" ]; then
echo 'There must be 2 parameters! Usage: ./down-vzvlan.sh VEID VLANID'
exit 1
else
GLOBALCONFIGFILE=/etc/vz/vz.conf
vzctl=/usr/sbin/vzctl
ip=/sbin/ip
. $GLOBALCONFIGFILE
VEID=$1
VLANID=$2
VECONFIGFILE=/etc/vz/conf/$VEID.conf
if [ -s $VECONFIGFILE ]; then
. $VECONFIGFILE
echo $ADDITIONAL_VLANS| /bin/grep -q "\b$VLANID\b"
FOUND=$?
if [ "$FOUND" -eq "0" ]; then
eval NET_IF=\$NETIF_${VLANID}
NETIF_OPTIONS=`echo $NET_IF | sed 's/,/\n/g'`
for str in $NETIF_OPTIONS; do
if [[ "$str" =~ ^ifname= ]]; then
VEIFNAME=${str#*=}
fi
if [[ "$str" =~ ^host_ifname= ]]; then
VZHOSTIF=${str#*=}
fi
if [[ "$str" =~ ^bridge= ]]; then
BRIDGEDEV=${str#*=}
fi
if [[ "$str" =~ ^mac= ]]; then
VEIFMAC=${str#*=}
fi
if [[ "$str" =~ ^host_mac= ]]; then
VZHOSTMAC=${str#*=}
fi
done
/usr/sbin/brctl delif $BRIDGEDEV $VZHOSTIF
$vzctl set $VEID --netif_del $VEIFNAME
else
echo "No such VLAN $VLAID in VE$VEID config file!"
exit 1
fi
else
echo "No config file for $VEID, or I can not read it..."
exit 1
fi
fi
2. Скрипт для поднятия в HN нового (ещё не прописанного в /etc/network/interfaces) набора VLANdev + Bridgedev. Позже можно данную пару прописать в конфиг.
#!/bin/bash
# usage: ./up-hostvlanbridge.sh VLAN
if [ "$#" -ne "1" ]; then
echo 'Insufficient parameters given! Usage: ./up-hostvlanbridge.sh VLAN'
exit 1
else
VLAN=$1
/sbin/ifconfig | /bin/grep -q "\beth0.$VLAN\b"
FOUND1=$?
if [ "$FOUND1" -eq "0" ]; then
echo "Vlan $VLAN is already up, checking bridge device vzbr$VLAN ..."
else
/sbin/vconfig add eth0 $VLAN
/sbin/ifconfig eth0.$VLAN up
fi
/sbin/ifconfig | /bin/grep -q "\bvzbr$VLAN\b"
FOUND2=$?
if [ "$FOUND2" -eq "0" ]; then
echo "I dunno, but bridge vzbr$VLAN is already exists and up..."
echo "Anyway, I have to add eth0.$VLAN to this bridge"
else
/usr/sbin/brctl addbr vzbr$VLAN
/sbin/ifconfig vzbr$VLAN up
fi
/usr/sbin/brctl addif vzbr$VLAN eth0.$VLAN
fi
3. Скрипт для создания влана номер VLANID в виртуале номер VEID. Предполагается, что соответствующий влан в HN уже создан, а также создан соответствующий бридж, и данный влан уже в бридж добавлен.
#!/bin/bash
# usage: ./up-vzvlan.sh VEID VLANID
if [ "$#" -ne "2" ]; then
echo 'There must be 2 parameters! Usage: ./up-vzvlan.sh VEID VLANID'
exit 1
else
GLOBALCONFIGFILE=/etc/vz/vz.conf
vzctl=/usr/sbin/vzctl
ip=/sbin/ip
. $GLOBALCONFIGFILE
VEID=$1
VLANID=$2
VECONFIGFILE=/etc/vz/conf/$VEID.conf
if [ -r $VECONFIGFILE ]; then
. $VECONFIGFILE
echo $ADDITIONAL_VLANS | /bin/grep -q "\b$VLANID\b"
FOUND=$?
if [ "$FOUND" -eq "0" ]; then
eval NET_IF=\$NETIF_${VLANID}
NETIF_OPTIONS=`echo $NET_IF | sed 's/,/\n/g'`
for str in $NETIF_OPTIONS; do
if [[ "$str" =~ ^ifname= ]]; then
VEIFNAME=${str#*=}
fi
if [[ "$str" =~ ^host_ifname= ]]; then
VZHOSTIF=${str#*=}
fi
if [[ "$str" =~ ^bridge= ]]; then
BRIDGEDEV=${str#*=}
fi
if [[ "$str" =~ ^mac= ]]; then
VEIFMAC=${str#*=}
fi
if [[ "$str" =~ ^host_mac= ]]; then
VZHOSTMAC=${str#*=}
fi
done
## for vzctl version 3.0.23-8
$vzctl set $VEID --netif_add $VEIFNAME,$VEIFMAC,$VZHOSTIF,$VZHOSTMAC,$BRIDGEDEV
## and this string for vzctl version 3.0.22-14
# $vzctl set $VEID --netif_add $VEIFNAME,$VEIFMAC,$VZHOSTIF,$VZHOSTMAC
/sbin/ifconfig $VZHOSTIF 0
/usr/sbin/brctl addif $BRIDGEDEV $VZHOSTIF
echo 1 > /proc/sys/net/ipv4/conf/$VZHOSTIF/forwarding
echo 1 > /proc/sys/net/ipv4/conf/$BRIDGEDEV/forwarding
$vzctl exec $VEID $ip link set $VEIFNAME up
eval VETH_IP=\$VETH_IP_ADDRESS_${VLANID}
eval VETH_MASK=\$MASK_${VLANID}
$vzctl exec $VEID $ip address add $VETH_IP/$VETH_MASK dev $VEIFNAME
else
echo "No such VLAN $VLANID in VE$VEID config file!"
exit 1
fi
else
echo "No config file for $VEID, or I can not read it..."
exit 1
fi
fi
4. Скрипт для аккуратного рестарта виртуала во всеми его vlan-интерфейсами.
#!/bin/bash
# usage: ./reload-ve.sh VEID
if [ "$#" -ne "1" ]; then
echo 'There must be 1 parameter! Usage: ./reload-ve.sh VEID'
exit 1
else
VEID=$1
VECONFIGFILE=/etc/vz/conf/$VEID.conf
if [ -r $VECONFIGFILE ]; then
/usr/sbin/vzctl restart $VEID
ADD_VLANS=`/bin/grep "^ADDITIONAL_VLANS" $VECONFIGFILE`
FOUND=$?
if [ "$FOUND" -eq "0" ]; then
VLANLIST=${ADD_VLANS#*=}
for VLANID in `echo $VLANLIST | /bin/sed -e 's/\"//g'`; do
/usr/local/sbin/up-vzvlan.sh $VEID $VLANID
done
else
echo "No additional vlans in VE$VEID config file!"
exit 0
fi
else
echo "No config file for $VEID, or I can not read it..."
exit 1
fi
fi
5. Скрипт для поднятия в виртуале статических маршрутов
#!/bin/bash
# usage: ./up-routes.sh VEID
if [ "$#" -ne "1" ]; then
echo 'There must be 1 parameter! Usage: ./up-routes.sh VEID'
exit 1
else
GLOBALCONFIGFILE=/etc/vz/vz.conf
vzctl=/usr/sbin/vzctl
. $GLOBALCONFIGFILE
VEID=$1
VECONFIGFILE=/etc/vz/conf/$VEID.conf
if [ -r $VECONFIGFILE ]; then
. $VECONFIGFILE
if [ -n "$STATIC_ROUTES" ]; then
for ROUTENAME in $STATIC_ROUTES; do
ROUTE=${!ROUTENAME}
ROUTE_PARMS=`echo $ROUTE | sed 's/,/\n/g'`
for str in $ROUTE_PARMS; do
if [[ "$str" =~ ^target_type= ]]; then
TARGET_TYPE=${str#*=}
fi
if [[ "$str" =~ ^target_addr= ]]; then
TARGET_ADDR=${str#*=}
fi
if [[ "$str" =~ ^gw= ]]; then
GATEWAY=${str#*=}
fi
done
$vzctl exec $VEID /sbin/route add -$TARGET_TYPE ${TARGET_ADDR} gw ${GATEWAY}
done
else
echo "No static routes in VE$VEID config file!"
exit 0
fi
else
echo "No config file for $VEID, or I can not read it..."
exit 1
fi
fi