VirtualizationService, öncelikle crosvm örneklerini yöneterek Android sisteminde çalışan, korumalı veya korumasız birden fazla konuk sanal makineyi yönetir.
VirtualizationService Sistem hizmetlerinin veya uygulamaların VM'leri başlatmak, izlemek ve durdurmak için kullanabileceği bir AIDL API'si sunar. VirtualizationService işlevini kullanmak için virtmgr işlevini doğrudan çalıştırın veya virtmgr işlevini alt işlem olarak çalıştıran javalib ya da rustlib kitaplığını içe aktarın.
Sanal makine yaşam döngüsü
Bir 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 (kilitlenmediği veya kendi kendine kapanmadığı sürece). IVirtualMachine nesnesine yapılan tüm referanslar sanal makine kapatılmadan önce bırakılırsa VirtualizationService, sanal makineyi otomatik olarak kapatır. Bu işlem, sanal makineyi başlatan istemci düşük bellekli işlem sonlandırıcı tarafından kapatılırsa sanal makinenin de kapatılacağı anlamına gelir. Böylece kaynak sızıntıları önlenir.
Her sanal makine, istemci adına yöneten kendi crosvm örneği tarafından yönetilir. VirtualizationService
VirtualizationService, virtmgr içinde VirtualizationServiceInternal tarafından virtualizationservice içinde verilen CID dahil olmak üzere, gerekli olan bu crosvm alt işlemlerini ayrılmış genel kaynaklarla başlatır ve bunlara VM'nin ihtiyaç duyduğu görüntülerin dosya tanımlayıcılarını iletir. VirtualizationService, alt işlemin ne zaman sonlandığını izler ve kalan istemcileri buna göre bilgilendirir.
Sanal makine paketleme
crosvm, bir sanal makineyi başlatmanın iki farklı yolunu destekler: çekirdek ve initrd sağlanır veya bir önyükleyici sağlanır. Her iki durumda da, ham görüntü veya birkaç bölümün birleşimi olabilecek rastgele sayıda disk görüntüsü sağlanabilir. Çeşitli resimler, istemci tarafından dosya tanımlayıcıları olarak sağlanır.
VirtualizationService, isteğe bağlı olarak bileşik disk görüntüleri oluşturur. Bu işlem, birleşik disk dosyası dahili olarak diski oluşturan çeşitli bölüm resmi dosyalarına başvurduğu için gereklidir. Bu dosyalar istemci tarafından iletilir ve crosvm tarafından doğrudan erişilemeyebilir. Bu sorunu çözmek için,
VirtualizationService, crosvm tarafından devralınan dosya tanımlayıcı numaralarının, VirtualizationService
bileşik görüntüleri oluştururken kullanılan dosya tanımlayıcı numaralarıyla aynı olmasını sağlar. Birleşik disk görüntüsü, her bölüm dosyasını temsil etmek için /proc/self/fd/N biçiminde dosya adları kullanır.
Microdroid pVM'leri için AVF, standart Android Doğrulanmış Başlatma akışını izleyerek çekirdeği birleşik disk görüntüsünün bölümünden yükleyen bir önyü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, VirtualizationServiceInternal sanal makineyi oluşturduğunda VirtualizationService sanal makineye atanan ve IP adresine benzeyen 32 bitlik bir bağlam tanımlayıcısı (CID) ile tanımlanır. Ayrıca, sanal makinenin seçtiği bağlantı noktası numaralarında hizmetleri kullanıma sunabilir.
CID, sanal makine çalışırken benzersizdir ancak sanal makine sonlandırıldığında ve sanal makineye yönelik tüm IVirtualMachine bağlayıcı tutamaçları bırakıldığında CID değeri yeniden kullanılabilir.
Hata ayıklama arayüzü
vm komutu, hata ayıklama amacıyla sağlanır. Bu komut, geliştiricinin 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 bir sanal makine, hata ayıklanabilir (FULL) veya hata ayıklanamayan (NONE) modda başlatılabilir. 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ü ya da uygulama yükü yakalayabilirsiniz.
Üretimde hata ayıklanamayan bir VM kullanmanız ö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 sayfasına bakın.