Python

Libvirt met Python

Libvirt met Python
In een van mijn vorige posts heb ik laten zien hoe je aan de slag kan met Libvirt en KVM. Deze virtualisatiestack is niet bedoeld om te worden gebruikt als desktopvirtualisatiesoftware, maar om te draaien op servers die meer flexibiliteit, efficiëntie en stabiliteit bieden, in plaats van gebruiksvriendelijkheid. Het is bedoeld worden geautomatiseerd naar de ndit graad in plaats van te vertrouwen op handmatige configuratie. Laten we dus eens kijken hoe je verbinding kunt maken met je libvirt-daemon en het basisbeheer en de monitoring van VM's kunt automatiseren met Python.

De setup en basisveronderstellingen

Ik gebruik een Libvirt KVM-installatie op een Debian-server. De Python-scripts die ik zal gebruiken, worden uitgevoerd in een Python 3.7.3 omgeving:. Dit artikel is bedoeld om je voeten nat te maken met Libvirt's Python-bindingen, wanneer je je applicatie ontwerpt, moet je altijd de officiële documentatie raadplegen die een breed scala aan gebruiksgevallen dekt en redelijk vaak wordt bijgewerkt.

Laten we eerst alle benodigde afhankelijkheden voor libvirt installeren:

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

Dat zijn alle pakketten die je nodig hebt.

De volgende scripts en fragmenten worden uitgevoerd lokaal op de Libvirt-host, als root, in plaats van te draaien op een externe client. U kunt op afstand toegang krijgen tot de services, maar dat zou een lange uitweiding vergen om de verbinding tussen de client en de server te beveiligen. Daarom zullen we lokaal verbinden, omwille van de eenvoud.

Verbinding maken met de Libvirtd-service

Laten we om te beginnen een Python-prompt openen, de libvirt-bibliotheek importeren en een verbinding openen met de libvirt.open methode.

root@deb:~# python3
Python 3.7.3 (standaard, 15 april 2019, 01:55:37)
[GCC 6.3.0 20170516] op linux

Typ "help", "copyright", "credits" of "licentie" voor meer informatie.

>>> libvirt importeren
>>> conn = libvirt.open('qemu:///systeem')

De variabele conn kan nu worden gebruikt om je libvirt-daemon op te vragen en we zullen dat binnenkort doen. Maar eerst een kleine uitweiding.

Libvirt kan worden gebruikt om een ​​aantal verschillende virtualisatie- en containerisatiestacks te beheren. KVM-QEMU, Xen en LXC zijn de meest populaire hiervan. Dus als je libvirt invoert.open('qemu:///system') libvirt stelt je in staat om informatie te verzamelen over, en te beheren, QEMU gasten. U kunt net zo goed praten met LXD-daemon of Xen-hypervisor met respectievelijk lxc:///system of xen:///system.

Evenzo is de methode libvirt.open() is niet de enige die tot je beschikking staat. open(name), openAuth(uri, auth, flags) en openReadOnly(name) zijn drie verschillende aanroepen die elk een virConnect-object retourneren en een verschillende mate van controle over de host bieden. Hier kun je meer over lezen. Voor nu hebben we conn als een object van de virConnect-klasse. Dit object is een toegangspoort voor bijna alles, van het configureren van de hypervisor zelf tot het wijzigen van de gasten en hun toewijzing van middelen resource.

Als u klaar bent met werken met het object, zorg er dan voor dat u de verbinding verbreekt door de methode close erop aan te roepen.

>>> verbinding.dichtbij()

Voer de bovenstaande opdracht echter nog niet uit. Omdat we wat meer met libvirt zullen spelen. Laten we onze hypervisor een paar details over zichzelf vragen, zoals de hostnaam en het aantal vCPU's dat het in totaal aan gast-VM's kan bieden.

>>> verbinding.getHostnaam()
'deb'
>>> verbinding.getMaxVcpus('qemu')
16

Nu moeten we begrijpen dat met Libvirt metadata over objecten zoals hypervisor-statistieken, VM's, hun netwerk- en opslaginformatie, enz. allemaal worden weergegeven in XML-formaat. XML is een beetje zoals JSON, alleen een beetje onhandiger (en een beetje ouder). De gegevens worden opgeslagen en gepresenteerd als een letterlijke tekenreeks en wat dat betekent is dat als je libvirt opvraagt ​​en de uitvoer van die vraag XML is, je een heel lange uitvoer van één regel krijgt met '\n' aanwezig als een letterlijke tekenreeks in plaats van een nieuwe lijn. De ingebouwde afdrukfunctie van Python kan het opschonen voor menselijke leesbaarheid

>>> afdrukken (verbinden).getSysinfo())


Dell Inc.
A14

 

VM's weergeven en bewaken

Als u een groot aantal VM's onderhoudt, hebt u een methode nodig om honderden VM's met uniforme configuratie te maken die ook goed kunnen worden geschaald van eenvoudige single-threaded workloads naar multi-core, multi-threaded verwerking. Libvirt roept de gast-VM's aan (of containers als je LXC gebruikt) Domeinen en u kunt informatie over individuele domeinen weergeven en deze configureren als uw virConnect-object voldoende privileges heeft.

