VirtualizationService

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 VirtualizationServicezarządza nią w imieniu klienta. VirtualizationServicevirtmgr uruchamia te procesy podrzędne crosvm w miarę potrzeby z przypisanymi zasobami globalnymi, w tym z identyfikatorem klienta przyznanym przez VirtualizationServiceInternalvirtualizationservice, 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, VirtualizationServicezapewnia, ż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.