Verbindung der Libvirt VMs (Domain XML config) mit OpenVSwitch

386
Chris

Ich versuche, OVS und KVM zu erlernen, und mache im Allgemeinen einen Sinn für das grundlegende Bridge-Networking in der virtuellen Welt (z. B. zwischen OVS, dem VM Host und KVM / Libvirt-Gästen). Ich verwende ClearLinux (auf Systemd-Basis) auf dem VM-Host.

Meine eigentliche Frage ist weiter unten in Fettdruck . Der Rest dieses Beitrags soll hoffentlich helfen, dass Leute mich dazu beraten.

BEARBEITEN:


Wurde auf SU vom Network Engineering StackExchange hingewiesen. Wenn jemand gute Schulungen zu OVS und KVM kennt, lass es mich wissen :-)


Bisherige Referenzen: https://libvirt.org/formatdomain.html http://docs.openvswitch.org/de/latest/howto/libvirt/

Also bin ich auf den Punkt gekommen:

  1. Eine ovs bridge (testbridge) haben
  2. Verbindete das physische Ethernet des Hosts (enp5s0) mit der Testbrücke
  3. Zwei virtuelle Tap-Geräte erstellt (virtualport1 und 2)
  4. Verbindete die Abgriffe mit der Testbrücke

OVS sieht so aus:

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' ist der physische Port auf dem VM-Host. Es ist mit einem Cisco SG-300 verbunden (allgemeine Switchport-Schnittstelle, Trunking einer Reihe von vlans, allgemeines pvid von 25 und vlan 25 ist nicht markiert).

Auf allen relevanten VLANs arbeitet ein externer DHCP-Server.

Ich habe einen libvirt-Gast namens "debian" (Bonusmarken für Kreativität), der wie folgt konfiguriert ist:

<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> 

Jedenfalls stecke ich hier fest. Meine Frage: Wie bekomme ich L3-Freude an der vnet0-Schnittstelle (dh an der Gast-vm 'debian'), also habe ich eine IP zu VNC in, um die Installation durchzuführen (ich verwende das debian.) netinst.iso)?

Nachdem ich das noch nie gemacht hatte, ging ich irgendwie davon aus, dass es über DHCP und die IP-Adresse auftauchen würde, dass vnet0 die Adresse der VM in VNC anzeigt. Offensichtlich nicht. Es sieht so aus, als wäre es bei L2 (wie unten):

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 

Aber mache ein:

sudo ovs-appctl fdb/show testbridge 

Nur scheint Macs auf Port 1 (enp5s0) nicht vnet0 aufzulisten ...

Wenn ich das schaffen kann, wollte ich auch lernen, wie man 'vnet0' auf der ovs testbridge konfiguriert:

  1. Als Zugangsport in vlan 100?
  2. Als Trunk-Port auf vlan 100, 150 und 151?
  3. Um alle / alle markierten VLANs mit der auf der Testbridge vorhandenen Verbindung zu verbinden?
  4. Dasselbe wie 3, aber einschließlich unmarkierter Vlans?

EDIT 3:


https://blog.scottlowe.org/2012/11/07/Verwendung-vlans-mit-ovs-and-libvirt/ Dies deckt die oben genannten Punkte weitgehend ab. Außerdem wird erläutert, wie Sie mit der libvirt-Domänen-XML Patches in einer VM erstellen. Noch nicht fertig, werde es morgen testen.


Das heißt, ich kann diese letzten 4 Dinge wahrscheinlich selbst ausarbeiten, wenn ich überhaupt eine VM dazu bringen kann, den Verkehr auf vnet0 zu schnüffeln und zu sehen, was tatsächlich vor sich geht ...

ANMERKUNG: Ich hatte beabsichtigt, die VM mit virtualport1 zu verbinden, habe dies aber irgendwo verpasst und stattdessen einen neuen Port auf der Testbridge mit dem Namen 'vnet0' erstellt. Ziemlich sicher, dass das in libvirt domainxml mit den ovs-Parametern behoben werden kann (wird später aufgeräumt, vnet0 ist es jetzt!): Https://libvirt.org/formatdomain.html#elementsNICSBridge

EDIT 2:


Ich denke, dieses Bit wird durch den obigen Link gelöst durch:

Ziehen Sie die UUID des jeweiligen Ports, an den Sie anschließen möchten, an:

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

Fügen Sie es der Libvirt-Domain-XML der relevanten VM hinzu:

<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> 

Prost

0

1 Antwort auf die Frage

0
Chris

Okay, es stellte sich heraus, dass ich mit diesem etwas schreckliches ...

Alles hat funktioniert, ich hatte einfach keine Ahnung, wie ich mit der Installation ohne Kopfhörer umgehen sollte. Es stellt sich heraus, dass dies eine einfache Angelegenheit der SSH-Portweiterleitung ist, wie beschrieben:

Lesen Sie hier alles über die VM-Domain-XML-Konfiguration (insbesondere das Element in Bezug auf VNC):

Einige kurze Anmerkungen dazu:

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> 

Zusammenfassend: Stellen Sie sicher, dass das XML-Element der VM-Domäne für VNC richtig eingerichtet ist und Sie eine netinst-iso verwenden. Konfigurieren Sie Ihre OVS-Bridge (wenn Sie dies für die VM verwenden). Definieren Sie eine libvirt-Netzwerk-XML. Verbinden Sie es dann in der VM-Domänendefinitions-XML mit dem zuvor definierten libvirt-Netzwerk, das Ihre OVS-Bridge verwendet.

Überprüfen Sie den Überwachungsport der VM (beachten Sie, dass er relativ zum Standard ist: 0 bedeutet, dass alle IPs auf 5900, 127.0.0.1:1 localhost auf 5901 usw. bedeuten).

sudo virsh vncdisplay $VM_NAME 

SSH leitet eine Schnittstelle an die VM weiter, die generell wie folgt aussieht:

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

Weiterleiten von Localhost 5901 an VM 5900:

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

Weiterleiten einer bestimmten externen IP auf dem Host an die VM. Die '-fNT' wird verwendet, um den SSH vorwärts zu stützen, ohne den Prozess tatsächlich zu stoppen. Dadurch wird die Konsolensitzung für die weitere Verwendung freigegeben:

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