Pytonorm

Libvirt med Python

Libvirt med Python
I ett av mina tidigare inlägg visade jag hur man kan komma igång med Libvirt och KVM. Denna virtualiseringsstack är avsedd att inte användas som en stationär virtualiseringsprogramvara, utan den är avsedd att köras på servrar som ger större flexibilitet, effektivitet och stabilitet istället för användarvänlighet. Det är tänkt att automatiseras till nth grad snarare än att förlita sig på manuell konfiguration. Så låt oss se hur du kan ansluta till din libvirt-demon och automatisera grundläggande VM-hantering och övervakning med Python.

Inställningar och grundläggande antaganden

Jag använder en Libvirt KVM-installation på en Debian-server. De Python-skript jag ska använda körs i en Python 3.7.3 miljö. Den här artikeln är tänkt att få dina fötter våta med Libvirts Python-bindningar. När du utformar din applikation bör du alltid hänvisa till den officiella dokumentationen som täcker ett brett spektrum av användningsfall och uppdateras ganska ofta.

Låt oss installera alla beroenden som krävs för libvirt först:

$ sudo apt installera pkg-config libvirt-dev
$ pip3 installera libvirt-python

Det är alla paket du behöver.

Följande skript och utdrag körs lokalt på Libvirt-värden, som root, snarare än att köras på en fjärrklient. Du kan komma åt tjänsterna på distans, men det skulle kräva en lång avvägning för att säkerställa anslutningen mellan klienten och servern. Därför kommer vi att ansluta lokalt för enkelhetens skull.

Upprätta anslutning till Libvirtd-tjänsten

För att komma igång, låt oss öppna en Python-fråga, importera libvirt-biblioteket och öppna en anslutning till libvirt.öppen metod.

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

Skriv "hjälp", "copyright", "credits" eller "licens" för mer information.

>>> importera libvirt
>>> anslut = libvirt.öppen ('qemu: /// system')

Variabeln Conn kan nu användas för att fråga din libvirt-demon och vi kommer att göra det inom kort. Men först, lite avvikelse.

Libvirt kan användas för att hantera ett antal olika virtualiserings- och containeriseringsstack. KVM-QEMU, Xen och LXC är de mest populära av dessa. Så när du anger libvirt.open ('qemu: /// system') libvirt gör det möjligt för dig att samla information om och hantera QEMU-gäster. Du kan lika gärna prata med LXD-demon eller Xen hypervisor med lxc: /// system respektive xen: /// system.

På samma sätt är metoden libvirt.open () är inte den enda till ditt förfogande. open (name), openAuth (uri, auth, flags) och openReadOnly (name) är tre olika samtal som var och en returnerar ett virConnect-objekt och erbjuder varierande kontrollnivå över värden. Du kan läsa mer om dem här. För närvarande har vi konn som ett objekt i virConnect-klassen. Detta objekt är en gateway för att göra nästan vad som helst från att konfigurera hypervisor till att ändra gästerna och deras resurstilldelning.

När du är klar med arbetet med objektet, se till att stänga anslutningen genom att anropa stängningsmetoden på den.

>>> anslutning.stänga()

Kör dock inte kommandot ovan, ännu. Eftersom vi kommer att leka lite mer med libvirt. Låt oss fråga vår hypervisor några detaljer om sig själv, som värdnamnet och antalet vCPU: er som det totalt kan erbjuda gäst-virtuella datorer.

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

Nu måste vi förstå att med Libvirt-metadata om objekt som hypervisorstatistik, virtuella datorer, deras nätverks- och lagringsinformation etc. är alla representerade i XML-format. XML är ungefär som JSON bara lite klumpigare (och lite äldre). Data lagras och presenteras som en strängbokstavlig och vad det betyder är att om du frågar efter libvirt och utgången från den frågan är XML får du en riktigt lång enradig utdata med '\ n' närvarande som en bokstavlig sträng snarare än en ny linje. Pythons inbyggda utskriftsfunktion kan rensa upp den för mänsklig läsbarhet

>>> tryck (anslut.getSysinfo ())


Dell Inc.
A14
..
 

Listning och övervakning av virtuella datorer

