VirtualizationService, Android सिस्टम पर चलने वाले कई गेस्ट वीएम को मैनेज करता है. ये वीएम सुरक्षित हो सकते हैं या नहीं भी हो सकते हैं. यह मुख्य रूप से, crosvm के इंस्टेंस को मैनेज करके ऐसा करता है.
VirtualizationService एक AIDL एपीआई उपलब्ध कराता है. सिस्टम सेवाएं या ऐप्लिकेशन, इस एपीआई का इस्तेमाल करके वीएम को शुरू, मॉनिटर, और बंद कर सकते हैं. VirtualizationService का इस्तेमाल करने के लिए, virtmgr को सीधे तौर पर लागू करें या javalib या rustlib को इंपोर्ट करें. यह virtmgr को चाइल्ड प्रोसेस के तौर पर लागू करता है.
वीएम का लाइफ़साइकल
वीएम के ऐक्सेस को IVirtualMachine ऑब्जेक्ट ट्रैक करता है. जब तक IVirtualMachine ऑब्जेक्ट का कम से कम एक रेफ़रंस मौजूद रहता है, तब तक वीएम चलता रहता है. हालांकि, ऐसा तब तक होता है, जब तक वह क्रैश न हो जाए या अपने-आप बंद न हो जाए. अगर वीएम बंद होने से पहले, IVirtualMachine ऑब्जेक्ट के सभी रेफ़रंस हटा दिए जाते हैं, तो VirtualizationService वीएम को अपने-आप बंद कर देता है. इस प्रोसेस का मतलब है कि अगर वीएम को शुरू करने वाले क्लाइंट को मेमोरी कम होने की वजह से शट डाउन कर दिया जाता है, तो वीएम भी शट डाउन हो जाता है. इससे संसाधनों के लीक होने से बचाव होता है.
हर वीएम को crosvm के अपने इंस्टेंस से मैनेज किया जाता है. यह इंस्टेंस, VirtualizationService
क्लाइंट की ओर से मैनेज करता है. VirtualizationService, virtmgr में
ज़रूरत के मुताबिक, crosvm की चाइल्ड प्रोसेस शुरू करता है. साथ ही, उन्हें ग्लोबल रिसोर्स असाइन करता है. इनमें virtualizationservice में VirtualizationServiceInternal से मिला CID भी शामिल है. इसके अलावा, यह उन्हें उन इमेज के फ़ाइल डिस्क्रिप्टर पास करता है जिनकी ज़रूरत VM को होती है. VirtualizationService इसके बाद, यह चाइल्ड प्रोसेस के बंद होने पर नज़र रखता है, ताकि बचे हुए क्लाइंट को इसकी सूचना दी जा सके.
वीएम पैकेजिंग
crosvm, वीएम को बूट करने के दो अलग-अलग तरीके इस्तेमाल करता है: या तो कर्नल और initrd दिए जाते हैं या बूटलोडर दिया जाता है. दोनों ही मामलों में, डिस्क इमेज की कोई भी संख्या दी जा सकती है. यह एक रॉ इमेज या कई पार्टिशन का कंपोज़िट हो सकती है. अलग-अलग इमेज, क्लाइंट की ओर से फ़ाइल डिस्क्रिप्टर के तौर पर उपलब्ध कराई जाती हैं.
VirtualizationService मांग पर कंपोज़िट डिस्क इमेज बनाता है. यह प्रोसेस ज़रूरी है, क्योंकि कंपोज़िट डिस्क फ़ाइल, डिस्क बनाने वाली अलग-अलग पार्टीशन इमेज फ़ाइलों के बारे में अंदरूनी तौर पर जानकारी देती है. ये फ़ाइलें क्लाइंट से पास की जाती हैं और हो सकता है कि इन्हें सीधे तौर पर crosvm से ऐक्सेस न किया जा सके. इस समस्या को ठीक करने के लिए,
VirtualizationService यह पक्का करता है कि crosvm से इनहेरिट किए गए फ़ाइल डिस्क्रिप्टर नंबर, उन फ़ाइल डिस्क्रिप्टर नंबर के बराबर हों जिनका इस्तेमाल VirtualizationService ने कंपोज़िट इमेज बनाने के लिए किया था. कंपोज़िट डिस्क इमेज, फ़ाइल के नामों का इस्तेमाल करती है. ये नाम, /proc/self/fd/N के तौर पर होते हैं, ताकि हर पार्टीशन फ़ाइल को दिखाया जा सके.
माइक्रोड्रॉइड pVM के लिए, AVF में एक बूटलोडर शामिल होता है. यह कंपोज़िट डिस्क इमेज के किसी पार्टिशन से कर्नल को लोड करता है. यह काम, Android के स्टैंडर्ड वेरिफ़ाइड बूट फ़्लो के मुताबिक होता है.
वीएम सॉकेट (vsock)
pVM के बीच कम्यूनिकेशन के लिए मुख्य इंटरफ़ेस vsock है. यह एक स्टैंडर्ड virtio सॉकेट इंटरफ़ेस है. हर वीएम की पहचान 32-बिट कॉन्टेक्स्ट आइडेंटिफ़ायर (सीआईडी) से होती है. यह आईपी पते के जैसा होता है. VirtualizationServiceInternal, वीएम बनाते समय इसे वीएम को असाइन करता है. साथ ही, यह वीएम को किसी भी पोर्ट नंबर पर सेवाएं उपलब्ध कराने की अनुमति देता है.VirtualizationService
वीएम के चालू रहने के दौरान, सीआईडी यूनीक होता है. हालांकि, वीएम के बंद होने और वीएम के सभी IVirtualMachine बाइंडर हैंडल हटा दिए जाने पर, सीआईडी की वैल्यू को रीसाइकल किया जा सकता है.
डीबग इंटरफ़ेस
vm कमांड, डीबग करने के लिए दी गई है. इस कमांड की मदद से, डेवलपर शेल से वीएम शुरू कर सकता है, उसके लॉग देख सकता है, और वीएम को बंद कर सकता है. vm कमांड या AVF के दिए गए अन्य इंटरफ़ेस की मदद से, वीएम को डीबग करने लायक (FULL) या डीबग नहीं किए जा सकने वाले (NONE) मोड में शुरू किया जा सकता है. डीबग करने लायक वीएम की मदद से, ये काम किए जा सकते हैं:
ओएस-लेवल के लॉग देखना, ADB शेल को ऐक्सेस करना, और क्रैश-डंप या ऐप्लिकेशन पेलोड कैप्चर करना.
हमारा सुझाव है कि प्रोडक्शन में, डीबग नहीं की जा सकने वाली वीएम का इस्तेमाल करें. कमांड लाइन टूल और AVF के उपलब्ध कराए गए अन्य डीबग इंटरफ़ेस के बारे में ज़्यादा जानने के लिए, debug/README.md देखें.