Python

Libvirt med Python

Libvirt med Python
I et af mine tidligere indlæg viste jeg, hvordan man kan komme i gang med Libvirt og KVM. Denne virtualiseringsstak er beregnet til ikke at blive brugt som en desktop-virtualiseringssoftware, men snarere er den beregnet til at køre på servere, der tilbyder større fleksibilitet, effektivitet og stabilitet i stedet for brugervenlighed. Det menes at være automatiseret til nth grad snarere end at stole på manuel konfiguration. Så lad os se, hvordan du kan oprette forbindelse til din libvirt-dæmon og automatisere grundlæggende VM-styring og overvågning ved hjælp af Python.

Opsætningen og de grundlæggende antagelser

Jeg bruger en Libvirt KVM-installation på en Debian-server. De Python-scripts, jeg vil bruge, kører i en Python 3.7.3 miljø. Denne artikel skal få dine fødder våde med Libvirts Python-bindinger, når du designer din applikation, skal du altid henvise til den officielle dokumentation, der dækker en bred vifte af brugssager og opdateres med rimelighed ofte.

Lad os først installere alle de afhængigheder, der kræves for libvirt:

$ sudo apt installere pkg-config libvirt-dev
$ pip3 installerer libvirt-python

Det er alle de pakker, du har brug for.

Følgende scripts og uddrag køres lokalt på Libvirt-værten, som root, snarere end at blive kørt på en fjernklient. Du kan få adgang til tjenesterne eksternt, men det vil kræve en lang opsigelse for at sikre forbindelsen mellem klienten og serveren. Derfor vil vi forbinde lokalt for enkelhedens skyld.

Opretter forbindelse til Libvirtd-tjenesten

For at komme i gang, lad os åbne en Python-prompt, importere libvirt-biblioteket og åbne en forbindelse til libvirt.åben metode.

root @ deb: ~ # python3
Python 3.7.3 (standard, 15. apr 2019, 01:55:37)
[GCC 6.3.0 20170516] på Linux

Skriv “hjælp”, “ophavsret”, “kreditter” eller “licens” for at få flere oplysninger.

>>> import libvirt
>>> konn = libvirt.åben ('qemu: /// system')

Variablen Conn kan nu bruges til at forespørge om din libvirt-dæmon, og vi gør det snart. Men først lidt afvigelse.

Libvirt kan bruges til at styre en række forskellige virtualiserings- og containeriseringsstak. KVM-QEMU, Xen og LXC er de mest populære af disse. Så når du indtaster libvirt.open ('qemu: /// system') libvirt giver dig mulighed for at samle information om og administrere QEMU-gæster. Du kan lige så godt tale med LXD-dæmon eller Xen hypervisor ved hjælp af henholdsvis lxc: /// system eller xen: /// system.

Tilsvarende er metoden libvirt.open () er ikke den eneste til din rådighed. open (name), openAuth (uri, auth, flags) og openReadOnly (name) er tre forskellige opkald, som hver returnerer et virConnect-objekt og tilbyder varierende kontrolniveau. Du kan læse mere om dem her. For nu har vi konn som et objekt i virConnect-klassen. Dette objekt er en gateway til at gøre næsten alt fra at konfigurere hypervisoren selv til at ændre gæsterne og deres ressourcetildeling.

Når du er færdig med at arbejde med objektet, skal du sørge for at lukke forbindelsen ved at kalde den tætte metode på den.

>>> tilslutning.tæt()

Kør dog ikke ovenstående kommando endnu. Fordi vi vil lege lidt mere med libvirt. Lad os bede vores hypervisor et par detaljer om sig selv, som værtsnavnet, og antallet af vCPU'er, som den i alt kan tilbyde gæstevm-computere.

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

Nu er vi nødt til at forstå, at med Libvirt-metadata om objekter som hypervisorstatistik, VM'er, deres netværks- og lagerinformation osv. Er alle repræsenteret i XML-format. XML er ligesom JSON kun lidt klodset (og lidt ældre). Dataene gemmes og præsenteres som en strenglitteral, og hvad det betyder er, at hvis du spørger libvirt, og output af denne forespørgsel er XML, får du en rigtig lang enkelt linieoutput med '\ n' til stede som en bogstavelig streng snarere end en ny linje. Pythons indbyggede udskrivningsfunktion kan rense den for menneskelig læsbarhed

>>> print (tilslutning.getSysinfo ())


Dell Inc.
A14
..
 

Notering og overvågning af virtuelle computere

