VirtualizationService
, öncelikli olarak crosvm örneklerini yöneterek Android sisteminde çalışan korumalı veya başka bir şekilde birden fazla konuk sanal makinesini yönetir.
VirtualizationService
, sistem hizmetlerinin veya uygulamaların sanal makineleri başlatmak, izlemek ve durdurmak için kullanabileceği bir AIDL API'si sağlar. VirtualizationService
kullanmak için virtmgr
'ı doğrudan çalıştırın veya virtmgr
'ı alt işlem olarak çalıştıran javalib ya da rustlib'i içe aktarın.
Sanal makine yaşam döngüsü
Sanal makineye erişim, IVirtualMachine
nesnesi tarafından izlenir. IVirtualMachine
nesnesine en az bir referans olduğu sürece sanal makine çalışmaya devam eder (kendi kendine kilitlenmediği veya kapanmadığı sürece). Sanal makine kapanmadan önce IVirtualMachine
nesnesine yapılan tüm başvurular kaldırılırsa VirtualizationService
, sanal makineyi otomatik olarak kapatır. Bu işlem, sanal makineyi başlatan istemcinin düşük bellek sonlandırıcı tarafından kapatılması durumunda sanal makinenin de kapatılacağını, böylece kaynak sızıntılarının önleneceğini ifade eder.
Her sanal makine, kendi crosvm örneği tarafından yönetilir. VirtualizationService
Bu örnek de istemci adına yönetilir. virtmgr
'daki VirtualizationService
, bu crosvm alt işlemlerini gerektiği gibi, virtualizationservice
'daki VirtualizationServiceInternal
tarafından verilen CID dahil olmak üzere ayrılmış genel kaynaklarla başlatır ve VM'nin ihtiyaç duyduğu resimlerin dosya tanımlayıcılarını onlara iletir. VirtualizationService
daha sonra alt öğelerin vefat ettiği zamanı izler. Böylece kalan müşterileri buna göre bilgilendirebilir.
Sanal makine paketleme
crosvm, bir sanal makineyi başlatmanın iki farklı yolunu destekler: Bir çekirdek ve initrd sağlanır veya bir önyükleme yükleyici sağlanır. Her iki durumda da, rastgele sayıda disk görüntüsü de sağlanabilir. Bu görüntüler ham görüntü veya birkaç bölümden oluşan bir kompozit olabilir. Çeşitli görüntüler, istemci tarafından dosya açıklayıcıları olarak sağlanır.
VirtualizationService
, karma disk görüntülerini isteğe bağlı olarak oluşturur. Bileşik disk dosyası, diski oluşturan çeşitli bölüm görüntü dosyalarına dahili olarak başvurduğundan bu işlem gereklidir. Bu dosyalar istemci tarafından iletilir ve crosvm tarafından doğrudan erişilemeyebilir. Bu sorunun üstesinden gelmek için VirtualizationService
, crosvm tarafından devralınan dosya tanımlayıcı numaralarının, VirtualizationService
'nin birleşik resimleri oluştururken kullandığı dosya tanımlayıcı numaralarıyla aynı olduğundan emin olur. Bileşik disk görüntüsü, her bir bölümlendirme dosyasını temsil etmek için /proc/self/fd/N
biçiminde dosya adlarını kullanır.
Microdroid pVM'ler için AVF, standart Android Doğrulanmış Önyükleme akışını izleyerek çekirdeği bir karma disk görüntüsünün bir bölümünden yükleyen bir önyükleme yükleyici içerir.
Sanal makine yuvaları (vsock)
pVM'ler arasındaki iletişim için birincil arayüz, standart bir virtio soket arayüzü olan vsock'tur. Her sanal makine, bir IP adresine benzeyen 32 bit bağlam tanımlayıcısıyla (CID) tanımlanır. VirtualizationService
, sanal makineyi oluşturduğunda VirtualizationServiceInternal
tarafından sanal makineye atanır ve sanal makinenin seçtiği bağlantı noktası numaralarında hizmetler kullanıma sunulabilir.
Sanal makine çalışırken CID benzersizdir ancak sanal makine sonlandırıldığında ve sanal makineye yönelik tüm IVirtualMachine
bağlayıcı işleyicileri bırakıldığında CID değeri geri dönüştürülebilir.
Hata ayıklama arayüzü
vm
komutu, hata ayıklama amacıyla sağlanır. Bu komut, geliştiricilerin kabuktan sanal makine başlatmasına, günlüklerini görüntülemesine ve sanal makineyi sonlandırmasına olanak tanır. vm
komutu veya AVF tarafından sağlanan diğer arayüzlerle sanal makineler, hata ayıklanabilir (TAM) veya hata ayıklanamaz (NONE) modda başlayabilir. Hata ayıklanabilir bir sanal makineyle işletim sistemi düzeyindeki günlükleri görebilir, ADB kabuğuna erişebilir ve kilitlenme dökümünü veya uygulama yükünü yakalayabilirsiniz.
Üretimde hata ayıklama yapılamayan bir sanal makine kullanılması önerilir. Komut satırı aracı ve AVF'nin sağladığı diğer hata ayıklama arayüzleri hakkında daha fazla bilgi için debug/README.md dosyasını inceleyin.