Python

Libvirt mit Python

Libvirt mit Python
In einem meiner vorherigen Beiträge habe ich gezeigt, wie man mit Libvirt und KVM loslegen kann. Dieser Virtualisierungs-Stack ist nicht als Desktop-Virtualisierungssoftware gedacht, sondern soll auf Servern laufen, die mehr Flexibilität, Effizienz und Stabilität bieten, anstatt Benutzerfreundlichkeit. Es soll auf die n automatisiert werdendas Grad, anstatt sich auf die manuelle Konfiguration zu verlassen. Sehen wir uns also an, wie Sie sich mit Ihrem libvirt-Daemon verbinden und die grundlegende VM-Verwaltung und -Überwachung mit Python automatisieren können.

Das Setup und die Grundannahmen

Ich verwende eine Libvirt KVM-Installation auf einem Debian-Server. Die Python-Skripte, die ich verwenden werde, laufen in einem Python 3.7.3 Umgebung. Dieser Artikel soll Ihre Füße mit den Python-Bindungen von Libvirt nass machen. Wenn Sie Ihre Anwendung entwerfen, sollten Sie immer die offizielle Dokumentation zu Rate ziehen, die eine Vielzahl von Anwendungsfällen abdeckt und relativ häufig aktualisiert wird.

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

$ sudo apt install  pkg-config libvirt-dev
$ pip3 installiere libvirt-python

Das sind alle Pakete, die Sie brauchen.

Die folgenden Skripte und Snippets werden ausgeführt örtlich auf dem Libvirt-Host als Root, anstatt auf einem Remote-Client ausgeführt zu werden. Sie können jedoch aus der Ferne auf die Dienste zugreifen, was einen langen Exkurs in die Sicherung der Verbindung zwischen Client und Server erfordern würde. Daher verbinden wir uns der Einfachheit halber lokal.

Herstellen einer Verbindung mit dem Libvirtd-Dienst

Um zu beginnen, öffnen wir eine Python-Eingabeaufforderung, importieren die libvirt-Bibliothek und öffnen eine Verbindung mit der libvirt.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“ ein, um weitere Informationen zu erhalten.

>>> 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 kleiner Exkurs.

Libvirt kann verwendet werden, um eine Reihe verschiedener Virtualisierungs- und Containerisierungs-Stacks zu verwalten. KVM-QEMU, Xen und LXC sind die beliebtesten davon. Wenn Sie also libvirt eingeben enter.open('qemu:///system') libvirt ermöglicht es Ihnen, Informationen über QEMU-Gäste zu sammeln und zu verwalten manage. Sie können genauso gut mit dem LXD-Daemon oder dem Xen-Hypervisor sprechen, indem Sie lxc:///system bzw. xen:///system verwenden.

Ebenso die Methode libvirt.open() ist nicht das einzige, das Ihnen zur Verfügung steht. open(name), openAuth(uri, auth, flags) und openReadOnly(name) sind drei verschiedene Aufrufe, von denen jeder ein virConnect-Objekt zurückgibt und unterschiedliche Kontrolle über den Host bietet. Hier kannst du mehr darüber lesen. Im Moment haben wir conn als Objekt der virConnect-Klasse. Dieses Objekt ist ein Gateway für fast alles, von der Konfiguration des Hypervisors selbst bis hin zur Änderung der Gäste und ihrer Ressourcenzuweisung.

Wenn Sie mit der Arbeit mit dem Objekt fertig sind, stellen Sie sicher, dass Sie die Verbindung schließen, indem Sie die close-Methode darauf aufrufen.

>>> Anschluss.schließen()

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

>>> Anschluss.getHostname()
'deb'
>>> Anschluss.getMaxVcpus('qemu')
16

Jetzt müssen wir verstehen, dass mit Libvirt Metadaten zu Objekten wie Hypervisor-Statistiken, VMs, deren Netzwerk- und Speicherinformationen usw. alle im XML-Format dargestellt werden. XML ist ähnlich wie JSON nur etwas ungeschickter (und etwas älter). Die Daten werden als String-Literal gespeichert und dargestellt. Das bedeutet, dass, wenn Sie libvirt abfragen und die Ausgabe dieser Abfrage XML ist, Sie eine wirklich lange einzeilige Ausgabe mit '\n' als Literal-String und nicht als a erhalten Neue Zeile. Die integrierte Druckfunktion von Python kann es für die menschliche Lesbarkeit bereinigen

>>> drucken(conn.getSysinfo())


Dell Inc.
A14

 

VMs auflisten und überwachen

