在Xen重新启动时保留OVS镜像

我在Debian上用五个客户VM运行Xen。 我已经使用以下命令设置端口镜像到两个VM: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 \ -- [email protected] get port vif2.0 \ -- [email protected] get port vif5.0 \ -- set mirror detector select_src_port=@eth1 select_dst_port=@eth1 \ -- set mirror detector [email protected] \ -- set mirror recorder select_src_port=@eth1 select_dst_port=@eth1 \ -- set mirror recorder [email protected] 

这似乎工作正常。 所有这些虚拟机都在configuration中有这样的networking设置:

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

问题是,当我重新启动主机时,所有虚拟端口(vifX.Y)都被分配了新的UUID:s,因此镜像上的“output_port”被清除。

如何configuration镜像端口以通过重新启动来正确保留?

我认为这是运行XenServer。

使用@reboot cron任务。

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

不幸的是,脚本可能必须有点复杂,因为您必须预测vif的domID是什么(也许检查VIF MAC地址?)。

XS存在一些问题,并在重新启动时持续存在,因为XS在重新启动时从头重buildOVSdb。 我在启动时使用了类似的方法来创build补丁端口。

注 – 如果您希望VM重新启动以执行端口镜像,则可能必须使用udev脚本。

我最近碰到这个问题,试图解决几乎相同的问题,虽然想创build一个SPAN端口镜像所有stream量到单个端口。 我通过创build用于domU的XEN .cfg文件的自定义“ vif-script ”来解决此问题。

例如,您只需修改XEN .cfg VIF条目以包含:

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

在启动时,脚本将创build一个具有桥和device / vif的唯一名称的新镜像,将该镜像添加到网桥,将该交换机上的所有stream量镜像到新指定的端口/ VIF。 相反,在关机时,脚本会将镜子从桥上移开,并作为副作用,破坏镜子。

您应该能够根据您的特定需求修改脚本,但是您必须知道所有相关domU的端口名称。 您可以使用vifname=string指令来确保您的接口具有一致的名称,但是您仍然可能会遇到订购问题,因为哪个domU会首先启动以确保在使用之前创build端口。

也可能使用vif-post.d/*脚本来完成类似的事情; 因人而异。


vif-ovs-spanport脚本

 #!/bin/bash #============================================================================ # ${XEN_SCRIPT_DIR}/vif-ovs-spanport # # Script for configuring a Open VSwitch (OvS) VIF to be a spanport; # ie 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