Python

Libvirt dengan Python

Libvirt dengan Python
Dalam salah satu catatan saya sebelum ini, saya menunjukkan bagaimana seseorang dapat memulakan dengan Libvirt dan KVM. Tumpukan virtualisasi ini dimaksudkan untuk tidak digunakan sebagai perangkat lunak virtualisasi desktop, tetapi dimaksudkan untuk berjalan pada pelayan yang menawarkan fleksibilitas, kecekapan dan kestabilan yang lebih besar, dan bukannya ramah pengguna. Ia dimaksudkan untuk automatik ke nika darjah daripada bergantung pada konfigurasi manual. Oleh itu, mari kita lihat bagaimana anda boleh menyambung ke daemon libvirt anda dan mengautomasikan pengurusan dan pemantauan VM asas menggunakan Python.

Persediaan dan Andaian Asas

Saya menggunakan pemasangan Libvirt KVM pada pelayan Debian. Skrip Python yang akan saya gunakan berjalan dalam Python 3.7.3 persekitaran. Artikel ini semestinya membasahi kaki anda dengan ikatan Python Libvirt, semasa anda merancang aplikasi anda, anda harus selalu merujuk kepada dokumentasi rasmi yang merangkumi pelbagai kes penggunaan dan sering dikemas kini.

Mari pasang semua kebergantungan yang diperlukan untuk libvirt terlebih dahulu:

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

Itu semua pakej yang anda perlukan.

Skrip dan coretan berikut dijalankan tempatan pada host Libvirt, sebagai root, daripada dijalankan pada klien jauh. Anda dapat mengakses perkhidmatan dari jarak jauh, namun itu memerlukan penyimpangan yang panjang untuk menjamin hubungan antara klien dan pelayan. Oleh itu, kami akan berhubung secara tempatan, demi kesederhanaan.

Menjalin Sambungan dengan perkhidmatan Libvirtd

Untuk memulakan, mari buka prompt Python, import perpustakaan libvirt dan buka sambungan dengan libvirt.kaedah terbuka.

root @ deb: ~ # python3
Python 3.7.3 (lalai, 15 Apr 2019, 01:55:37)
[GCC 6.3.0 20170516] di linux

Ketik "bantuan", "hak cipta", "kredit" atau "lesen" untuk maklumat lebih lanjut.

>>> import libvirt
>>> conn = libvirt.buka ('qemu: /// sistem')

Var variabel sekarang boleh digunakan untuk bertanya daemon libvirt anda dan kami akan melakukannya sebentar lagi. Tetapi pertama, sedikit penyimpangan.

Libvirt dapat digunakan untuk menguruskan sejumlah tumpukan virtualisasi dan penyusun kontena. KVM-QEMU, Xen dan LXC adalah yang paling popular. Oleh itu, apabila anda memasukkan libvirt.open ('qemu: /// system') libvirt membolehkan anda mengumpulkan maklumat mengenai, dan mengurus, tetamu QEMU. Anda juga boleh bercakap dengan daemon LXD atau Xen hypervisor menggunakan sistem lxc: /// atau sistem xen: /// masing-masing.

Begitu juga dengan kaedah libvirt.open () bukan satu-satunya yang anda ada. open (name), openAuth (uri, auth, flags) dan openReadOnly (name) adalah tiga panggilan berbeza yang masing-masing mengembalikan objek virConnect dan menawarkan tahap kawalan yang berbeza terhadap host. Anda boleh membaca lebih lanjut mengenai mereka di sini. Buat masa ini, kami telah menjadi objek kelas virConnect. Objek ini adalah pintu masuk untuk melakukan hampir semua perkara dari mengkonfigurasi hypervisor itu sendiri untuk mengubah tetamu dan peruntukan sumber mereka.

Setelah selesai bekerja dengan objek, pastikan untuk menutup sambungan dengan memanggil kaedah tutup di atasnya.

>>> samb.tutup ()

Walau bagaimanapun, jangan jalankan arahan di atas. Kerana kita akan bermain-main dengan libvirt sedikit lagi. Mari tanyakan kepada penyelia kami beberapa butiran mengenai dirinya, seperti nama host, dan jumlah vCPU yang dapat ditawarkannya kepada VM tetamu secara keseluruhan.

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

Sekarang, kita perlu memahami bahawa dengan metadata Libvirt mengenai objek seperti statistik hypervisor, VM, maklumat rangkaian dan penyimpanan mereka, dan lain-lain semuanya diwakili dalam format XML. XML agak seperti JSON hanya sedikit lebih cepat (dan sedikit lebih tua). Data disimpan dan disajikan sebagai string harfiah dan apa artinya ialah jika anda melakukan query libvirt dan output dari query tersebut adalah XML, anda akan mendapat output baris tunggal yang sangat panjang dengan '\ n' hadir sebagai rentetan literal daripada baris baru. Fungsi cetak bawaan Python dapat membersihkannya agar mudah dibaca oleh manusia

>>> cetak (samb.getSysinfo ())


Dell Inc.
A14

 

Menyenaraikan dan Memantau VM

