Setup dan Asumsi Dasar

Setup dan Asumsi Dasar

Saya menggunakan instalasi Libvirt KVM di server Debian. Skrip Python yang akan saya gunakan berjalan di lingkungan Python 3.7.3. Artikel ini seharusnya membuat kaki Anda basah dengan binding Python Libvirt, ketika Anda merancang aplikasi Anda, Anda harus selalu merujuk ke dokumentasi resmi yang mencakup berbagai kasus useran dan cukup sering diperbarui.

Mari kita instal semua dependensi yang diperlukan untuk libvirt terlebih dahulu:

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

Itu semua paket yang Anda butuhkan.

Skrip dan cuplikan berikut dijalankan secara lokal di host Libvirt, sebagai root, daripada dijalankan pada client jarak jauh. Anda dapat mengakses service dari jarak jauh, namun, itu akan membutuhkan penyimpangan panjang dalam mengamankan koneksi antara client dan server. Oleh karena itu, kami akan menghubungkan secara lokal, demi kesederhanaan.

Membangun Koneksi dengan service Libvirtd

Untuk memulai, mari buka prompt Python, impor perpustakaan libvirt dan buka koneksi dengan metode libvirt.open.

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

Ketik “bantuan”, “hak cipta”, “kredit” atau “lisensi” untuk informasi lebih lanjut.

>>> import libvirt
>>> conn = libvirt.open('qemu:///system')

Variabel conn sekarang dapat digunakan untuk menanyakan daemon libvirt Anda dan kami akan segera melakukannya. Tapi pertama-tama, sedikit penyimpangan.

