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. VirtualizationService
w virtmgr
uruchamia w razie potrzeby te procesy podrzędne crosvm z przydzielonymi zasobami globalnymi, w tym identyfikatorem CID przyznanym przez VirtualizationServiceInternal
w virtualizationservice
, 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.