Om du behåller ett stort antal virtuella datorer behöver du en metod för att skapa hundratals virtuella datorer med enhetlig konfiguration som också skalas ordentligt från enkla enkla gängade arbetsbelastningar till flerkärnig, flertrådad bearbetning. Libvirt anropar gäst-virtuella datorer (eller containrar om du använder LXC) Domäner och du kan lista information om enskilda domäner samt konfigurera dem om ditt virConnect-objekt har tillräckliga behörigheter.

För att få information om virtuella datorer och deras resursanvändning kan du använda följande samtal:

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

Detta returnerar en rad domän-ID som bara är små heltal för en enkel libvirt-installation. Ett mer pålitligt sätt att märka dina virtuella datorer utan att ha två virtuella datorer (låt oss säga på olika noder) med samma ID eller namn är att använda UUID. I libvirt kan allt ha en UUID, som slumpmässigt genereras 128 bitar nummer. Chanserna att du skapar två identiska UUID är ganska små.

Nätverket för dina virtuella maskiner, de virtuella datorerna själva och till och med lagringspoolerna och volymerna har sina individuella UUID. Använd dem liberalt i din Python-kod, istället för att förlita dig på tilldelade namn. Tyvärr är sättet att få UUID för domäner lite rörigt i den nuvarande implementeringen av detta bibliotek, enligt min åsikt. Det kräver att du anger ID för den virtuella datorn (domän-ID), så här ser det ut.

domän-ID = anslut.listDomainsID ()
för domainID i domainID:
domän = anslutning.lookupByID ()
uuid = domän.UUIDString ()
skriva ut (uuid)

Nu kan du se listan över domän-UUID. Vi har också snubblat över ett nytt Python Object libvirt.virDomain, som har sin egen uppsättning metoder associerade med det ungefär som variabeln Conn som var en libvirt.virConnect-objekt och hade metoder som listDomainsID () och lookupByID () associerade med det.

För båda dessa metoder kan du använda Pythons inbyggda dir () -metoder så att objekten kan lista sina interna variabler och metoder.

Till exempel:

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

Detta kan verkligen hjälpa dig att snabbt komma ihåg det exakta namnet på en metod och föremålet den borde användas med. Nu när vi har ett libvirt.virDomain-objekt, låt oss använda det för att lista olika detaljer om den här virtuella datorn.

>>> domän.info()

Detta ger dig information om tillståndet för den virtuella datorn, maximalt minne och CPU-kärnor som visas här.

Du kan också hitta annan information om den virtuella datorn med olika metoder som OSType ()

>>> domän.OST-typ ()
'hvm'

Det finns mycket flexibilitet när det gäller API som libvirt exponerar och du behöver bara oroa dig för ditt användningsfall och utan att oroa dig för den enorma komplexitet som libvirt hanterar.

Slutsats

I mina resor in i Libvirt-teknologin var frånvaron av UUID som en förstklassig medborgare förmodligen den enda smärtpunkt som jag mötte som verkade som ett dåligt designval. Annat än det är libvirt ganska smutsigt för vad det åstadkommer. Ja, det finns många andra saker som kunde ha gjorts på ett bättre sätt, men det är alltid fallet med programvara. I efterhand är dåliga beslut alltid uppenbara, men kostnaden för att skriva om en mjukvara, lika utbredd som libvirt, är ofta enorm.

Mycket har byggts ovanpå, eftersom projektet utvecklades långsamt och stadigt.

I stället för att försöka lära mig hela biblioteket på en gång, skulle jag rekommendera att komma med ett litet projekt eller en idé och implementera det med Python och Libvirt. Dokumentationen är ganska omfattande med många exempel och tvingar dig verkligen att tänka på rätt programvarudesign och virtualiseringsstack samtidigt.

Installera senaste Dolphin Emulator för Gamecube & Wii på Linux
Dolphin Emulator låter dig spela dina valda Gamecube & Wii-spel på Linux Personal Computers (PC). Eftersom Dolphin Emulator är en fritt tillgänglig o...
Hur man använder GameConqueror Cheat Engine i Linux
Artikeln täcker en guide om hur du använder GameConqueror-fuskmotorn i Linux. Många användare som spelar spel på Windows använder ofta applikationen "...
Bästa spelkonsolemulatorer för Linux
Den här artikeln listar populära spelkonsolemuleringsprogram som finns tillgängliga för Linux. Emulation är ett mjukvarukompatibilitetsskikt som emule...