Libvirt mit Python

Libvirt mit Python
In einem meiner vorherigen Beiträge habe ich gezeigt, wie man mit Libvirt und KVM beginnen kann. Dieser Virtualisierungsstapel soll nicht als Desktop-Virtualisierungssoftware verwendet werden, sondern auf Servern ausführen, die mehr Flexibilität, Effizienz und Stabilität anstelle von Benutzerfreundlichkeit bieten. Es ist gemeint, dass sie zum n automatisiert werdenth Grad anstatt sich auf manuelle Konfiguration zu verlassen. Schauen wir uns also an.

Das Setup und die grundlegenden Annahmen

Ich verwende eine Libvirt -KVM -Installation auf einem Debian -Server. Die Python -Skripte, die ich verwenden werde, werden in einem Python 3 ausgeführt.7.3 Umgebung. Dieser Artikel soll Ihre Füße mit Libvirts Python -Bindungen nass machen. Wenn Sie Ihre Bewerbung entwerfen.

Lassen Sie uns zuerst alle für libvirt erforderlichen Abhängigkeiten installieren:

$ sudo apt installieren Sie PKG-Config libvirt-dev
$ pip3 Install libvirt-python

Das sind alle Pakete, die Sie brauchen.

Die folgenden Skripte und Ausschnitte werden ausgeführt örtlich Auf dem Libvirt -Host als Root, anstatt auf einem Remote -Client ausgeführt zu werden. Sie können jedoch auf die Dienste zugreifen, um eine lange Exkurs zu erfordern, um die Verbindung zwischen dem Client und dem Server zu sichern. Daher werden wir uns um den Einfachheit halber lokal verbinden.

Verbindung mit dem Libvirtd -Service herstellen

Lassen Sie uns zu Beginn eine Python -Eingabeaufforderung öffnen, die Bibliothek Libvirt importieren und eine Verbindung mit dem Libvirt öffnen.Offene Methode.

root@deb: ~# python3
Python 3.7.3 (Standard, 15. April 2019, 01:55:37)
[GCC 6.3.0 20170516] unter Linux

Geben Sie "Hilfe", "Copyright", "Credits" oder "Lizenz" für weitere Informationen ein.

>>> libvirt importieren
>>> conn = libvirt.Open ('qemu: /// System')

Die variable Conn kann jetzt verwendet werden, um Ihren libvirt -Daemon abzufragen, und wir werden das in Kürze tun. Aber zuerst ein wenig Exkurs.

LIBVIRT kann verwendet werden, um eine Reihe verschiedener Virtualisierungs- und Containerisierungsstapel zu verwalten. KVM-Qemu, Xen und LXC sind die beliebtesten davon. Also, wenn Sie Libvirt betreten.Open ('qemu: /// system') libvirt ermöglicht es Ihnen, Informationen über QEMU -Gäste zu sammeln und zu verwalten. Sie können genauso gut mit LXD -Daemon oder Xen Hypervisor mit LXC: /// System oder Xen: /// System sprechen.

Ebenso die Methode libvirt.Open () ist nicht der einzige, der Ihnen zur Verfügung steht. Open (Name), OpenAuth (URI, Auth, Flags) und OpenReadonly (Name) sind drei verschiedene Anrufe, von denen jeweils ein Virconnect -Objekt zurückgibt und eine unterschiedliche Kontrolle über den Host bietet. Sie können hier mehr darüber lesen. Im Moment haben wir Conn als Objekt der Virconnect -Klasse. Dieses Objekt ist ein Gateway, um fast alles zu tun, von der Konfiguration des Hypervisors selbst bis hin zur Änderung der Gäste und deren Ressourcenzuweisung.

Sobald Sie mit dem Objekt arbeiten.

>>> conn.schließen()

Führen Sie den obigen Befehl jedoch noch nicht aus. Weil wir ein bisschen mehr mit libvirt herumspielen werden. Fragen wir unseren Hypervisor ein paar Details über sich selbst, wie den Hostnamen und die Anzahl der VCPUs, die es insgesamt Gast -VMs für Gast -VMs bieten kann.

>>> conn.Gethostname ()
'Deb'
>>> conn.GetMaxvcpus ('Qemu')
16

Jetzt müssen wir verstehen, dass mit libvirt -Metadaten über Objekte wie Hypervisor -Statistiken, VMs, deren Netzwerk- und Speicherinformationen usw. im XML -Format dargestellt werden. XML ist irgendwie wie JSON nur ein bisschen Clumsier (und ein bisschen älter). Die Daten werden als String -Literal gespeichert und präsentiert. Wenn Sie Libvirt und die Ausgabe dieser Abfrage befragen Neue Zeile. Die integrierte Druckfunktion von Python kann sie für die menschliche Lesbarkeit aufräumen

>>> drucken (conn.GetSysinfo ())


Dell Inc.
A14


VMS auflisten und überwachen

