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