Sekiranya anda mengekalkan sebilangan besar VM, anda memerlukan kaedah untuk membuat beratus-ratus VM dengan konfigurasi seragam yang juga berskala dengan betul dari beban kerja tunggal tunggal hingga pemprosesan multi-teras, multi-utas. Libvirt memanggil VM tetamu (atau bekas jika anda menggunakan LXC) Domain dan anda boleh menyenaraikan maklumat mengenai domain individu serta mengkonfigurasinya jika objek virConnect anda mempunyai keistimewaan yang mencukupi.

Untuk mendapatkan maklumat mengenai VM dan penggunaan sumbernya, anda boleh menggunakan panggilan berikut:

>>> samb.senaraiDomainsID ()
[4, 5]

Ini mengembalikan pelbagai ID domain yang hanya bilangan bulat kecil untuk penyediaan libvirt sederhana. Kaedah pelabelan VM anda yang lebih dipercayai, tanpa mempunyai dua VM (katakan pada nod yang berlainan) dengan ID atau nama yang sama, adalah dengan menggunakan UUID. Dalam libvirt semuanya boleh mempunyai UUID, yang dihasilkan secara 128 nombor secara rawak. Peluang anda membuat dua UUID yang serupa memang kecil.

Rangkaian untuk Mesin Maya anda, VM sendiri dan bahkan kumpulan simpanan dan jumlah mempunyai UUID masing-masing. Manfaatkan mereka secara bebas dalam kod Python anda, dan bukannya bergantung pada nama manusia yang diberikan. Sayangnya, cara mendapatkan UUID domain agak tidak kemas dalam pelaksanaan perpustakaan ini pada masa ini, pada pendapat saya. Ia memerlukan anda memberikan ID VM (ID domain), berikut adalah rupa.

domainIDs = samb.senaraiDomainsID ()
untuk domainID dalam domainID:
domain = samb.carianByID ()
uuid = domain.UUIDString ()
cetak (uuid)

Kini anda dapat melihat senarai UUID domain. Kami juga menemui kebebasan Objek Python yang baru.virDomain, yang, mempunyai kaedah tersendiri yang berkaitan dengannya seperti pemboleh ubah yang merupakan libvirt.objek virConnect dan mempunyai kaedah seperti listDomainsID () dan lookupByID () yang berkaitan dengannya.

Untuk kedua kaedah ini, anda boleh menggunakan kaedah dir () terbina dalam Python sehingga objek dapat menyenaraikan pemboleh ubah dan kaedah dalamannya.

Sebagai contoh:

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

Ini benar-benar dapat membantu anda mengingat kembali nama kaedah dan objek yang sepatutnya digunakan dengan cepat. Sekarang kita mempunyai kebebasan.objek virDomain, mari kita gunakan untuk menyenaraikan pelbagai butiran mengenai VM yang sedang berjalan ini.

>>> domain.maklumat ()

Ini memberi anda maklumat mengenai keadaan VM, memori maksimum dan teras cpu seperti yang ditunjukkan di sini.

Anda juga dapat mencari maklumat lain mengenai VM menggunakan kaedah yang berbeza seperti OSType ()

>>> domain.Jenis OST ()
'hvm'

Terdapat banyak fleksibiliti ketika menggunakan API yang didedahkan oleh libvirt dan anda hanya perlu bimbang tentang kes penggunaan anda dan tanpa perlu risau tentang kerumitan besar yang ditangani oleh libvirt.

Kesimpulannya

Dalam perjalanan saya ke dalam teknologi Libvirt, ketiadaan UUID sebagai warganegara kelas pertama mungkin satu-satunya titik kesakitan yang saya hadapi yang kelihatan seperti pilihan reka bentuk yang buruk. Selain itu, libvirt cukup bagus untuk apa yang dicapai. Ya, ada banyak perkara lain yang dapat dilakukan dengan cara yang lebih baik, tetapi itu selalu berlaku dengan perisian. Pada pandangan belakang, keputusan buruk selalu jelas tetapi kos menulis semula perisian, seluas luasnya, sering kali sangat besar.

Banyak yang telah dibina di atasnya, kerana projek ini berkembang dengan perlahan dan stabil.

Daripada cuba mempelajari keseluruhan perpustakaan sekaligus, saya akan mengesyorkan tampil dengan projek kecil atau idea dan melaksanakannya menggunakan Python dan Libvirt. Dokumentasinya cukup luas dengan banyak contoh dan ia sangat memaksa anda untuk memikirkan reka bentuk perisian dan timbunan maya pada masa yang sama.

Pasang Dolphin Emulator terkini untuk Gamecube & Wii di Linux
Dolphin Emulator membolehkan anda memainkan permainan Gamecube & Wii pilihan anda di Komputer Peribadi Linux (PC). Menjadi emulator permainan sumber ...
Cara Menggunakan Mesin Cheat GameConqueror di Linux
Artikel ini merangkumi panduan mengenai penggunaan mesin cheat GameConqueror di Linux. Ramai pengguna yang bermain permainan di Windows sering menggun...
Emulator Konsol Permainan Terbaik untuk Linux
Artikel ini akan menyenaraikan perisian emulasi konsol permainan popular yang tersedia untuk Linux. Emulation adalah lapisan keserasian perisian yang ...