Python

Libvirt dengan Python

Libvirt dengan Python
Di salah satu posting saya sebelumnya, saya menunjukkan bagaimana seseorang dapat memulai dengan Libvirt dan KVM. Tumpukan virtualisasi ini dimaksudkan untuk tidak digunakan sebagai perangkat lunak virtualisasi desktop, melainkan dimaksudkan untuk berjalan di server yang menawarkan fleksibilitas, efisiensi, dan stabilitas yang lebih besar, alih-alih ramah pengguna. Ini dimaksudkan untuk diotomatisasi ke nini derajat daripada mengandalkan konfigurasi manual. Jadi mari kita lihat bagaimana Anda dapat terhubung ke daemon libvirt Anda dan mengotomatiskan manajemen dan pemantauan VM dasar menggunakan Python.

Setup dan Asumsi Dasar

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

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

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

Itu semua paket yang Anda butuhkan.

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

Membangun Koneksi dengan layanan Libvirtd

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

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

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

>>> impor libvirt
>>> samb = libvirt.buka('qemu:///sistem')

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 memasuki libvirt.open('qemu:///system') libvirt memungkinkan Anda 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 dayanya.

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

>>> sambung.Menutup()

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 kepada VM tamu secara total.

>>> sambung.dapatkannamaHost()
'deb'
>>> sambung.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

>>> cetak (sambungan.getSysinfo())


Dell Inc.
A14

 

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) Domain dan Anda dapat membuat daftar informasi tentang masing-masing domain serta mengonfigurasinya jika objek virConnect Anda memiliki hak istimewa yang memadai.

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

>>> sambung.daftarDomainsID()
[4, 5]

Ini mengembalikan array ID domain yang hanya bilangan 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 ditugaskan oleh 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.

domainID = samb.daftarDomainsID()
untuk domainID di domainID:
domain = samb.cariByID()
uuid = domain.UUIDString()
cetak (uuid)

Sekarang Anda dapat melihat daftar UUID domain. Kami juga menemukan libvirt Objek Python baru.virDomain, yang memiliki serangkaian metode sendiri yang terkait dengannya seperti variabel conn yang merupakan 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(sambungan)
['_… gs', 'schedulerType', 'screenshot', 'securityLabel', 'securityLabelList',
'sendKey', 'sendProcessSignal', 'setAutostart', 'setBlkioParameters', 'setBlockIoTune',
'setGuestVcpus', 'setInterfaceParameters', 'setMaxMemory', 'setMemory', 'setMemoryFlags',
'setMemoryParameters','setMemoryStatsPeriod', 'setMetadata', 'setNumaParameters',
'setPerfEvents', 'setSchedulerParameters', 'setSchedulerParametersFlags', 'setTime',
'setGunakan'… ]

Ini benar-benar dapat membantu Anda mengingat dengan cepat nama yang tepat dari suatu metode dan objek yang seharusnya digunakan. Sekarang kita memiliki libvirt.objek 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.Tipe OS()
'hvm'

Ada banyak fleksibilitas dalam hal API yang diekspos libvirt dan Anda hanya perlu khawatir tentang kasus penggunaan Anda dan tanpa khawatir tentang kompleksitas 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 sakit 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.

Daripada 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 tumpukan virtualisasi pada saat yang bersamaan.

Cara Menggunakan AutoKey untuk Mengotomatiskan Game Linux
AutoKey adalah utilitas otomatisasi desktop untuk Linux dan X11, diprogram dengan Python 3, GTK dan Qt. Dengan menggunakan skrip dan fungsionalitas MA...
Cara Menampilkan Penghitung FPS di Game Linux
Game Linux mendapat dorongan besar ketika Valve mengumumkan dukungan Linux untuk klien Steam dan game mereka pada tahun 2012. Sejak itu, banyak game A...
Cara mengunduh dan Memainkan Civilization VI Sid Meier di Linux
Pengenalan permainan Civilization 6 adalah konsep modern dari konsep klasik yang diperkenalkan dalam seri game Age of Empires. Idenya cukup sederhana;...