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 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óre uruchamiają 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. Ten proces zakłada, że jeśli klient, który uruchomił maszynę wirtualną, zostanie zamknięty przez funkcję zabijania przy niskim wykorzystaniu pamięci, maszyna wirtualna zostanie również zamknięta, co zapobiegnie wyciekom zasobów.
Każda maszyna wirtualna jest zarządzana przez własną instancję crosvm, która VirtualizationService
zarządza nią w imieniu klienta. VirtualizationService
w virtmgr
uruchamia te procesy podrzędne 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 potrzebnych 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 różne sposoby uruchamiania maszyny wirtualnej: z użyciem jądra i initrd lub z wykorzystaniem programu ładującego. W obu przypadkach można podać dowolną liczbę obrazów dysku, które mogą być obrazem surowym lub kombinacją kilku partycji. Różne obrazy są dostarczane przez klienta jako deskryptory plików.
VirtualizationService
tworzy kopie obrazów dysków złożonych na żądanie. Ten proces jest konieczny, ponieważ plik dysków złożonych odwołuje się wewnętrznie do różnych plików obrazów partycji, z których składa się dysk, przekazywanych przez klienta i które mogą nie być bezpośrednio dostępne dla crosvm. Aby obejść ten problem,
VirtualizationService
zapewnia, że numery opisów plików odziedziczone przez
crosvm są takie same jak numery opisó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.
gniazda maszyn wirtualnych (vsock),
Głównym interfejsem do komunikacji między pVM jest vsock, standardowy interfejs gniazda Virtuo. 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 zakończona, a wszystkie uchwyty bindera IVirtualMachine
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ć dane z dumpu po awarii lub ładunku aplikacji.
W środowisku produkcyjnym zalecamy używanie maszyny wirtualnej, której nie można debugować. Więcej informacji o narzędzie wiersza poleceń i innych interfejsach debugowania, które udostępnia AVF, znajdziesz w pliku debug/README.md.