VirtualizationService

VirtualizationService zarządza wieloma chronionymi i niechronionymi maszynami wirtualnymi gościa działającymi w systemie Android, głównie poprzez 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żyć VirtualizationService, wykonaj virtmgr bezpośrednio lub zaimportuj javalib lub rustlib, które wykonują 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 odwołanie do IVirtualMachine obiektu, maszyna wirtualna działa dalej (chyba że ulegnie awarii lub sama się wyłączy). Jeśli wszystkie odwołania do obiektu IVirtualMachine zostaną usunięte przed zamknięciem maszyny wirtualnej, VirtualizationService automatycznie ją zamknie. Oznacza to, że jeśli klient, który uruchomił maszynę wirtualną, zostanie zamknięty przez proces zabijania przy niskim poziomie pamięci, maszyna wirtualna również zostanie zamknięta, co zapobiegnie wyciekom zasobów.

Każda maszyna wirtualna jest zarządzana przez własną instancję crosvm, która VirtualizationService z kolei zarządza w imieniu klienta. VirtualizationServicevirtmgr uruchamia w razie potrzeby te procesy podrzędne crosvm z przydzielonymi zasobami globalnymi, w tym identyfikatorem CID przyznanym przez VirtualizationServiceInternalvirtualizationservice, i przekazuje im deskryptory plików obrazów, których potrzebuje maszyna wirtualna. VirtualizationService następnie monitoruje proces podrzędny, aby sprawdzić, kiedy się zakończy, i powiadomić o tym 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 program rozruchowy. W obu przypadkach można też podać dowolną liczbę obrazów dysków, które mogą być obrazem surowym lub kompozycją kilku partycji. Różne obrazy są dostarczane przez klienta jako deskryptory plików.

VirtualizationService tworzy złożone obrazy dysków na żądanie. Ten proces jest niezbędny, ponieważ złożony plik dysku odwołuje się wewnętrznie do różnych plików obrazów partycji, które składają się na dysk i są przekazywane przez klienta, a crosvm może nie mieć do nich bezpośredniego dostępu. Aby obejść ten problem, VirtualizationService zapewnia, że numery deskryptorów plików odziedziczone przez crosvm są takie same jak numery deskryptorów plików, które VirtualizationService są używane do tworzenia obrazów złożonych. Obraz dysku złożonego używa nazw plików w formacie /proc/self/fd/N, aby reprezentować każdy plik partycji.

W przypadku chronionych maszyn wirtualnych Microdroid AVF zawiera program rozruchowy, który wczytuje jądro z partycji złożonego obrazu dysku zgodnie ze standardowym procesem weryfikacji rozruchu Androida.

Gniazda maszyn wirtualnych (vsock)

Głównym interfejsem komunikacji między pVM jest vsock, standardowy interfejs gniazda 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 podczas jej tworzenia i może udostępniać usługi na dowolnych numerach portów wybranych przez maszynę wirtualną.VirtualizationService Identyfikator CID jest unikalny, gdy maszyna wirtualna jest uruchomiona, ale jego wartość może zostać ponownie wykorzystana, gdy maszyna wirtualna zostanie zamknięta i wszystkie uchwyty IVirtualMachine powiązań z maszyną wirtualną zostaną usunięte.

Interfejs debugowania

Polecenie vm służy do debugowania. To polecenie umożliwia 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 maszynę wirtualną można uruchomić w trybie debugowania (FULL) lub bez debugowania (NONE). Maszyna wirtualna z możliwością debugowania umożliwia wyświetlanie logów na poziomie systemu operacyjnego, dostęp do powłoki ADB oraz przechwytywanie zrzutów awaryjnych i ładunków aplikacji. W środowisku produkcyjnym zalecamy używanie maszyny wirtualnej, której nie można debugować. Więcej informacji o narzędziu wiersza poleceń i innych interfejsach debugowania udostępnianych przez AVF znajdziesz w pliku debug/README.md.