वर्चुअलाइजेशन सेवा

VirtualizationService मुख्य रूप से crosvm के इंस्टेंस को प्रबंधित करके, Android सिस्टम पर चलने वाले सभी अतिथि VMs, संरक्षित या अन्यथा प्रबंधित करता है। VirtualizationService सर्विस एक एआईडीएल एपीआई को उजागर करती है, जिसका उपयोग सिस्टम सेवाएं या ऐप वीएम को शुरू करने, मॉनिटर करने और रोकने के लिए कर सकते हैं।

एआईडीएल एपीआई

VirtualizationService सर्विस एक एआईडीएल एपीआई को उजागर करती है जिसका उपयोग ग्राहक चित्र प्रदान करने और वीएम शुरू करने के लिए कर सकते हैं। यह विवरण या तो बूटलोडर या कर्नेल के लिए फ़ाइल डिस्क्रिप्टर के साथ एक कच्चा VM कॉन्फ़िगरेशन हो सकता है और VM में शामिल करने के लिए विभिन्न डिस्क छवियां हो सकती हैं, या एक माइक्रोड्रॉइड कॉन्फ़िगरेशन जहां क्लाइंट केवल पेलोड प्रदान करता है और VM को एक मानक माइक्रोड्रॉइड कर्नेल और बुनियादी ढांचे के साथ शुरू किया जाता है। . VirtualizationService तब एक IVirtualMachine Binder ऑब्जेक्ट देता है जो VM का प्रतिनिधित्व करता है। वीएम शुरू करने वाला क्लाइंट सामान्य बाइंडर तंत्र का उपयोग करके बाइंडर ऑब्जेक्ट को अन्य प्रक्रियाओं के साथ साझा करना चुन सकता है।

IVirtualMachine में VM के बारे में जानकारी प्राप्त करने के लिए AIDL विधियाँ हैं, जैसे CID, जिसका उपयोग इसके साथ vsock पर संचार करने के लिए किया जा सकता है, और VM के रुकने पर कॉल करने के लिए कॉलबैक को पंजीकृत करने की भी अनुमति देता है। Microdroid VMs के मामले में IVirtualMachine ऑब्जेक्ट का उपयोग VM से बाइंडर कनेक्शन सेट करने के लिए भी किया जा सकता है।

वीएम जीवनचक्र

VM तक पहुंच को IVirtualMachine ऑब्जेक्ट द्वारा ट्रैक किया जाता है। जब तक IVirtualMachine ऑब्जेक्ट का कम से कम एक संदर्भ है तब तक VM चलता रहता है (जब तक कि यह क्रैश या अपने आप बंद नहीं हो जाता)। यदि VM के बंद होने से पहले IVirtualMachine ऑब्जेक्ट के सभी संदर्भ हटा दिए जाते हैं, तो VirtualizationService स्वचालित रूप से VM को बंद कर देता है। इस प्रक्रिया का तात्पर्य है कि यदि VM को प्रारंभ करने वाला क्लाइंट कम मेमोरी किलर द्वारा बंद कर दिया जाता है, तो VM भी बंद हो जाता है, इस प्रकार संसाधन रिसाव को रोकता है।

प्रत्येक VM को crosvm के अपने उदाहरण द्वारा प्रबंधित किया जाता है, जिसे VirtualizationService बदले में क्लाइंट की ओर से प्रबंधित करता है। VirtualizationService इन crosvm चाइल्ड प्रोसेस को आवश्यकतानुसार शुरू करता है, और उन्हें VM के लिए आवश्यक इमेज के लिए फाइल डिस्क्रिप्टर पास करता है। VirtualizationService तब बच्चे की प्रक्रिया की निगरानी करती है जब वे मर जाते हैं, इसलिए यह किसी भी शेष ग्राहकों को तदनुसार सूचित कर सकता है।

वीएम पैकेजिंग

