VirtualizationService

VirtualizationService zarządza wieloma maszynami wirtualnymi gościa, chronionymi lub nie, działającymi w systemie Android, głównie przez zarządzanie instancjami crosvm. VirtualizationService udostępnia interfejs AIDL API, którego usługi systemowe lub aplikacje mogą używać do uruchamiania, monitorowania i zatrzymywania maszyn wirtualnych. Aby używać VirtualizationService, uruchom virtmgr bezpośrednio lub zaimportuj javalib albo rustlib, które uruchamiają virtmgr jako proces podrzędny.

Cykl życia maszyny wirtualnej

Dostęp do maszyny wirtualnej jest śledzony przez obiekt IVirtualMachine. Dopóki istnieje co najmniej 1 odniesienie do obiektu IVirtualMachine, maszyna wirtualna będzie działać (chyba że ulegnie awarii lub sama się wyłączy). Jeśli wszystkie odniesienia do obiektu IVirtualMachine zostaną usunięte przed wyłączeniem maszyny wirtualnej, VirtualizationService automatycznie ją wyłączy. Oznacza to, że jeśli klient, który uruchomił maszynę wirtualną, zostanie wyłączony przez proces zabijania przy niskim poziomie pamięci, maszyna wirtualna również zostanie wyłączona, co zapobiegnie wyciekom zasobów.

Każda maszyna wirtualna jest zarządzana przez własną instancję crosvm, którą z kolei zarządza VirtualizationService w imieniu klienta. VirtualizationService w virtmgr uruchamia te procesy podrzędne crosvm w razie potrzeby z przydzielonymi zasobami globalnymi w tym z identyfikatorem CID przyznanym przez VirtualizationServiceInternal w virtualizationservice, i przekazuje im deskryptory plików obrazów, których potrzebuje maszyna wirtualna. VirtualizationService monitoruje następnie proces podrzędny pod kątem jego zakończenia, aby móc odpowiednio powiadomić pozostałych klientów.

Pakowanie maszyn wirtualnych

crosvm obsługuje 2 różne sposoby uruchamiania maszyny wirtualnej: można podać jądro i initrd lub bootloader. W obu przypadkach można też podać dowolną liczbę obrazów dysków, które mogą być obrazami surowymi lub kompozytami kilku partycji. Różne obrazy są udostępniane przez klienta jako deskryptory plików.

VirtualizationService tworzy kompozytowe obrazy dysków na żądanie. Jest to konieczne, ponieważ kompozytowy plik dysku odwołuje się wewnętrznie do różnych plików obrazów partycji, które są przekazywane przez klienta i mogą być niedostępne bezpośrednio dla crosvm. Aby obejść ten problem, VirtualizationService dba o to, aby numery deskryptorów plików odziedziczone przez crosvm były takie same jak numery deskryptorów plików, których VirtualizationService używał do tworzenia obrazów kompozytowych. Kompozytowy obraz dysku używa nazw plików w postaci /proc/self/fd/N do reprezentowania każdego pliku partycji.

W przypadku maszyn wirtualnych Microdroid pVM usługa AVF zawiera bootloader, który ładuje jądro z partycji kompozytowego obrazu dysku zgodnie ze standardowym procesem Android Verified Boot.

Gniazda maszyn wirtualnych (vsock)

Podstawowym interfejsem komunikacji między maszynami wirtualnymi pVM jest vsock, standardowy interfejs gniazd virtio. Każda maszyna wirtualna jest identyfikowana przez 32-bitowy identyfikator kontekstu (CID), który jest analogiczny do adresu IP. VirtualizationServiceInternal przypisuje go do maszyny wirtualnej, gdy VirtualizationService tworzy maszynę wirtualną. Maszyna wirtualna może udostępniać usługi na dowolnych numerach portów. Identyfikator CID jest unikalny, gdy maszyna wirtualna jest uruchomiona, ale jego wartość można ponownie wykorzystać, gdy maszyna wirtualna zostanie zamknięta i wszystkie uchwyty powiązań IVirtualMachine do maszyny wirtualnej zostaną usunięte.

Interfejs debugowania

Polecenie vm jest dostępne do celów debugowania. Umożliwia ono deweloperowi uruchomienie maszyny wirtualnej z powłoki, wyświetlenie jej logów i zakończenie jej działania. Za pomocą polecenia vm lub innych interfejsów udostępnianych przez AVF można uruchomić maszynę wirtualną w trybie z możliwością debugowania (FULL) lub bez debugowania (NONE). W przypadku maszyny wirtualnej z możliwością debugowania możesz wyświetlać logi na poziomie systemu operacyjnego, uzyskiwać dostęp do powłoki ADB i przechwytywać zrzuty awaryjne lub ładunek aplikacji. W środowisku produkcyjnym zalecamy używanie maszyny wirtualnej bez możliwości debugowania. Więcej informacji o narzędziu wiersza poleceń i innych interfejsach debugowania udostępnianych przez AVF znajdziesz w pliku debug/README.md.