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

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

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

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

प्रत्येक वीएम को क्रॉसवीएम के अपने उदाहरण द्वारा प्रबंधित किया जाता है, जिसे VirtualizationService क्लाइंट की ओर से प्रबंधित करती है। virtmgr में VirtualizationService virtualizationservice में VirtualizationServiceInternal द्वारा दिए गए सीआईडी ​​सहित आवंटित वैश्विक संसाधनों के साथ आवश्यकतानुसार इन क्रॉसवीएम चाइल्ड प्रक्रियाओं को शुरू करता है, और उन्हें वीएम की जरूरत की छवियों के लिए फ़ाइल डिस्क्रिप्टर पास करता है। VirtualizationService तब बच्चे की मृत्यु की प्रक्रिया की निगरानी करती है, ताकि वह शेष बचे ग्राहकों को तदनुसार सूचित कर सके।

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

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

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

माइक्रोड्रॉइड पीवीएम के लिए, एवीएफ में एक बूटलोडर शामिल होता है, जो मानक एंड्रॉइड सत्यापित बूट प्रवाह का पालन करते हुए, एक समग्र डिस्क छवि के विभाजन से कर्नेल को लोड करता है।

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

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

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

vm कमांड डिबग उद्देश्यों के लिए प्रदान किया गया है। यह कमांड डेवलपर को शेल से VM प्रारंभ करने, उसके लॉग देखने और VM को समाप्त करने देता है। vm कमांड या एवीएफ द्वारा प्रदान किए गए अन्य इंटरफेस के साथ, एक वीएम डिबग करने योग्य (पूर्ण) या गैर-डिबग करने योग्य (कोई नहीं) मोड में शुरू हो सकता है। डिबग करने योग्य वीएम के साथ, आप ओएस स्तर के लॉग देख सकते हैं, एडीबी शेल तक पहुंच सकते हैं और क्रैश-डंप या ऐप पेलोड को कैप्चर कर सकते हैं। उत्पादन में गैर-डिबग करने योग्य वीएम का उपयोग करने की अनुशंसा की जाती है। कमांड लाइन टूल और AVF द्वारा प्रदान किए जाने वाले अन्य डिबग इंटरफेस के बारे में अधिक जानकारी के लिए, debug/README.md देखें।