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: ~ # python3Python 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 ())..
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.