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 देखें।