VirtualizationService

VirtualizationService, öncelikle crosvm örneklerini yöneterek bir 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). Sanal makine kapatılmadan önce IVirtualMachine nesnesine yapılan tüm referanslar 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, ayrılan genel kaynaklarla gerektiği şekilde bu crosvm alt işlemlerini başlatır ve VM'nin ihtiyaç duyduğu görüntülerin dosya tanımlayıcılarını bunlara iletir. VirtualizationService, kalan istemcileri uygun şekilde bilgilendirebilmek için alt işlemin ne zaman sonlandığını izler.

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. Bileşik disk görüntüsü, her bölüm dosyasını temsil etmek için /proc/self/fd/N biçimindeki dosya adlarını kullanır.

Microdroid pVM'leri için AVF, standart Android Doğrulanmış Önyükleme akışını izleyerek çekirdeği birleşik disk görüntüsünün bir 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, 32 bitlik bir bağlam tanımlayıcısı (CID) ile tanımlanır. Bu tanımlayıcı, sanal makine oluşturulduğunda VirtualizationServiceInternal tarafından sanal makineye atanan ve sanal makinenin seçtiği bağlantı noktası numaralarında hizmetleri kullanıma sunabilen bir IP adresine benzer.VirtualizationService 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 bir 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.