Voor informatie over de VM's en hun resourcegebruik kunt u de volgende aanroepen gebruiken:

>>> verbinding.lijstDomein-ID()
[4, 5]

Dit retourneert een array van domein-ID's die slechts kleine gehele getallen zijn voor een eenvoudige libvirt-setup. Een betrouwbaardere manier om uw VM's te labelen, zonder twee VM's (laten we zeggen op verschillende knooppunten) met dezelfde ID of naam te hebben, is door UUID's te gebruiken. In libvirt kan alles een UUID hebben, die willekeurig wordt gegenereerd door een 128-bits nummer. De kans dat je twee identieke UUID's maakt, is inderdaad vrij klein.

Het netwerk voor uw virtuele machines, de VM's zelf en zelfs de opslagpools en volumes hebben hun individuele UUID's. Maak er ruimschoots gebruik van in uw Python-code, in plaats van te vertrouwen op door mensen toegewezen namen. Helaas is de manier om de UUID's van domeinen te krijgen een beetje rommelig in de huidige implementatie van deze bibliotheek, naar mijn mening. Het vereist wel dat je de ID van de VM (de domein-ID) opgeeft, zo ziet het eruit:.

domein-ID's = verbinding.lijstDomein-ID()
voor domein-ID in domein-ID's:
domein = verbinding.lookupByID()
uuid = domein.UUIDstring()
afdrukken (uuid)

Nu kunt u de lijst met domein-UUID's zien. We zijn ook een nieuwe Python Object libvirt tegengekomen.virDomain, die zijn eigen set methoden heeft die ermee verbonden zijn, net zoals de variabele conn die een libvirt was.virConnect-object en hadden methoden zoals listDomainsID() en lookupByID() eraan gekoppeld.

Voor beide methoden kun je de ingebouwde dir()-methoden van Python gebruiken, zodat de objecten hun interne variabelen en methoden kunnen weergeven.

Bijvoorbeeld:

>>> dir (conn)
['_… gs', 'schedulerType', 'screenshot', 'securityLabel', 'securityLabelList',
'sendKey', 'sendProcessSignal', 'setAutostart', 'setBlkioParameters', 'setBlockIoTune',
'setGuestVcpus','setInterfaceParameters', 'setMaxMemory', 'setMemory', 'setMemoryFlags',
'setMemoryParameters','setMemoryStatsPeriod', 'setMetadata', 'setNumaParameters',
'setPerfEvents', 'setSchedulerParameters','setSchedulerParametersFlags', 'setTime',
'setUse'… ]

Dit kan je echt helpen om snel de exacte naam van een methode te herinneren en het object waarmee het zou moeten worden gebruikt. Nu we een libvirt hebben.virDomain-object, laten we het gebruiken om verschillende details over deze draaiende VM op te sommen.

>>> domein.informatie()

Dit geeft u de informatie over de status van de VM, het maximale geheugen en de cpu-cores zoals hier wordt weergegeven.

U kunt ook andere informatie over de VM vinden met behulp van verschillende methoden, zoals OSType()

>>> domein.OSType()
'hvm'

Er is veel flexibiliteit als het gaat om de API die libvirt blootlegt en je hoeft je alleen maar zorgen te maken over je use case en zonder je zorgen te maken over de enorme complexiteit die libvirt afhandelt.

Conclusie

Tijdens mijn reizen naar de Libvirt-technologie was de afwezigheid van UUID's als eersteklas burger waarschijnlijk het enige pijnpunt dat ik ondervond dat een slechte ontwerpkeuze leek. Afgezien daarvan is libvirt best handig voor wat het bereikt. Ja, er zijn veel andere dingen die beter hadden gekund, maar dat is altijd het geval met software. Achteraf gezien zijn slechte beslissingen altijd duidelijk, maar de kosten van het herschrijven van een stukje software, zo wijdverbreid als libvirt, zijn vaak enorm.

Er is veel bovenop gebouwd, terwijl het project zich langzaam en gestaag ontwikkelde.

In plaats van te proberen de hele bibliotheek in één keer te leren, zou ik aanraden een klein project of een idee te bedenken en dat te implementeren met Python en Libvirt. De documentatie is behoorlijk uitgebreid met veel voorbeelden en het dwingt je echt om tegelijkertijd na te denken over het juiste softwareontwerp en de virtualisatiestack.

Installeer de nieuwste Dolphin Emulator voor Gamecube & Wii op Linux
Met de Dolphin Emulator kun je de door jou gekozen Gamecube- en Wii-spellen spelen op Linux Personal Computers (pc). Omdat het een vrij beschikbare e...
Hoe de GameConqueror Cheat Engine in Linux te gebruiken
Het artikel bevat een handleiding over het gebruik van de GameConqueror cheat-engine in Linux. Veel gebruikers die games op Windows spelen, gebruiken ...
Beste gameconsole-emulators voor Linux
Dit artikel bevat een lijst van populaire emulatiesoftware voor gameconsoles die beschikbaar is voor Linux. Emulatie is een softwarecompatibiliteitsla...