VirtualizationService 主要透過管理 crosvm 執行個體,管理在 Android 系統上執行的多個受保護或其他訪客 VM。VirtualizationService 會公開 AIDL API,系統服務或應用程式可使用該 API 啟動、監控及停止 VM。如要使用 VirtualizationService,請直接執行 virtmgr,或匯入 javalib 或 rustlib,將 virtmgr 做為子程序執行。
VM 生命週期
存取 VM 的情況會由 IVirtualMachine 物件追蹤。只要至少有一個對 IVirtualMachine 物件的參照,VM 就會繼續執行 (除非自行當機或關機)。如果在 VM 關閉前捨棄對 IVirtualMachine 物件的所有參照,VirtualizationService 就會自動關閉 VM。這個程序表示,如果啟動 VM 的用戶端遭到低記憶體終止程序關閉,VM 也會關閉,避免資源洩漏。
每個 VM 都由專屬的 crosvm 執行個體管理,而該執行個體會代表用戶端進行管理。VirtualizationServiceVirtualizationService 會視需要啟動這些 crosvm 子程序,並分配全域資源 (包括 virtualizationservice 中 VirtualizationServiceInternal 授予的 CID),然後將 VM 需用的映像檔檔案描述元傳遞給這些子程序。virtmgrVirtualizationService 接著會監控子程序何時終止,以便相應通知任何剩餘的用戶端。
VM packaging
crosvm 支援兩種不同的 VM 啟動方式:提供核心和 initrd,或提供開機載入程式。無論是哪種情況,您也可以提供任意數量的磁碟映像檔,這些映像檔可以是原始映像檔,也可以是多個分割區的組合。各種圖片是由用戶端以檔案描述元的形式提供。
VirtualizationService 會視需要建構複合磁碟映像檔。這是必要程序,因為複合磁碟檔案會在內部參照組成磁碟的各種分割區映像檔,這些檔案由用戶端傳遞,可能無法由 crosvm 直接存取。為解決這個問題,VirtualizationService 可確保 crosvm 繼承的檔案描述元編號,與 VirtualizationService 用於建立複合圖片的檔案描述元編號相同。複合磁碟映像檔會使用 /proc/self/fd/N 形式的檔案名稱,代表每個分割區檔案。
對於 Microdroid pVM,AVF 包含系統啟動載入程式,可按照標準 Android 驗證開機程序,從複合磁碟映像檔的分區載入核心。
VM Socket (vsock)
pVM 之間的通訊主要介面是 vsock,這是標準的 virtio 插座介面。每個 VM 都會由 32 位元內容 ID (CID) 識別,這類似於 IP 位址,VirtualizationServiceInternal會在VirtualizationService建立 VM 時指派給 VM,並可透過 VM 選擇的任何通訊埠號碼公開服務。VM 執行時,CID 是不重複的,但當 VM 終止且所有 VM 的 IVirtualMachine 繫結控制代碼都已捨棄時,CID 值可以回收。
偵錯介面
vm 指令的用途是進行偵錯。開發人員可透過這個指令從殼層啟動 VM、查看記錄,以及終止 VM。透過 vm 指令或 AVF 提供的其他介面,VM 可以啟動可偵錯 (FULL) 或不可偵錯 (NONE) 模式。使用可偵錯的 VM,您可以查看 OS 層級的記錄、存取 ADB 殼層,以及擷取當機傾印或應用程式有效負載。建議在正式環境中使用無法偵錯的 VM。如要進一步瞭解指令列工具和 AVF 提供的其他偵錯介面,請參閱 debug/README.md。