VirtualizationService
, Android सिस्टम पर चलने वाले कई गेस्ट वीएम को मैनेज करता है. ये वीएम सुरक्षित हो सकते हैं या नहीं भी हो सकते हैं. यह मुख्य रूप से, crosvm के इंस्टेंस को मैनेज करके ऐसा करता है.
VirtualizationService
एक AIDL एपीआई उपलब्ध कराता है. इसका इस्तेमाल सिस्टम सेवाएं या ऐप्लिकेशन, वीएम को शुरू करने, मॉनिटर करने, और बंद करने के लिए कर सकते हैं. VirtualizationService
का इस्तेमाल करने के लिए, virtmgr
को सीधे तौर पर एक्ज़ीक्यूट करें या javalib या rustlib को इंपोर्ट करें. ये virtmgr
को चाइल्ड प्रोसेस के तौर पर एक्ज़ीक्यूट करते हैं.
वीएम का लाइफ़साइकल
वीएम के ऐक्सेस को IVirtualMachine
ऑब्जेक्ट ट्रैक करता है. जब तक IVirtualMachine
ऑब्जेक्ट का कम से कम एक रेफ़रंस मौजूद रहता है, तब तक वर्चुअल मशीन (वीएम) चलती रहती है. हालांकि, अगर वीएम क्रैश हो जाती है या अपने-आप बंद हो जाती है, तो ऐसा नहीं होगा. अगर वीएम बंद होने से पहले, IVirtualMachine
ऑब्जेक्ट के सभी रेफ़रंस हटा दिए जाते हैं, तो VirtualizationService
वीएम को अपने-आप बंद कर देता है. इस प्रोसेस का मतलब है कि अगर VM शुरू करने वाले क्लाइंट को मेमोरी कम होने की वजह से बंद कर दिया जाता है, तो VM भी बंद हो जाता है. इससे संसाधनों के लीक होने से बचाव होता है.
हर वीएम को crosvm के अपने इंस्टेंस से मैनेज किया जाता है. यह इंस्टेंस, VirtualizationService
क्लाइंट की ओर से मैनेज करता है. VirtualizationService
, virtmgr
में
ज़रूरत के मुताबिक, ये crosvm चाइल्ड प्रोसेस शुरू करता है. साथ ही, इन्हें
virtualizationservice
में VirtualizationServiceInternal
से मिले सीआईडी सहित, असाइन किए गए ग्लोबल संसाधन उपलब्ध कराता है. इसके अलावा, यह उन्हें उन इमेज के लिए फ़ाइल डिस्क्रिप्टर पास करता है जिनकी ज़रूरत वीएम को होती है. 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 देखें.