VirtualizationService
, öncelikle crosvm örneklerini yöneterek, bir Android sisteminde çalışan korumalı veya başka türlü tüm konuk sanal makinelerini yönetir. VirtualizationService
, sistem hizmetlerinin veya uygulamaların VM'leri başlatmak, izlemek ve durdurmak için kullanabileceği bir AIDL API'si sunar.
AIDL API'si
VirtualizationService
, istemcilerin görüntü sağlamak ve bir VM başlatmak için kullanabileceği bir AIDL API'si sunar. Bu açıklama, önyükleyici veya çekirdek için dosya tanımlayıcıları ve VM'ye dahil edilecek çeşitli disk görüntüleri içeren ham bir VM yapılandırması veya istemcinin yalnızca yükü sağladığı ve VM'nin standart bir Microdroid çekirdeği ve altyapısı ile başlatıldığı bir Microdroid yapılandırması olabilir. . VirtualizationService
daha sonra VM'yi temsil eden bir IVirtualMachine
Binder nesnesi döndürür. VM'yi başlatan istemci, olağan Binder mekanizmalarını kullanarak Binder nesnesini diğer işlemlerle paylaşmayı seçebilir.
IVirtualMachine
, Vsock üzerinden iletişim kurmak için kullanılabilen CID gibi VM hakkında bilgi almak için AIDL yöntemlerine sahiptir ve ayrıca VM durduğunda çağrılmak üzere bir geri aramanın kaydedilmesine izin verir. Microdroid VM'leri durumunda IVirtualMachine
nesnesi, VM'ye Binder bağlantıları kurmak için de kullanılabilir.
sanal makine yaşam döngüsü
Bir VM'ye erişim, IVirtualMachine
nesnesi tarafından izlenir. IVirtualMachine
nesnesine en az bir referans olduğu sürece VM çalışmaya devam eder (kendiliğinden çökmediği veya kapanmadığı sürece). VM kapanmadan önce IVirtualMachine
nesnesine yapılan tüm başvurular bırakılırsa, VirtualizationService
VM'yi otomatik olarak kapatır. Bu işlem, VM'yi başlatan istemci düşük bellek katili tarafından kapatılırsa, VM'nin de kapatılacağı ve böylece kaynak sızıntılarının önleneceği anlamına gelir.
Her VM, VirtualizationService
istemci adına yönettiği kendi crosvm örneği tarafından yönetilir. VirtualizationService
, bu crosvm alt işlemlerini gerektiği gibi başlatır ve onlara VM'nin ihtiyaç duyduğu görüntüler için dosya tanımlayıcılarını iletir. VirtualizationService
daha sonra, alt süreci öldüklerinde izler, böylece kalan istemcileri buna göre bilgilendirebilir.
sanal makine paketleme
crosvm, bir VM'yi önyüklemenin iki farklı yolunu destekler: ya bir çekirdek ve initrd sağlanır ya da bir önyükleyici sağlanır. Her iki durumda da, ham bir görüntü veya birkaç bölümün bir bileşimi olabilen isteğe bağlı sayıda disk görüntüsü de sağlanabilir. Çeşitli görüntüler, 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 gereklidir, çünkü bileşik disk dosyası, istemci tarafından geçirilen ve crosvm tarafından doğrudan erişilemeyen, diski oluşturan çeşitli bölüm görüntü dosyalarına dahili olarak atıfta bulunur. Bu sorunu aşmak için VirtualizationService
, crosvm tarafından devralınan dosya tanımlayıcı numaralarının, VirtualizationService'in bileşik görüntüleri oluştururken kullandığı 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çiminde dosya adlarını kullanır.
AVF, Microdroid pVM'ler için, standart Android Verified Boot akışını izleyerek bir bileşik disk görüntüsünün bir bölümünden çekirdeği yükleyen bir önyükleyici içerir.
VM Yuvaları (vsock)
pVM'ler arasındaki iletişim için birincil arabirim, standart bir virtio soket arabirimi olan vsock'tur. Her bir VM, bir IP adresine benzer olan, VirtualizationService
Hizmetinin VM oluşturulduğunda VM'ye atadığı ve VM'nin seçtiği bağlantı noktası numaralarında hizmetleri ortaya çıkarabilen 32 bitlik bir bağlam tanımlayıcısı (CID) ile tanımlanır. VM çalışırken CID benzersizdir, ancak VM sonlandırıldığında ve VM'ye yönelik tüm IVirtualMachine
Binder tanıtıcıları 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ştiricinin kabuktan bir VM başlatmasına, günlüklerini görüntülemesine ve VM'yi sonlandırmasına olanak tanır. vm
komutu ayrıca, durumları ve ilişkili işlemleri de dahil olmak üzere, o anda çalışan VM'leri listeleme seçeneği içerir. Bu seçenek, kötüye kullanımı önlemek için yalnızca kabuk kullanıcısı tarafından çağrılabilen VirtualizationService
AIDL API'sinde ek bir yöntem olarak uygulanır.
AVF, konuk VM'lere adb
erişimi sağlamak için bir adb
bağlantısını vsock üzerinden iletme desteği de içerir. Örneğin, 5555 numaralı bağlantı noktasında adbd
çalıştıran CID 10'a sahip bir Microdroid VM için geliştirici, aşağıdaki komutlarla iş istasyonlarından Microdroid VM'de bir kabuk alabilir:
$ adb forward tcp:8000 vsock:10:5555
$ adb connect localhost:8000
$ adb -s localhost:8000 shell
Bir adb
bağlantısının vsock üzerinden iletilmesi yalnızca hata ayıklama modunda çalışan VM'ler için kullanılabilir.