VirtualizationService

VirtualizationService mengelola beberapa VM tamu, baik yang dilindungi maupun 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 VM mengalami error atau dimatikan dengan sendirinya). Jika semua referensi ke objek IVirtualMachine dihilangkan sebelum VM dimatikan, VirtualizationService akan otomatis mematikan VM. Proses ini menyiratkan bahwa jika klien yang memulai VM dimatikan oleh low memory killer, VM juga akan dimatikan, sehingga mencegah kebocoran resource.

Setiap VM dikelola oleh instance crosvm-nya sendiri, yang kemudian 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 deskriptor 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-boot VM: kernel dan initrd disediakan atau bootloader disediakan. Dalam kedua kasus tersebut, sejumlah image disk arbitrer juga dapat disediakan, yang mungkin berupa image mentah atau gabungan dari beberapa partisi. Berbagai image disediakan oleh klien sebagai deskriptor file.

VirtualizationService membuat image disk gabungan sesuai permintaan. Proses ini diperlukan karena file disk gabungan secara internal merujuk ke berbagai file image 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 image gabungan. Image disk gabungan 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 disk image komposit, mengikuti alur Booting Terverifikasi Android standar.

Socket VM (vsock)

Antarmuka utama untuk komunikasi antara pVM adalah vsock, antarmuka socket virtio standar. Setiap VM diidentifikasi oleh ID konteks (CID) 32-bit, yang analog dengan alamat IP, yang VirtualizationServiceInternal ditetapkan ke VM saat VirtualizationService membuat VM, dan dapat mengekspos layanan pada nomor port apa pun yang dipilih VM. CID bersifat unik saat VM berjalan, tetapi nilai CID dapat didaur ulang saat VM dihentikan dan semua binder handle IVirtualMachine ke VM telah dihilangkan.

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 crash-dump. 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.