VirtualizationService
zarządza wieloma zabezpieczonymi lub innymi maszynami wirtualnymi
działającymi w systemie Android, głównie przez zarządzanie instancjami crosvm.
VirtualizationService
udostępnia interfejs AIDL API, którego systemowe usługi lub aplikacje mogą używać do uruchamiania, monitorowania i zatrzymywania maszyn wirtualnych. Aby użyć funkcji VirtualizationService
, uruchom virtmgr
bezpośrednio lub zaimportuj javalib albo rustlib, który uruchamia virtmgr
jako proces potomny.
Cykl życia maszyny wirtualnej
Dostęp do maszyny wirtualnej jest śledzony przez obiekt IVirtualMachine
. Dopóki istnieje co najmniej jedno odwołanie do obiektu IVirtualMachine
, maszyna wirtualna będzie działać (chyba że ulegnie awarii lub wyłączy się samoczynnie). Jeśli wszystkie odwołania do obiektu IVirtualMachine
zostaną usunięte przed wyłączeniem maszyny wirtualnej, VirtualizationService
automatycznie ją wyłączy. Proces ten oznacza, że jeśli klient, który uruchomił maszynę wirtualną, zostanie wyłączony przez program uruchamiający mało pamięci, to maszyna wirtualna również zostanie wyłączona, co zapobiega wyciekom zasobów.
Każda maszyna wirtualna jest zarządzana przez własną instancję crosvm, którą VirtualizationService
z kolei zarządza w imieniu klienta. VirtualizationService
w virtmgr
uruchamia te procesy potomne crosvm w miarę potrzeby z przypisanymi zasobami globalnymi, w tym z identyfikatorem klienta przyznanym przez VirtualizationServiceInternal
w virtualizationservice
, i przekazuje im opisy plików obrazów, których potrzebuje VM. VirtualizationService
następnie monitoruje proces podrzędny, aby powiadomić pozostałych klientów o jego zakończeniu.
Opakowanie maszyny wirtualnej
crosvm obsługuje 2 sposoby uruchamiania maszyny wirtualnej: udostępnione jest jądro i plik inicjujący albo można skorzystać z programu rozruchowego. W obu przypadkach można też dostarczyć dowolną liczbę obrazów dysku, które mogą być w postaci obrazu nieprzetworzonego lub złożonego z kilku partycji. Różne obrazy są dostarczane przez klienta jako deskryptory plików.
VirtualizationService
tworzy obrazy dysków złożonych na żądanie. Ten proces jest konieczny, ponieważ plik dysku złożonego wewnętrznie odnosi się do różnych plików obrazów partycji składających się na 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, które VirtualizationService
używa do tworzenia obrazów złożonych. Obraz dyskowy złożony używa nazw plików w formie /proc/self/fd/N
do reprezentowania poszczególnych plików partycji.
W przypadku maszyn wirtualnych Microdroid AVF zawiera program rozruchowy, który wczytuje jądro z partycji obrazu dyskowego złożonego, zgodnie ze standardowym procesem zweryfikowanego rozruchu Androida.
VM Sockets (vsock)
Głównym interfejsem do komunikacji między pVM jest vsock, standardowy interfejs gniazda virtio. Każda maszyna wirtualna jest identyfikowana za pomocą 32-bitowego identyfikatora kontekstu (CID), który jest podobny do adresu IP. VirtualizationServiceInternal
przypisuje go maszynie wirtualnej, gdy VirtualizationService
ją tworzy, i może udostępniać usługi na dowolnych numerach portów wybranych przez maszynę wirtualną.
Identyfikator CID jest unikalny, dopóki maszyna wirtualna jest uruchomiona, ale można go ponownie wykorzystać, gdy maszyna wirtualna zostanie zamknięta, a wszystkie IVirtualMachine
uchwyty bindera dla maszyny wirtualnej zostaną usunięte.
Interfejs debugowania
Polecenie vm
służy do debugowania. To polecenie umożliwia deweloperowi uruchamianie maszyny wirtualnej z poziomu powłoki, wyświetlanie jej dzienników i jej zamykanie. Za pomocą polecenia vm
lub innych interfejsów udostępnianych przez AVF maszyna wirtualna może się uruchamiać w trybie debugowania (FULL) lub bez debugowania (NONE). Dzięki maszynie wirtualnej z możliwością debugowania możesz wyświetlać dzienniki na poziomie systemu operacyjnego, uzyskiwać dostęp do powłoki ADB oraz przechwytywać informacje o awarii lub ładunek aplikacji.
W środowisku produkcyjnym zalecamy użycie maszyny wirtualnej, której nie można debugować. Więcej informacji o narzędziu wiersza poleceń i innych interfejsach debugowania, które udostępnia AVF, znajdziesz w pliku debug/README.md.