Wenn Sie eine große Reihe von VMs beibehalten. Libvirt ruft die Gast -VMs (oder Container auf, wenn Sie LXC verwenden) Domänen Sie können Informationen zu einzelnen Domänen auflisten und diese konfigurieren, wenn Ihr Virconnect -Objekt über ausreichende Berechtigungen verfügt.

Um Informationen über die VMs und deren Ressourcenauslastung zu erhalten, können Sie die folgenden Anrufe verwenden:

>>> conn.listdomainsid ()
[4, 5]

Dies gibt eine Reihe von Domänen -IDs zurück. Eine zuverlässigere Methode, um Ihre VMs zu kennzeichnen, ohne zwei VMs (sagen wir an verschiedenen Knoten) mit derselben ID oder demselben Namen, besteht darin, UUIDs zu verwenden. In libvirt kann alles eine UUID haben, die zufällig 128 -Bit -Zahl generiert wird. Die Chancen, dass Sie zwei identische UUID erstellen, sind in der Tat ziemlich klein.

Das Netzwerk für Ihre virtuellen Maschinen, die VMs selbst und sogar die Speicherpools und Volumina haben ihre individuellen UUIDs. Nutzen Sie sie liberal in Ihrem Python -Code, anstatt sich auf menschliche zugewiesene Namen zu verlassen. Leider ist der Weg, um die UUIDs of Domains zu erhalten, meiner Meinung nach etwas unordentlich in der aktuellen Implementierung dieser Bibliothek. Sie müssen die ID der VM (die Domänen -ID) angeben. Hier ist, wie sie aussieht.

Domainids = conn.listdomainsid ()
für Domainid in Domainiden:
Domain = conn.LookupbyId ()
uUid = Domain.UUidstring ()
drucken (uUid)

Jetzt sehen Sie die Liste der Domain -Uuids. Wir sind auch auf ein neues Python -Objekt libvirt gestolpert.Virdomain, der seine eigene Methoden hat, die dem Variablen -Conn ähnelt, der ein Libvirt war.Virconnect -Objekt und hatte Methoden wie ListDomainsid () und LookupbyId (), die damit verbunden sind.

Für diese beiden Methoden können Sie die integrierten Dir () -Methoden von Python verwenden, damit die Objekte ihre internen Variablen und Methoden auflisten können.

Zum Beispiel:

>>> dir (conn)
['_… GS', 'Schedulertype', 'Screenshot', 'SecurityLabel', 'SecurityLabellist' ',
"sendkey", "sendProcesssignal", "setAutostart", "setblkioparameters", "setBlockiotun" ',
"setGuestVcpus", "setInterfaceparameters", "setMaxMemory", "setMemory", "setMemoryFlags" ",
'setMemoryParameters', 'setMemoryStatSperiod', 'setMetadata', 'setnumaparameters' ',
"SetperFevents", "setSchedulerParameters", "setSchedulerParametersflags", "SetTime",
'setuse'…]

Dies kann Ihnen wirklich helfen, sich schnell an den genauen Namen einer Methode und das Objekt zu erinnern, mit dem es verwendet werden sollte. Jetzt, wo wir ein libvirt haben.Virdomain -Objekt, verwenden wir es, um verschiedene Details zu diesem laufenden VM aufzulisten.

>>> Domain.die Info()

Dies gibt Ihnen die Informationen zum Zustand der VM-, maximalen Speicher- und CPU -Kerne, wie hier gezeigt.

Sie können auch andere Informationen über die VM mit verschiedenen Methoden wie Ostype () finden

>>> Domain.Ostype ()
"HVM"

Es gibt viel Flexibilität, wenn es um die API geht, die Libvirt ausstellt, und Sie müssen sich nur um Ihren Anwendungsfall und ohne Sorgen um die enorme Komplexität, die Libvirt behandelt.

Abschluss

In meinen Reisen in die Libvirt -Technologie war das Fehlen von Uuiden als erstklassiger Bürger wahrscheinlich der einzige Schmerzpunkt, mit dem ich ausgesetzt war und der wie eine schlechte Designauswahl schien. Abgesehen davon ist libvirt ziemlich nützlich für das, was es erreicht. Ja, es gibt viele andere Dinge, die besser hätten getan werden können, aber das ist immer bei Software der Fall. Im Nachhinein sind schlechte Entscheidungen immer offensicht.

Darüber wurde viel aufgebaut, da das Projekt langsam und stetig entwickelt wurde.

Anstatt zu versuchen, die gesamte Bibliothek gleichzeitig zu lernen, würde ich empfehlen, ein kleines Projekt oder eine Idee zu entwickeln und die Verwendung von Python und Libvirt zu implementieren. Die Dokumentation ist mit vielen Beispielen ziemlich umfangreich und zwingt Sie wirklich, gleichzeitig über den richtigen Softwaredesign und den Virtualisierungsstapel nachzudenken.