Я запускаю 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