Libvirt dapat digunakan untuk mengelola sejumlah virtualisasi dan containerization stack yang berbeda. KVM-QEMU, Xen dan LXC adalah yang paling populer. Jadi ketika Anda memasukkan libvirt.open(‘qemu:///system’) libvirt memungkinkan Anda untuk mengumpulkan informasi tentang, dan mengelola, tamu QEMU. Anda juga dapat berbicara dengan daemon LXD atau hypervisor Xen masing-masing menggunakan lxc:///system atau xen:///system.

Demikian pula, metode libvirt.open() bukan satu-satunya yang Anda inginkan. open(name), openAuth(uri, auth, flags) dan openReadOnly(name) adalah tiga panggilan berbeda yang masing-masing mengembalikan objek virConnect dan menawarkan berbagai tingkat kontrol atas host. Anda dapat membaca lebih lanjut tentang mereka di sini. Untuk saat ini, kami memiliki conn sebagai objek dari kelas virConnect. Objek ini adalah pintu gerbang untuk melakukan hampir semua hal mulai dari mengonfigurasi hypervisor itu sendiri hingga memodifikasi tamu dan alokasi sumber daya mereka.

Setelah Anda selesai bekerja dengan objek, pastikan untuk menutup koneksi dengan memanggil metode tutup di atasnya.

>>> conn.close()

Namun, jangan jalankan perintah di atas dulu. Karena kita akan bermain-main dengan libvirt sedikit lagi. Mari tanyakan kepada hypervisor kami beberapa detail tentang dirinya, seperti nama host, dan jumlah vCPU yang dapat ditawarkan ke VM tamu secara total.

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

Sekarang, kita perlu memahami bahwa dengan metadata Libvirt tentang objek seperti statistik hypervisor, VM, informasi jaringan dan penyimpanannya, dll semuanya diwakili dalam format XML. XML agak seperti JSON hanya sedikit lebih kikuk (dan sedikit lebih tua). Data disimpan dan disajikan sebagai string literal dan artinya adalah jika Anda meminta libvirt dan output dari kueri itu adalah XML, Anda akan mendapatkan output baris tunggal yang sangat panjang dengan ‘n’ hadir sebagai string literal daripada a garis baru. Fungsi cetak bawaan Python dapat membersihkannya agar mudah dibaca manusia

>>> print(conn.getSysinfo())
<sysinfo type='smbios'>
<bios>
<entry name='vendor'>Dell Inc.</entry>
<entry name='version'>A14</entry>
...
 
</memory_device>
</sysinfo>

Mendaftar dan Memantau VM

Jika Anda mempertahankan sejumlah besar VM, Anda memerlukan metode untuk membuat ratusan VM dengan konfigurasi seragam yang juga menskalakan dengan benar dari beban kerja berulir tunggal sederhana hingga pemrosesan multi-inti dan multi-utas. Libvirt memanggil VM tamu (atau wadah jika Anda menggunakan LXC)Domains dan Anda dapat membuat daftar informasi tentang masing-masing domain serta mengonfigurasinya jika objek virConnect Anda memiliki hak yang memadai.

Untuk mendapatkan informasi tentang VM dan pemanfaatan sumber dayanya, Anda dapat menggunakan panggilan berikut:

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

Ini mengembalikan array ID domain yang hanya bila
ngan bulat kecil untuk pengaturan libvirt sederhana. Cara yang lebih andal untuk memberi label pada VM Anda, tanpa memiliki dua VM (katakanlah pada node yang berbeda) dengan ID atau nama yang sama, adalah dengan menggunakan UUID. Di libvirt semuanya dapat memiliki UUID, yang dihasilkan secara acak nomor 128 bit. Kemungkinan Anda membuat dua UUID yang identik memang cukup kecil.

Jaringan untuk Mesin Virtual Anda, VM itu sendiri, dan bahkan kumpulan dan volume penyimpanan memiliki UUID masing-masing. Manfaatkan mereka secara bebas dalam kode Python Anda, alih-alih mengandalkan nama yang ditetapkan manusia. Sayangnya, cara untuk mendapatkan UUID domain agak berantakan dalam implementasi perpustakaan ini, menurut saya. Itu memang mengharuskan Anda untuk memberikan ID VM (ID domain), inilah tampilannya.

domainIDs = conn.listDomainsID()
for domainID in domainIDs:
domain = conn.lookupByID()
uuid = domain.UUIDString()
print(uuid)

Sekarang Anda dapat melihat daftar UUID domain. Kami juga menemukan Obyek Python baru libvirt.virDomain, yang memiliki kumpulan metode sendiri yang terkait dengannya seperti variabel conn yang merupakan objek libvirt.virConnect dan memiliki metode seperti listDomainsID() dan lookupByID() yang terkait dengannya.

Untuk kedua metode ini, Anda dapat menggunakan metode dir() bawaan Python sehingga objek dapat mencantumkan variabel dan metode internalnya.

Sebagai contoh:

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

Ini benar-benar dapat membantu Anda mengingat dengan cepat nama yang tepat dari suatu metode dan objek yang seharusnya digunakan. Sekarang kita memiliki objek libvirt.virDomain, mari kita gunakan untuk membuat daftar berbagai detail tentang VM yang sedang berjalan ini.

>>> domain.info()

Ini memberi Anda informasi mengenai status VM, memori maksimum, dan inti cpu seperti yang ditunjukkan di sini.

Anda juga dapat menemukan informasi lain tentang VM menggunakan metode yang berbeda seperti OSType()

>>> domain.OSType()
'hvm'

Ada banyak fleksibilitas dalam hal API yang diekspos libvirt dan Anda hanya perlu khawatir tentang kasus useran Anda dan tanpa mengkhawatirkan kerumitan luar biasa yang ditangani libvirt.

Kesimpulan

Dalam perjalanan saya ke teknologi Libvirt, tidak adanya UUID sebagai warga negara kelas satu mungkin merupakan satu-satunya titik kesulitan yang saya hadapi yang sepertinya merupakan pilihan desain yang buruk. Selain itu, libvirt cukup bagus untuk apa yang dicapainya. Ya, ada banyak hal lain yang bisa dilakukan dengan cara yang lebih baik, tetapi itu selalu terjadi pada perangkat lunak. Jika dipikir-pikir, keputusan buruk selalu terlihat jelas tetapi biaya penulisan ulang perangkat lunak, seluas libvirt, seringkali luar biasa.

Banyak yang telah dibangun di atasnya, karena proyek berkembang perlahan dan mantap.

Alih-alih mencoba mempelajari seluruh perpustakaan sekaligus, saya akan merekomendasikan membuat proyek kecil atau ide dan mengimplementasikannya menggunakan Python dan Libvirt. Dokumentasinya cukup luas dengan banyak contoh dan itu benar-benar memaksa Anda untuk memikirkan desain perangkat lunak yang tepat dan stack virtualisasi pada saat yang bersamaan.

Related Posts