虛擬化服務

VirtualizationService主要透過管理 crosvm 執行個體來管理在 Android 系統上執行的多個受保護或其他方式的來賓 VM。 VirtualizationService公開了一個 AIDL API,系統服務或應用程式可以使用該 API 來啟動、監視和停止 VM。若要使用VirtualizationService ,請直接執行virtmgr或匯入javalibrustlibvirtmgr作為子程序執行。

虛擬機器生命週期

對 VM 的存取由IVirtualMachine物件追蹤。只要至少有一個對IVirtualMachine物件的引用,VM 就會繼續運行(除非它自行崩潰或關閉)。如果在 VM 關閉之前刪除對IVirtualMachine物件的所有引用,則VirtualizationService會自動關閉 VM。這個過程意味著,如果啟動VM的客戶端被低記憶體殺手關閉,那麼VM也會被關閉,從而防止資源洩漏。

每個虛擬機器都由自己的 crosvm 實例進行管理,而VirtualizationService又代表客戶端進行管理。 virtmgr中的VirtualizationService會根據需要使用已指派的全域資源(包括virtualizationserviceVirtualizationServiceInternal所授予的 CID)啟動這些 crosvm 子程序,並向它們傳遞 VM 所需映像的檔案描述符。然後, VirtualizationService會監視子程序何時終止,以便相應地通知任何剩餘的客戶端。

虛擬機器包裝

crosvm 支援兩種不同的虛擬機器啟動方式:提供核心和 initrd 或提供引導程式。在任何一種情況下,都可以提供任意數量的磁碟映像,這些映像可以是原始映像,也可以是多個分割區的組合。各種圖像由客戶端作為文件描述符提供。

VirtualizationService根據需要建立複合磁碟映像。這個過程是必要的,因為複合磁碟文件在內部指的是組成磁碟的各個分區映像文件,這些文件是由客戶端傳遞的,並且可能無法被 crosvm 直接存取。為了解決這個問題, VirtualizationService確保 crosvm 繼承的檔案描述符編號與VirtualizationService在建立複合映像時使用的檔案描述符編號相同。複合磁碟映像使用/proc/self/fd/N形式的檔案名稱來表示每個分割區檔案。

對於 Microdroid pVM,AVF 包含一個引導程序,它按照標準 Android 驗證引導流程從複合磁碟映像的分割區載入核心。

虛擬機器套接字 (vsock)

pVM 之間通訊的主要介面是 vsock,一個標準 virtio 套接字介面。每個 VM 由 32 位元上下文識別碼 (CID) 標識,該識別碼類似於 IP 位址,當VirtualizationService建立 VM 時, VirtualizationServiceInternal會將該位址指派給 VM,並且可以在 VM 選擇的任何連接埠號碼上公開服務。當VM運行時,CID是唯一的,但是當VM終止並且VM的所有IVirtualMachine綁定器句柄都已被刪除時,CID值可以被回收。

調試介面

提供vm命令用於調試目的。此命令允許開發人員從 shell 啟動 VM、查看其日誌以及終止 VM。使用vm命令或 AVF 提供的其他接口,VM 可以以可調試 (FULL) 或不可調試 (NONE) 模式啟動。借助可偵錯虛擬機,您可以查看作業系統等級日誌、存取 ADB shell 並擷取故障轉儲或應用程式負載。建議在生產中使用不可調試的虛擬機器。有關 AVF 提供的命令列工具和其他調試介面的更多信息,請參閱debug/README.md