我正在尝试学习 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/
因此,我的观点是:
- 拥有 ovs 桥 (testbridge)
- 将主机的物理以太网(enp5s0)连接到 testbridge
- 创建了两个虚拟 Tap 设备(virtualport1 和 2)
- 将分接头连接至测试桥
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”:
- 作为 vlan 100 中的访问端口?
- 作为中继端口,在 VLAN 100、150 和 151 上?
- 将任何/所有标记的 VLAN 中继到 testbridge 上存在的 VLAN 吗?
- 与 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 端口转发即可,如下所示:
- https://blog.scottlowe.org/2012/08/21/working-with-kvm-guests
- https://blog.scottlowe.org/2013/08/21/accessing-vnc-consoles-of-kvm-guests-via-ssh/
- https://blog.scottlowe.org/2013/09/10/adjusting-vnc-console-access-via-libvirt-xml/
在这里阅读有关 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