VirtualizationService
mengelola beberapa VM tamu, yang dilindungi atau tidak,
yang berjalan di sistem Android, terutama dengan mengelola instance crosvm.
VirtualizationService
mengekspos AIDL API, yang dapat digunakan oleh layanan atau aplikasi sistem
untuk memulai, memantau, dan menghentikan VM. Untuk menggunakan VirtualizationService
, jalankan
virtmgr
secara langsung atau impor javalib atau rustlib yang menjalankan virtmgr
sebagai
proses turunan.
Siklus proses VM
Akses ke VM dilacak oleh objek IVirtualMachine
. Selama ada
setidaknya satu referensi ke objek IVirtualMachine
, VM akan terus
berjalan (kecuali jika mengalami error atau mati dengan sendirinya). Jika semua referensi ke
objek IVirtualMachine
dihapus sebelum VM dimatikan, VirtualizationService
akan otomatis menonaktifkan VM. Proses ini menyiratkan bahwa jika klien yang memulai VM dimatikan oleh pembunuh memori rendah, VM juga akan dimatikan, sehingga mencegah kebocoran resource.
Setiap VM dikelola oleh instance crosvm-nya sendiri, yang pada gilirannya dikelola oleh VirtualizationService
atas nama klien. VirtualizationService
di virtmgr
memulai proses turunan crosvm ini sesuai kebutuhan dengan resource global yang dialokasikan
termasuk CID yang diberikan oleh VirtualizationServiceInternal
di
virtualizationservice
, dan meneruskan deskripsi file untuk image yang
diperlukan VM. VirtualizationService
kemudian memantau proses turunan saat proses tersebut
berhenti, sehingga dapat memberi tahu klien yang tersisa.
Pengemasan VM
crosvm mendukung dua cara berbeda untuk mem-booting VM: kernel dan initrd disediakan atau bootloader disediakan. Dalam kedua kasus tersebut, jumlah gambar disk arbitrer juga dapat diberikan, yang mungkin berupa gambar mentah atau gabungan beberapa partisi. Berbagai gambar disediakan oleh klien sebagai deskripsi file.
VirtualizationService
mem-build disk image komposit sesuai permintaan. Proses ini
diperlukan karena file disk komposit secara internal merujuk ke berbagai
file image partisi yang menyusun disk, yang diteruskan oleh klien dan
mungkin tidak dapat diakses secara langsung oleh crosvm. Untuk mengatasi masalah ini,
VirtualizationService
memastikan bahwa nomor deskripsi file yang diwarisi oleh
crosvm sama dengan nomor deskripsi file yang digunakan VirtualizationService
dalam membuat image gabungan. Image disk komposit menggunakan nama file
dalam bentuk ke /proc/self/fd/N
untuk mewakili setiap file partisi.
Untuk pVM Microdroid, AVF menyertakan bootloader, yang memuat kernel dari partisi image disk komposit, mengikuti alur Android Verified Boot standar.
Soket VM (vsock)
Antarmuka utama untuk komunikasi antar-pVM adalah vsock, antarmuka socket virtio
standar. Setiap VM diidentifikasi oleh ID konteks (CID) 32-bit, yang analog dengan alamat IP, yang ditetapkan oleh VirtualizationServiceInternal
ke VM saat VirtualizationService
membuat VM, dan dapat mengekspos layanan di nomor port apa pun yang dipilih VM.
CID bersifat unik saat VM berjalan, tetapi nilai CID dapat didaur ulang
saat VM dihentikan dan semua handle binder IVirtualMachine
ke VM
telah dihapus.
Antarmuka debug
Perintah vm
disediakan untuk tujuan debug. Perintah ini memungkinkan developer
memulai VM dari shell, melihat log-nya, dan menghentikan VM. Dengan perintah vm
atau antarmuka lain yang disediakan oleh AVF, VM dapat dimulai dalam
mode yang dapat di-debug (FULL) atau tidak dapat di-debug (NONE). Dengan VM yang dapat di-debug, Anda dapat
melihat log tingkat OS, mengakses shell ADB, dan mengambil payload aplikasi atau dump error.
Sebaiknya gunakan VM yang tidak dapat di-debug dalam produksi. Untuk mengetahui informasi selengkapnya tentang
alat command line dan antarmuka debug lainnya yang disediakan AVF, lihat
debug/README.md.