Piton

Libvirt s Pythonom

Libvirt s Pythonom
U jednom od svojih prethodnih postova pokazao sam kako se može započeti s Libvirtom i KVM-om. Ovaj stog za virtualizaciju ne smije se koristiti kao softver za virtualizaciju radne površine, već je namijenjen izvođenju na poslužiteljima koji nude veću fleksibilnost, učinkovitost i stabilnost, umjesto jednostavnosti za upotrebu. Misli se automatizirati na nth stupanj, a ne oslanjanje na ručnu konfiguraciju. Pa da vidimo kako se možete povezati sa svojim libvirt demonom i automatizirati osnovno upravljanje i nadzor VM-a pomoću Pythona.

Postavljanje i osnovne pretpostavke

Koristim Libvirt KVM instalaciju na Debian poslužitelju. Python skripte koje ću koristiti će se izvoditi u Pythonu 3.7.3 okoliš. Ovaj bi članak trebao namočiti noge Libvirtovim Python vezima, kad dizajnirate svoju aplikaciju, uvijek biste se trebali pozivati ​​na službenu dokumentaciju koja pokriva širok spektar slučajeva i ažurira se razumno često.

Prvo instalirajmo sve ovisnosti potrebne za libvirt:

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

To su svi paketi koji su vam potrebni.

Pokreću se sljedeće skripte i isječci lokalno na hostu Libvirt, kao root, umjesto da se izvodi na udaljenom klijentu. Uslugama možete pristupiti na daljinu, međutim, to bi zahtijevalo dugu digresiju u osiguranju veze između klijenta i poslužitelja. Stoga ćemo se radi jednostavnosti povezivati ​​lokalno.

Uspostavljanje veze s uslugom Libvirtd

Za početak otvorimo Python upit, uvezimo knjižnicu libvirt i otvorimo vezu s libvirtom.otvorena metoda.

root @ deb: ~ # python3
Python 3.7.3 (zadano, 15. travnja 2019., 01:55:37)
[OUU 6.3.0 20170516] na Linuxu

Upišite "pomoć", "autorska prava", "krediti" ili "licenca" za više informacija.

>>> uvoz libvirt
>>> conn = libvirt.otvoren ('qemu: /// sustav')

Varijabla conn sada se može koristiti za upit vašeg demona libvirt, a mi ćemo to učiniti uskoro. Ali prvo, mala digresija.

Libvirt se može koristiti za upravljanje nizom različitih stogova za virtualizaciju i kontejnerizaciju. KVM-QEMU, Xen i LXC najpopularniji su od njih. Pa kad unesete libvirt.open ('qemu: /// system') libvirt omogućuje vam prikupljanje podataka o QEMU gostima i upravljanje njima. Možete jednako dobro razgovarati s LXD demonom ili Xen hipervizorom koristeći lxc: /// sustav ili xen: /// sustav.

Slično tome, metoda libvirt.open () nije jedini koji vam stoji na raspolaganju. open (name), openAuth (uri, auth, flags) i openReadOnly (name) su tri različita poziva od kojih svaki vraća virConnect objekt i nudi različitu razinu kontrole nad hostom. Više o njima možete pročitati ovdje. Za sada imamo conn kao objekt klase virConnect. Ovaj je objekt pristupnik za gotovo sve, od konfiguriranja samog hipervizora do modificiranja gostiju i njihove raspodjele resursa.

Kad završite s radom s objektom, obavezno zatvorite vezu pozivanjem metode close na njemu.

>>> povez.Zatvoriti()

Međutim, nemojte još uvijek izvoditi gornju naredbu. Jer ćemo se još malo poigrati s libvirtom. Pitajmo našeg hipervizora nekoliko detalja o sebi, poput imena hosta i broja vCPU-a koje ukupno može ponuditi gostujućim VM-ovima.

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

Sada moramo shvatiti da su s metapodacima Libvirt o objektima poput statistika hipervizora, VM-ovi, njihovi podaci o umrežavanju i pohrani itd. Svi predstavljeni u XML formatu. XML je nekako poput JSON-a, samo je malo nespretniji (i malo stariji). Podaci se pohranjuju i predstavljaju kao literal niza, a to znači da ako upitate libvirt, a izlaz tog upita je XML, dobit ćete stvarno dugačak izlaz u jednom retku s '\ n' koji je prisutan kao doslovni niz, a ne kao nova linija. Ugrađena Pythonova funkcija ispisa može je očistiti radi ljudske čitljivosti

>>> ispis (povez.getSysinfo ())


Tvrtka Dell Inc.
A14
..
 

Popis i nadgledanje VM-ova

