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