Sanallaştırma Hizmeti

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

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.