Скрипты для ручного управления vlan-девайсами виртуалов OpenVZ

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