crosvm VM को बूट करने के दो अलग-अलग तरीकों का समर्थन करता है: या तो एक कर्नेल और initrd प्रदान किया जाता है या एक बूटलोडर प्रदान किया जाता है। किसी भी मामले में, डिस्क छवियों की एक मनमानी संख्या भी प्रदान की जा सकती है, जो या तो एक कच्ची छवि हो सकती है या कई विभाजनों का एक संयोजन हो सकता है। क्लाइंट द्वारा फाइल डिस्क्रिप्टर के रूप में विभिन्न छवियां प्रदान की जाती हैं।

VirtualizationService मांग पर समग्र डिस्क चित्र बनाता है। यह प्रक्रिया आवश्यक है क्योंकि समग्र डिस्क फ़ाइल डिस्क की रचना करने वाली विभिन्न विभाजन छवि फ़ाइलों को आंतरिक रूप से संदर्भित करती है, जो क्लाइंट द्वारा पारित की जाती है और crosvm द्वारा सीधे पहुंच योग्य नहीं हो सकती है। इस समस्या को हल करने के लिए, VirtualizationService सुनिश्चित करता है कि crosvm द्वारा विरासत में मिली फ़ाइल डिस्क्रिप्टर संख्याएँ फ़ाइल डिस्क्रिप्टर संख्याओं के समान हैं, जो VirtualizationService ने समग्र चित्र बनाने में उपयोग की थी। समग्र डिस्क छवि प्रत्येक विभाजन फ़ाइल का प्रतिनिधित्व करने के लिए /proc/self/fd/N के रूप में फ़ाइल नामों का उपयोग करती है।

Microdroid pVMs के लिए, AVF में एक बूटलोडर शामिल होता है, जो मानक Android सत्यापित बूट प्रवाह का पालन करते हुए, एक समग्र डिस्क छवि के विभाजन से कर्नेल को लोड करता है।

वीएम सॉकेट (vsock)

pVMs के बीच संचार के लिए प्राथमिक इंटरफ़ेस vsock है, जो एक मानक virtio सॉकेट इंटरफ़ेस है। प्रत्येक VM को 32-बिट संदर्भ पहचानकर्ता (CID) द्वारा पहचाना जाता है, जो एक IP पते के अनुरूप होता है, जिसे VirtualizationService VM को VM बनाते समय असाइन करता है, और VM द्वारा चुने गए किसी भी पोर्ट नंबर पर सेवाओं को उजागर कर सकता है। VM के चलने के दौरान CID अद्वितीय है, लेकिन VM के समाप्त होने पर CID मान को पुनर्नवीनीकरण किया जा सकता है और VM के सभी IVirtualMachine Binder हैंडल को हटा दिया गया है।

डीबग इंटरफ़ेस

vm कमांड डिबग उद्देश्यों के लिए प्रदान किया जाता है। यह कमांड एक डेवलपर को शेल से वीएम शुरू करने देता है, उसके लॉग्स को देखने देता है और वीएम को समाप्त करने देता है। vm कमांड में वर्तमान में चल रहे VMs को सूचीबद्ध करने का विकल्प भी शामिल है, जिसमें उनकी स्थिति और संबंधित प्रक्रियाएं शामिल हैं। यह विकल्प VirtualizationService सर्विस एआईडीएल एपीआई पर एक अतिरिक्त विधि के रूप में लागू किया गया है, जिसे दुरुपयोग से बचने के लिए, केवल शेल उपयोगकर्ता द्वारा ही बुलाया जा सकता है।

AVF में अतिथि VMs को adb पहुँच प्रदान करने के लिए, vsock पर adb कनेक्शन अग्रेषित करने के लिए समर्थन भी शामिल है। उदाहरण के लिए, पोर्ट 5555 पर CID 10 रनिंग adbd के साथ एक माइक्रोड्रॉइड वीएम के लिए, डेवलपर अपने वर्कस्टेशन से माइक्रोड्रॉइड वीएम में निम्नलिखित कमांड के साथ एक शेल प्राप्त कर सकता है:

    $ adb forward tcp:8000 vsock:10:5555
    $ adb connect localhost:8000
    $ adb -s localhost:8000 shell

Vsock पर adb कनेक्शन अग्रेषित करना केवल डिबग मोड में चल रहे VMs के लिए उपलब्ध है।