Hvis du vedligeholder et stort udvalg af virtuelle computere, har du brug for en metode til at oprette hundreder af virtuelle computere med ensartet konfiguration, som også skaleres ordentligt fra enkle enkeltgevindede arbejdsbelastninger til multikerne, multitrådet behandling. Libvirt kalder gæstens virtuelle maskiner (eller containere, hvis du bruger LXC) Domæner og du kan liste oplysninger om individuelle domæner samt konfigurere dem, hvis dit virConnect-objekt har tilstrækkelige privilegier.

For at få oplysninger om VM'erne og deres ressourceudnyttelse kan du bruge følgende opkald:

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

Dette returnerer en række domæne-id'er, der kun er små heltal for en simpel libvirt-opsætning. En mere pålidelig måde at mærke dine virtuelle computere på uden at have to virtuelle computere (lad os sige på forskellige noder) med samme ID eller navn er at bruge UUID'er. I libvirt kan alt have et UUID, som tilfældigt genereres 128 bit nummer. Chancerne for at du opretter to identiske UUID er faktisk ret små.

Netværket til dine virtuelle maskiner, VM'erne selv og endda lagringsbassinerne og diskenhederne har deres individuelle UUID'er. Brug liberalt brug af dem i din Python-kode i stedet for at stole på menneskelige navne. Desværre er måden at få UUID'er på domæner lidt rodet i den nuværende implementering af dette bibliotek, efter min mening. Det kræver, at du angiver VM-id'et (domæne-id'et), sådan ser det ud.

domæne-id = tilslutning.listDomainsID ()
til domæne-id i domæne-id'er:
domæne = tilslutning.lookupByID ()
uuid = domæne.UUIDString ()
udskrive (uuid)

Nu kan du se listen over domæne-UUID'er. Vi har også snuble over et nyt Python Object libvirt.virDomain, som har sit eget sæt metoder forbundet med det ligesom variablen conn, som var en libvirt.virConnect-objekt og havde metoder som listDomainsID () og lookupByID () tilknyttet det.

For begge disse metoder kan du bruge Pythons indbyggede dir () -metoder, så objekterne kan liste deres interne variabler og metoder.

For eksempel:

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

Dette kan virkelig hjælpe dig med hurtigt at huske det nøjagtige navn på en metode og det objekt, den skal bruges sammen med. Nu hvor vi har et libvirt.virDomain-objekt, lad os bruge det til at liste forskellige detaljer om denne kørende VM.

>>> domæne.info ()

Dette giver dig information om tilstanden for den virtuelle computer, maksimal hukommelse og cpu-kerner som vist her.

Du kan også finde andre oplysninger om VM ved hjælp af forskellige metoder som OSType ()

>>> domæne.OSType ()
'hvm'

Der er stor fleksibilitet, når det kommer til API'et, som libvirt udsætter, og du behøver kun at bekymre dig om din brugssag og uden at bekymre dig om den enorme kompleksitet, som libvirt håndterer.

Konklusion

I mine rejser ind i Libvirt-teknologien var fraværet af UUID'er som en førsteklasses borger sandsynligvis det eneste smertepunkt, som jeg stod overfor, der virkede som et dårligt designvalg. Bortset fra det er libvirt temmelig smidig for hvad det opnår. Ja, der er mange andre ting, der kunne have været gjort på en bedre måde, men det er altid tilfældet med software. Efterhånden er dårlige beslutninger altid åbenlyse, men omkostningerne ved at omskrive et stykke software, så udbredt som libvirt, er ofte enorme.

Der er bygget meget på toppen af ​​det, da projektet udviklede sig langsomt og støt.

I stedet for at prøve at lære hele biblioteket på én gang, vil jeg anbefale at komme med et lille projekt eller en idé og implementere det ved hjælp af Python og Libvirt. Dokumentationen er ret omfattende med mange eksempler, og det tvinger dig virkelig til at tænke på korrekt softwaredesign og virtualiseringsstak på samme tid.

Installer nyeste Dolphin Emulator til Gamecube & Wii på Linux
Dolphin Emulator giver dig mulighed for at spille dine valgte Gamecube & Wii-spil på Linux Personal Computers (PC). Som en frit tilgængelig og open s...
Sådan bruges GameConqueror Cheat Engine i Linux
Artiklen dækker en vejledning om brug af GameConqueror-snydemotoren i Linux. Mange brugere, der spiller spil på Windows, bruger ofte "Cheat Engine" -a...
Bedste spilkonsolemulatorer til Linux
Denne artikel viser en liste over populære spilkonsolemuleringssoftware, der er tilgængelig til Linux. Emulation er et softwarekompatibilitetslag, der...