将 Libvirt VM(域 XML 配置)连接到 OpenVSwitch

将 Libvirt VM(域 XML 配置)连接到 OpenVSwitch

我正在尝试学习 OVS 和 KVM,并大致了解虚拟世界中的基本桥接网络(即 OVS、VM 主机和 KVM/Libvirt 客户机之间)。我在 VM 主机上使用 ClearLinux(基于 systemd)。

我的实际问题以粗体显示在下面,希望本文的其余部分能帮助人们就此给我一些建议。

编辑:


从网络工程 StackExchange 中了解到 SU。如果有人知道任何关于 OVS 和 KVM 的优秀培训课程,请告诉我 :-)


迄今为止的参考文献: https://libvirt.org/formatdomain.html http://docs.openvswitch.org/en/latest/howto/libvirt/

因此,我的观点是:

  1. 拥有 ovs 桥 (testbridge)
  2. 将主机的物理以太网(enp5s0)连接到 testbridge
  3. 创建了两个虚拟 Tap 设备(virtualport1 和 2)
  4. 将分接头连接至测试桥

OVS 如下所示:

sudo ovs-vsctl show

010aff41-dc37-410d-87dc-842a1a2cebeb
    Bridge testbridge
        Port "virtualport2"
            Interface "virtualport2"
        Port "enp5s0"
            Interface "enp5s0"
        Port testbridge
            Interface testbridge
                type: internal
        Port "vnet0"
            Interface "vnet0"
        Port "virtualport1"
            Interface "virtualport1"
    ovs_version: "2.8.1"

'enp5s0' 是 vm 主机上的物理端口。它连接到 Cisco SG-300(交换机端口通用接口,中继一组 vlan,通用 pvid 为 25,vlan 25 未标记)。

所有相关 VLAN 上都有一个外部 DHCP 服务器在运行。

我有一个名为“debian”的 libvirt 客户机(创造力加分),其配置如下:

<interface type='bridge'>
  <mac address="00:16:3E:EF:61:91"/>
  <model type='virtio'/>
  <source bridge='testbridge'/>
  <virtualport type='openvswitch'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<graphics type='vnc' port='-1' autoport='yes' sharePolicy='allow-exclusive' passwd='PleaseDontHaxorMe'>
  <listen type='address' listen='0.0.0.0'/>
</graphics>

无论如何,这就是我被困住的地方。我的问题是: 如何在 vnet0 接口(即在客户虚拟机“debian”)上获得一些 L3 乐趣,以便我有一个可以 VNC 的 IP,以便进行安装(我正在使用 debian netinst.iso)?

由于之前从未这样做过,我假设它会通过 DHCP 进行 arp 和启动,然后ip 地址显示 vnet0会向 VNC 显示 VM 的地址...但显然不是。它看起来有点像在 L2 上(如下所示):

ip address show vnet0
16: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq master ovs-system state UNKNOWN group default qlen 1000
    link/ether fe:16:3e:ef:61:91 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc16:3eff:feef:6191/64 scope link
       valid_lft forever preferred_lft forever

但这样做:

sudo ovs-appctl fdb/show testbridge

似乎只列出了端口 1(enp5s0)上的 mac,而不是 vnet0……

如果我能做到这一点,我还想学习如何在 ovs testbridge 上配置“vnet0”:

  1. 作为 vlan 100 中的访问端口?
  2. 作为中继端口,在 VLAN 100、150 和 151 上?
  3. 将任何/所有标记的 VLAN 中继到 testbridge 上存在的 VLAN 吗?
  4. 与 3 相同,但包括未标记的 VLAN?

编辑3:


https://blog.scottlowe.org/2012/11/07/using-vlans-with-ovs-and-libvirt/ 这基本上涵盖了上述要点。还介绍了如何使用 libvirt 域 xml 修补虚拟机。尚未完成所有内容,明天将进行测试。


也就是说,如果我可以首先运行虚拟机来嗅探 vnet0 上的流量并查看实际发生了什么,我可能就可以自己解决最后这 4 个问题...

注意:我原本打算将虚拟机连接到虚拟端口 1,但在某处错过了,结果它在 testbridge 上创建了一个名为“vnet0”的新端口。可以肯定的是,可以使用此处的 ovs 参数在 libvirt domainxml 中修复该问题(稍后会整理,目前是 vnet0!): https://libvirt.org/formatdomain.html#elementsNICSBridge

编辑2:


我认为这个问题可以通过上面的链接解决:

拉取你想要连接的相关端口的 uuid:

sudo ovs-vsctl list Port | grep 'name\|_uuid'

将其添加到相关 VM 的 Libvirt 域 XML 中:

<interface type='bridge'>
  <mac address="00:16:3E:EF:61:91"/>
  <model type='virtio'/>
  <source bridge='testbridge'/>
  <virtualport type='openvswitch'/>
    <parameters interfaceid='YOUR_UUID_GOES_HERE'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

干杯

答案1

好吧,事实证明我XY 已将此内容一些可怕的事情……

一切都正常,我只是不知道如何进行无头安装。事实证明,这样做很简单,只需进行 SSH 端口转发即可,如下所示:

在这里阅读有关 VM 域 XML 配置(特别是与 VNC 相关的元素)的所有内容:

不过,这里有一些简短的说明:

VNC Notes:
* Default - Guest binds it's VNC server to hosts loopback:
    <graphics type='vnc' port='-1' autoport='yes'/>
* The first guest gets screen 0/port 5900, the second guest gets screen 1/port 5901 etc.
* Requires SSH tunneling in order to gain access to the guest domain’s VNC console.
Better VNC Options:
    Guest listens on any host interface, port auto allocated:
        <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'/>
    Guest listens on specified IP, port auto allocated, password protected:
        <graphics type='vnc' port='-1' autoport='yes' passwd='correcthorsebatterystaple'>
          <listen type='address' address='192.168.120.15'/>
        </graphics>
    Guest listens on specified IP and port, password protected with screen share policy:
        <graphics type='vnc' port='5904' listen='192.168.120.15' sharePolicy='allow-exclusive' passwd='correcthorsebatterystaple'>
          <listen type='address'  listen='192.168.120.15'/>
        </graphics>
    Guest listens on specified IP, auto websocket, password protected with screen share policy:
        <graphics type='vnc' websocket='-1' listen='192.168.120.15' sharePolicy='allow-exclusive' passwd='correcthorsebatterystaple'>
          <listen type='address'  listen='192.168.120.15'/>
        </graphics>

总之: 确保已为 VNC 正确设置 VM 域 XML 元素,并且正在使用 netinst iso。配置 OVS 桥接器(如果您正在为 VM 使用 OVS 桥接器)。定义 libvirt 网络 XML。然后在 VM 域定义 XML 中,将其连接到之前定义的使用 OVS 桥接器的 libvirt 网络。

检查虚拟机的监听端口(注意,它是相对于默认值的,:0 表示 5900 上的所有 IP,127.0.0.1:1 表示 5901 上的本地主机等)。

sudo virsh vncdisplay $VM_NAME

SSH 将接口转发到虚拟机,通常如下所示:

ssh -N -L HOST_IP:HOST_PORT:localhost:5900 user@kvmhost

将本地主机 5901 转发到虚拟机 5900:

ssh -N -L 5901:localhost:5900 user@kvmhost

将主机上的特定外部 IP 转发到虚拟机。'-fNT' 用于在后台执行 SSH 转发而不实际停止该过程,从而释放控制台会话以继续使用它:

ssh -fNT -L 192.168.225.17:5901:localhost:5900 user@kvmhost

相关内容