VirtualizationService
zarządza wieloma maszynami wirtualnymi gości, chronionymi lub nie, działającymi w systemie Android, głównie poprzez zarządzanie instancjami crosvm. VirtualizationService
udostępnia interfejs API AIDL, którego usługi systemowe lub aplikacje mogą używać do uruchamiania, monitorowania i zatrzymywania maszyn wirtualnych. Aby użyć VirtualizationService
, wykonaj bezpośrednio virtmgr
lub zaimportuj javalib lub rustlib , który wykonuje virtmgr
jako proces potomny.
Cykl życia maszyny wirtualnej
Dostęp do maszyny wirtualnej jest śledzony przez obiekt IVirtualMachine
. Dopóki istnieje co najmniej jedno odniesienie do obiektu IVirtualMachine
, maszyna wirtualna nadal działa (chyba że ulegnie awarii lub wyłączy się sama). Jeśli wszystkie odniesienia do obiektu IVirtualMachine
zostaną usunięte przed zamknięciem maszyny wirtualnej, VirtualizationService
automatycznie wyłączy maszynę wirtualną. Proces ten oznacza, że jeśli klient, który uruchomił maszynę wirtualną, zostanie zamknięty przez zabójcę małej ilości pamięci, wówczas maszyna wirtualna również zostanie zamknięta, zapobiegając w ten sposób 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 potomne crosvm zgodnie z wymaganiami z przydzielonymi zasobami globalnymi, w tym identyfikatorem CID przyznanym przez VirtualizationServiceInternal
w virtualizationservice
i przekazuje im deskryptory plików dla obrazów potrzebnych maszynie wirtualnej. VirtualizationService
monitoruje następnie proces potomny pod kątem jego śmierci, dzięki czemu może odpowiednio powiadomić pozostałych klientów.
Opakowanie VM
crosvm obsługuje dwa różne sposoby uruchamiania maszyny wirtualnej: dostarczane jest jądro i initrd lub udostępniany jest program ładujący. W obu przypadkach można również udostępnić dowolną liczbę obrazów dysków, które mogą być albo obrazem surowym, albo złożeniem kilku partycji. Klient dostarcza różne obrazy jako deskryptory plików.
VirtualizationService
tworzy na żądanie złożone obrazy dysków. Ten proces jest konieczny, ponieważ plik dysku złożonego odnosi się wewnętrznie do różnych plików obrazów partycji tworzących dysk, które są przekazywane przez klienta i mogą nie być bezpośrednio dostępne dla crosvm. Aby obejść ten problem, VirtualizationService
zapewnia, że numery deskryptorów plików dziedziczone przez crosvm są takie same, jak numery deskryptorów plików używane VirtualizationService
do tworzenia obrazów złożonych. Złożony obraz dysku używa nazw plików w postaci /proc/self/fd/N
do reprezentowania każdego pliku partycji.
W przypadku maszyn pVM Microdroid AVF zawiera moduł ładujący, który ładuje jądro z partycji złożonego obrazu dysku, zgodnie ze standardowym przepływem zweryfikowanego rozruchu systemu Android.
Gniazda maszyn wirtualnych (vsock)
Podstawowym interfejsem do komunikacji pomiędzy maszynami pVM jest vsock, standardowy interfejs gniazda virtio. Każda maszyna wirtualna jest identyfikowana za pomocą 32-bitowego identyfikatora kontekstu (CID), który jest analogiczny do adresu IP, który VirtualizationServiceInternal
przypisuje maszynie wirtualnej, gdy VirtualizationService
tworzy maszynę wirtualną, i może udostępniać usługi na dowolnych numerach portów wybranych przez maszynę wirtualną. Identyfikator CID jest unikalny, gdy maszyna wirtualna jest uruchomiona, ale wartość CID można odtworzyć, gdy maszyna wirtualna zostanie zakończona, a wszystkie uchwyty powiązania IVirtualMachine
z maszyną wirtualną zostaną usunięte.
Interfejs debugowania
Polecenie vm
służy do celów debugowania. To polecenie umożliwia programiście uruchomienie maszyny wirtualnej z powłoki, przeglądanie jej dzienników i zakończenie działania maszyny wirtualnej. Za pomocą polecenia vm
lub innych interfejsów dostarczonych przez AVF maszyna wirtualna może zostać uruchomiona w trybie debugowalnym (FULL) lub niedebugowalnym (NONE). Dzięki debugowalnej maszynie wirtualnej możesz przeglądać dzienniki na poziomie systemu operacyjnego, uzyskiwać dostęp do powłoki ADB i przechwytywać zrzuty awaryjne lub ładunek aplikacji. Zaleca się używanie w środowisku produkcyjnym maszyny wirtualnej, której nie można debugować. Więcej informacji na temat narzędzia wiersza poleceń i innych interfejsów debugowania udostępnianych przez AVF można znaleźć w pliku debug/README.md .