Ako održavate velik niz VM-ova, treba vam metoda za stvaranje stotina VM-ova ujednačene konfiguracije koji se također pravilno skaliraju od jednostavnih jednonitnih radnih opterećenja do višejezgrene, višenitne obrade. Libvirt poziva gostujuće VM-ove (ili spremnike ako koristite LXC) Domene a možete navesti podatke o pojedinačnim domenama, kao i konfigurirati ih ako vaš virConnect objekt ima dovoljne privilegije.

Da biste dobili informacije o VM-ovima i njihovom iskorištavanju resursa, možete koristiti sljedeće pozive:

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

To vraća niz ID-ova domene koji su samo mali cijeli brojevi za jednostavno postavljanje libvirt-a. Pouzdaniji način označavanja vaših VM-ova, bez da imate dva VM-a (recimo na različitim čvorovima) s istim ID-om ili imenom, jest upotreba UUID-ova. U libvirtu sve može imati UUID, koji je nasumično generiran 128-bitni broj. Šanse da stvorite dva identična UUID-a uistinu su prilično male.

Mreža za vaše virtualne strojeve, sami VM-ovi, pa čak i spremišta i volumeni za pohranu imaju svoje pojedinačne UUID-ove. Iskoristite ih liberalno u svom Python kodu, umjesto da se oslanjate na ljudska dodijeljena imena. Nažalost, način na koji se mogu dobiti UUID-ovi domena pomalo je neuredan u trenutnoj implementaciji ove biblioteke, po mom mišljenju. Potrebno je da navedete ID VM-a (ID domene), evo kako to izgleda.

domainIDs = conn.listDomainsID ()
za ID domene u ID-ovima domene:
domena = povez.lookupByID ()
uuid = domena.UUIDString ()
ispis (uuid)

Sada možete vidjeti popis UUID-ova domene. Također smo naletjeli na novi libvirt Python Object.virDomain, koji ima svoj skup metoda povezanih s njim, slično promjenljivoj conn koja je bila libvirt.virConnect objekt i s njim su povezane metode poput listDomainsID () i lookupByID ().

Za obje ove metode možete koristiti Pythonove ugrađene metode dir () tako da objekti mogu navesti svoje interne varijable i metode.

Na primjer:

>>> 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' ...]

To vam stvarno može pomoći da se brzo prisjetite točnog naziva metode i predmeta s kojim bi se trebala koristiti. Sad kad imamo libvirt.virDomain objekt, iskoristimo ga za navođenje raznih detalja o ovom VM-u koji se izvodi.

>>> domena.informacije ()

Ovo vam daje informacije o stanju VM-a, maksimalnoj memoriji i jezgri procesora kao što je ovdje prikazano.

Također možete pronaći druge informacije o VM-u koristeći različite metode poput OSType ()

>>> domena.OSType ()
'hvm'

Puno je fleksibilnosti što se tiče API-ja koji libvirt izlaže, a vi se morate brinuti samo o svom slučaju upotrebe i bez brige o ogromnoj složenosti koju libvirt rješava.

Zaključak

U mojim putovanjima tehnologijom Libvirt, odsutnost UUID-ova kao građanina prve klase bila je vjerojatno jedina bolna točka s kojom sam se suočio, a činilo mi se kao loš izbor dizajna. Osim toga, libvirt je prilično dobar za ono što postiže. Da, postoji puno drugih stvari koje su se mogle učiniti na bolji način, ali to je uvijek slučaj sa softverom. Posmatrano unatrag, loše su odluke uvijek očite, ali troškovi prepisivanja dijela softvera, široko rasprostranjenog poput libvirt, često su ogromni.

Puno je toga izgrađeno, jer se projekt razvijao polako i postojano.

Umjesto da pokušavam naučiti cijelu biblioteku odjednom, preporučio bih da smislite mali projekt ili ideju i to implementirate koristeći Python i Libvirt. Dokumentacija je prilično opsežna s puno primjera i prisiljava vas da istodobno razmišljate o pravilnom dizajnu softvera i stogu za virtualizaciju.

Najbolje igre za ručno praćenje
Oculus Quest nedavno je predstavio sjajnu ideju ručnog praćenja bez kontrolera. Sa sve većim brojem igara i aktivnosti koje izvršavaju podršku bilo fo...
Kako prikazati OSD prekrivač u aplikacijama i igrama na cijelom zaslonu za Linux
Igranje igara preko cijelog zaslona ili upotreba aplikacija u režimu preko cijelog zaslona bez ometanja može vas odsjeći od relevantnih informacija o ...
Top 5 karata za hvatanje igara
Svi smo vidjeli i voljeli streaming reprodukcije na YouTubeu. PewDiePie, Jakesepticye i Markiplier samo su neki od najboljih igrača koji su zaradili m...