Usługa VirtualizationService

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. VirtualizationServicevirtmgruruchamia te procesy potomne crosvm w miarę potrzeby z przypisanymi zasobami globalnymi, w tym z identyfikatorem klienta przyznanym przez VirtualizationServiceInternalvirtualizationservice, 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, VirtualizationServicezapewnia, ż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.