Назад | Перейти на главную страницу

Сохранять зеркалирование OVS при перезагрузке Xen

Я запускаю Xen на Debian с пятью гостевыми ВМ: s. Я использовал следующую команду для настройки зеркалирования портов на две виртуальные машины: s

 ovs-vsctl \
  -- --id=@m1 create mirror name=detector \
  -- add bridge xenbr1 mirrors @m1 \
  -- --id=@m2 create mirror name=recorder \
  -- add bridge xenbr1 mirrors @m2 \
  -- --id=@eth1 get port eth1 \
  -- --id=@vif2.0 get port vif2.0 \
  -- --id=@vif5.0 get port vif5.0 \
  -- set mirror detector select_src_port=@eth1 select_dst_port=@eth1 \
  -- set mirror detector output-port=@vif2.0 \
  -- set mirror recorder select_src_port=@eth1 select_dst_port=@eth1 \
  -- set mirror recorder output-port=@vif5.0

Кажется, это нормально работает. Все эти виртуальные машины имеют свою сетевую настройку примерно так в конфигурации:

vif = [ "script=vif-openvswitch,bridge=xenbr1", ...]

Проблема в том, что когда я перезагружаю хост-машину, всем виртуальным портам (vifX.Y) присваиваются новые UUID: s, и поэтому «output_port» на зеркалах очищается.

Как мне настроить зеркальные порты для правильного сохранения после перезагрузки?

Я предполагаю, что это работает XenServer.

Используйте задачу @reboot cron.

@reboot root /usr/bin/bash <path_to_script> > /dev/null 2>&1

К сожалению, сценарий может быть немного сложным, так как вам придется предугадывать, какие доменные идентификаторы для vifs (может быть, проверить MAC-адреса VIF?).

Есть несколько проблем с XS, которые сохраняются при перезагрузках, так как XS восстанавливает OVSdb с нуля при перезагрузке. Я использовал аналогичный подход для создания патч-порта при загрузке.

Примечание. Возможно, вам придется использовать сценарий udev, если вы хотите, чтобы виртуальная машина перезагружалась для зеркалирования порта.

Недавно я столкнулся с этим вопросом, пытаясь решить почти ту же проблему, хотя и хотел создать порт SPAN для зеркалирования. все трафик на единственный порт. Я решил это, создав кастомный "vif-script"для использования в XEN .cfg файл для domU.

Например, вам нужно только изменить XEN .cfg Запись VIF должна включать:

'mac=xx:xx:xx:xx:xx:xx,script=vif-ovs-spanport,bridge=ovsbr0'

При запуске сценарий создаст новое зеркало с уникальным именем, объединяющее мост и устройство / vif, добавит это зеркало к мосту, зеркалируя весь трафик на этом коммутаторе на новый указанный порт / VIF. И наоборот, при завершении работы скрипт удалит зеркало с моста и, как побочный эффект, уничтожит зеркало.

У вас должна быть возможность изменить сценарий в соответствии с вашими конкретными потребностями, хотя вам нужно будет знать имена портов для всех соответствующих domU. Вы могли бы использовать vifname=string директивы, чтобы гарантировать, что у вас есть согласованные имена для интерфейсов, но у вас все равно, вероятно, будет проблема с порядком заказа w.r.t. which domU вызывается первым, чтобы убедиться, что порты созданы перед использованием.

Также можно было бы использовать vif-post.d/* скрипты для выполнения чего-то подобного; YMMV.


vif-ovs-spanport сценарий

#!/bin/bash
#============================================================================
# ${XEN_SCRIPT_DIR}/vif-ovs-spanport
#
# Script for configuring a Open VSwitch (OvS) VIF to be a spanport; 
# i.e. on a (new) mirror, sending all traffic on the bridge to the port.
#
# Usage:
# vif-ovs-spanport (add|remove|online|offline)
#
# Requires the same environment as is required by vif-openvswitch.
# Assumes that vif-openvswitch has already added the port to the bridge.
#
# XEN .cfg file recipie: modify VIF entry
#    'mac=xx:xx:xx:xx:xx:xx,script=vif-ovs-spanport,bridge=ovsbr0'
# On startup, the script will create a new mirror with a unique name
# combinging the bridge and device/vif, add that mirror to the bridge,
# mirroring all traffic on that switch to the new specified port/VIF.
#
# On shutdown, the script will remove the mirror from the bridge and
# as a side-effect, destroy the mirror.
#============================================================================

dir=$(dirname "$0")
prg=$(basename "$0")

# We inherit base behavior, and this should add the port to the bridge for us.
. "$dir/vif-openvswitch"

add_ovsmirror () {
  local dev=$1
  local mirror=$2
  local bridge=$3

  do_or_die \
    ovs-vsctl --timeout=30 \
              -- --id=@m create mirror name=${mirror} \
              -- add bridge ${bridge} mirrors @m \
              -- --id=@p get port ${dev} \
              -- set mirror ${mirror} select_all=true output-port=@p
}

remove_ovsmirror () {
  local mirror=$1
  local bridge=$2

  do_without_error \
    ovs-vsctl --timeout=30 \
              -- --id=@m get mirror ${mirror} \
              -- remove bridge ${bridge} mirrors @m
}

#dev= set in environment
bridge="$(xenstore_read_default "$XENBUS_PATH/bridge" "$bridge")"

# code stolen from vif-openvswitch
if [[ $bridge =~ ^([^.:]+)(\.([[:digit:]]+))?(:([[:digit:]]+(:[[:digit:]]+)*))?$ ]]; then
  bridge="${BASH_REMATCH[1]}"
  #tag="${BASH_REMATCH[3]}"
  #trunk="${BASH_REMATCH[5]//:/,}"
else
  fatal "No valid bridge was specified"
fi

mirror="${bridge}-mirror-span-${dev}"

case "$command" in
    add|online)
        check_tools
        log debug "$prg creating $mirror on $bridge, then adding $dev to mirror."
        add_ovsmirror $dev $mirror $bridge
        ;;

    remove|offline)
        log debug "$prg removing mirror $mirror."
        remove_ovsmirror $mirror $bridge
        ;;
esac

log debug "Successful vif-ovs-spanport $command for $dev on $bridge ($mirror)."
if [ "$type_if" = vif -a "$command" = "online" ]; then
    success
fi