Wenn Sie ein großes Array von VMs verwalten, benötigen Sie eine Methode, um Hunderte von VMs mit einheitlicher Konfiguration zu erstellen, die auch von einfachen Single-Threaded-Workloads bis hin zu Multi-Core-Multi-Thread-Verarbeitung richtig skaliert werden können. Libvirt ruft die Gast-VMs (oder Container, wenn Sie LXC verwenden) auf Domänen und Sie können Informationen zu einzelnen Domänen auflisten und diese konfigurieren, wenn Ihr virConnect-Objekt über ausreichende Berechtigungen verfügt.

Um Informationen zu den VMs und deren Ressourcenauslastung zu erhalten, können Sie die folgenden Aufrufe verwenden:

>>> Anschluss.listDomainsID()
[4, 5]

Dies gibt ein Array von Domain-IDs zurück, die nur kleine Ganzzahlen für ein einfaches libvirt-Setup sind. Eine zuverlässigere Möglichkeit, Ihre VMs zu kennzeichnen, ohne zwei VMs (sagen wir auf verschiedenen Knoten) mit derselben ID oder demselben Namen zu haben, ist die Verwendung von UUIDs. In libvirt kann alles eine UUID haben, die zufällig generierte 128-Bit-Zahl ist. Die Wahrscheinlichkeit, dass Sie zwei identische UUIDs erstellen, ist in der Tat ziemlich gering.

Das Netzwerk für Ihre virtuellen Maschinen, die VMs selbst und sogar die Speicherpools und Volumes haben ihre individuellen UUIDs. Nutzen Sie sie großzügig in Ihrem Python-Code, anstatt sich auf von Menschen vergebene Namen zu verlassen. Leider ist der Weg, um die UUIDs von Domains zu erhalten, meiner Meinung nach in der aktuellen Implementierung dieser Bibliothek etwas chaotisch. Sie müssen die ID der VM (die Domänen-ID) angeben, so sieht sie aus.

domainIDs = conn.listDomainsID()
für domainID in domainIDs:
domain = conn.lookupByID()
uuid = Domäne.UUIDString()
print(UUID)

Jetzt können Sie die Liste der Domain-UUIDs sehen. Wir sind auch über eine neue Python Object libvirt gestolpert.virDomain, die über einen eigenen Satz von Methoden verfügt, ähnlich wie die Variable conn, die eine libvirt war.virConnect-Objekt und hatte Methoden wie listDomainsID() und lookupByID() damit verknüpft with.

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.

Beispielsweise:

>>> dir(an)
['_… gs', 'schedulerType', 'screenshot', 'securityLabel', 'securityLabelList',
'sendKey', 'sendProcessSignal', 'setAutostart', 'setBlkioParameters', 'setBlockIoTune',
'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 des Objekts zu erinnern, mit dem sie verwendet werden soll. Jetzt haben wir eine Libvirt.virDomain-Objekt, verwenden wir es, um verschiedene Details zu dieser laufenden VM aufzulisten.

>>> Domain.die Info()

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

Sie können auch andere Informationen über die VM finden, indem Sie verschiedene Methoden wie OSType() verwenden

>>> Domain.OSTyp()
'hvm'

Es gibt viel Flexibilität, wenn es um die API geht, die libvirt bereitstellt, und Sie müssen sich nur um Ihren Anwendungsfall kümmern und müssen sich keine Gedanken über die enorme Komplexität machen, die libvirt verarbeitet.

Fazit

Auf meinen Reisen in die Libvirt-Technologie war das Fehlen von UUIDs als Bürger erster Klasse wahrscheinlich der einzige Schmerzpunkt, mit dem ich konfrontiert war und der wie eine schlechte Designwahl erschien. Abgesehen davon ist libvirt ziemlich geschickt für das, was es leistet. Ja, es gibt viele andere Dinge, die man besser hätte machen können, aber das ist bei Software immer der Fall. Im Nachhinein sind schlechte Entscheidungen immer offensichtlich, aber die Kosten für das Umschreiben einer Software, die so weit verbreitet ist wie libvirt, sind oft enorm.

Darauf wurde viel aufgebaut, da sich das Projekt langsam und stetig weiterentwickelte.

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

Top 5 ergonomische Computermaus-Produkte für Linux
Verursacht längere Computernutzung Schmerzen im Handgelenk oder in den Fingern?? Leiden Sie unter steifen Gelenken und müssen ständig die Hände schütt...
So ändern Sie die Maus- und Touchpad-Einstellungen mit Xinput in Linux
Die meisten Linux-Distributionen werden standardmäßig mit der Bibliothek „libinput“ ausgeliefert, um Eingabeereignisse auf einem System zu verarbeiten...
Weisen Sie Ihre Maustasten mit der X-Mouse Button Control für verschiedene Software unterschiedlich zu
Vielleicht benötigen Sie ein Tool, mit dem sich die Steuerung Ihrer Maus bei jeder von Ihnen verwendeten Anwendung ändern kann. In diesem Fall können ...