VirtualizationService
mengelola beberapa VM tamu, dilindungi atau tidak, yang berjalan pada sistem Android, terutama dengan mengelola instance crosvm. VirtualizationService
mengekspos API AIDL, yang dapat digunakan oleh layanan sistem atau aplikasi untuk memulai, memantau, dan menghentikan VM. Untuk menggunakan VirtualizationService
, jalankan virtmgr
secara langsung atau impor javalib atau rusticlib yang mengeksekusi virtmgr
sebagai proses anak.
Siklus hidup VM
Akses ke VM dilacak oleh objek IVirtualMachine
. Selama setidaknya ada satu referensi ke objek IVirtualMachine
maka VM akan terus berjalan (kecuali jika crash atau mati dengan sendirinya). Jika semua referensi ke objek IVirtualMachine
dihapus sebelum VM dimatikan, maka VirtualizationService
secara otomatis mematikan VM. Proses ini menyiratkan bahwa jika klien yang memulai VM dimatikan oleh pembunuh memori rendah, maka VM juga dimatikan, sehingga mencegah kebocoran sumber daya.
Setiap VM dikelola oleh instance crosvmnya sendiri, yang kemudian dikelola oleh VirtualizationService
atas nama klien. VirtualizationService
di virtmgr
memulai proses anak crosvm ini sesuai kebutuhan dengan sumber daya global yang dialokasikan termasuk CID yang diberikan oleh VirtualizationServiceInternal
di virtualizationservice
, dan meneruskannya ke deskriptor file untuk gambar yang dibutuhkan VM. VirtualizationService
kemudian memantau proses anak ketika proses tersebut mati, sehingga dapat memberi tahu klien yang tersisa.
kemasan VM
crosvm mendukung dua cara berbeda untuk mem-boot VM: disediakan kernel dan initrd atau disediakan bootloader. Dalam kedua kasus tersebut, sejumlah image disk juga dapat disediakan, yang dapat berupa image mentah atau gabungan dari beberapa partisi. Berbagai gambar disediakan oleh klien sebagai deskriptor file.
VirtualizationService
membuat image disk komposit sesuai permintaan. Proses ini diperlukan karena file disk komposit merujuk secara internal ke berbagai file gambar partisi yang menyusun disk, yang diteruskan oleh klien dan mungkin tidak dapat diakses langsung oleh crosvm. Untuk mengatasi masalah ini, VirtualizationService
memastikan bahwa nomor deskriptor file yang diwarisi oleh crosvm sama dengan nomor deskriptor file yang digunakan VirtualizationService
dalam membuat gambar komposit. Citra disk komposit menggunakan nama file dalam bentuk /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 Boot Terverifikasi Android standar.
Soket VM (vsock)
Antarmuka utama untuk komunikasi antar pVM adalah vsock, antarmuka soket virtio standar. Setiap VM diidentifikasi oleh pengidentifikasi konteks (CID) 32-bit, yang analog dengan alamat IP, yang VirtualizationServiceInternal
tetapkan ke VM ketika VirtualizationService
membuat VM, dan dapat mengekspos layanan pada nomor port apa pun yang dipilih VM. CID bersifat unik saat VM berjalan, namun nilai CID dapat didaur ulang saat VM dihentikan dan semua pengikat pengikat IVirtualMachine
ke VM telah dihapus.
Antarmuka debug
Perintah vm
disediakan untuk tujuan debug. Perintah ini memungkinkan pengembang memulai VM dari shell, melihat lognya, dan menghentikan VM. Dengan perintah vm
atau antarmuka lain yang disediakan oleh AVF, VM dapat dimulai dalam mode debuggable (FULL) atau non-debuggable (NONE). Dengan VM yang dapat di-debug, Anda dapat melihat log level OS, mengakses shell ADB, dan menangkap crash-dump atau payload aplikasi. Disarankan untuk menggunakan VM yang tidak dapat di-debug dalam produksi. Untuk informasi lebih lanjut tentang alat baris perintah dan antarmuka debug lain yang disediakan AVF, lihat debug/README.md .