माइक्रोड्रॉइड एक मिनी-एंड्रॉइड ओएस है जो पीवीएम में चलता है। आपको माइक्रोड्रॉइड का उपयोग करने की आवश्यकता नहीं है, आप किसी भी OS के साथ VM प्रारंभ कर सकते हैं। हालाँकि, पीवीएम के लिए प्राथमिक उपयोग के मामले एक स्टैंडअलोन ओएस नहीं चला रहे हैं, बल्कि एंड्रॉइड द्वारा प्रदान की जा सकने वाली मजबूत गोपनीयता और अखंडता गारंटी के साथ ऐप के एक हिस्से को चलाने के लिए एक अलग निष्पादन वातावरण की पेशकश कर रहे हैं।
पारंपरिक ऑपरेटिंग सिस्टम के साथ, मजबूत गोपनीयता और अखंडता प्रदान करने के लिए उचित मात्रा में काम करने की आवश्यकता होती है (अक्सर दोहराया जाता है) क्योंकि पारंपरिक ऑपरेटिंग सिस्टम व्यापक एंड्रॉइड आर्किटेक्चर के साथ फिट नहीं होते हैं। उदाहरण के लिए, मानक एंड्रॉइड आर्किटेक्चर के साथ, डेवलपर्स को पीवीएम में अपने ऐप के हिस्से को सुरक्षित रूप से लोड करने और निष्पादित करने के साधन को लागू करने की आवश्यकता होती है, और पेलोड glibc के विरुद्ध बनाया जाता है। एंड्रॉइड ऐप बायोनिक का उपयोग करता है, संचार के लिए vsock पर एक कस्टम प्रोटोकॉल की आवश्यकता होती है, और adb का उपयोग करके डिबगिंग चुनौतीपूर्ण है।
माइक्रोड्रॉइड एक ऑफ-द-शेल्फ ओएस छवि प्रदान करके इन अंतरालों को भरता है, जिसे डेवलपर्स को अपने ऐप के एक हिस्से को पीवीएम में ऑफलोड करने के लिए कम से कम प्रयास की आवश्यकता होती है। नेटिव कोड बायोनिक के विरुद्ध बनाया गया है, संचार बाइंडर पर होता है, और यह एंड्रॉइड से एपेक्स आयात करने की अनुमति देता है और एंड्रॉइड एपीआई के एक सबसेट को उजागर करता है, जैसे हार्डवेयर-समर्थित कुंजियों के साथ क्रिप्टोग्राफ़िक संचालन के लिए कीस्टोर। कुल मिलाकर, डेवलपर्स को माइक्रोड्रॉइड को उन उपकरणों के साथ एक परिचित वातावरण मिलना चाहिए जिनके वे पूर्ण एंड्रॉइड ओएस में आदी हो गए हैं।
विशेषताएँ
माइक्रोड्रॉइड, पीवीएम के लिए विशिष्ट कुछ अतिरिक्त घटकों के साथ एंड्रॉइड का एक अलग संस्करण है। माइक्रोड्रॉइड समर्थन करता है:
- एनडीके एपीआई का एक उपसमूह (एंड्रॉइड के लिबसी और बायोनिक के कार्यान्वयन के लिए सभी एपीआई प्रदान किए गए हैं)
- डिबगिंग सुविधाएँ, जैसे एडीबी, लॉगकैट, टॉम्बस्टोन और जीडीबी
- सत्यापित बूट और SELinux सक्षम
- एपीके में एम्बेडेड साझा लाइब्रेरी के साथ बाइनरी को लोड करना और निष्पादित करना
- वीएसॉक पर बाइंडर आरपीसी और अंतर्निहित अखंडता जांच के साथ फाइलों का आदान-प्रदान
- एपेक्स की लोडिंग
माइक्रोड्रॉइड समर्थन नहीं करता:
android.\*
पैकेज में Android Java APIसिस्टमसर्वर और जाइगोट
ग्राफ़िक्स/यूआई
एचएएल
माइक्रोड्रॉइड वास्तुकला
माइक्रोड्रॉइड कटलफिश के समान है क्योंकि दोनों का आर्किटेक्चर मानक एंड्रॉइड के समान है। माइक्रोड्रॉइड में एक समग्र डिस्क छवि में एक साथ समूहीकृत निम्नलिखित विभाजन छवियां शामिल हैं:
-
bootloader
- कर्नेल को सत्यापित और प्रारंभ करता है। -
boot.img
- इसमें कर्नेल और इनिट रैमडिस्क शामिल है। -
vendor_boot.img
- इसमें वीएम-विशिष्ट कर्नेल मॉड्यूल शामिल हैं, जैसे कि virtio। -
super.img
- सिस्टम और विक्रेता तार्किक विभाजन से मिलकर बनता है। -
vbmeta.img
- सत्यापित बूट मेटाडेटा शामिल है।
विभाजन छवियां वर्चुअलाइजेशन एपेक्स में शिप की जाती हैं और VirtualizationService
द्वारा एक समग्र डिस्क छवि में पैक की जाती हैं। मुख्य OS कम्पोजिट डिस्क छवि के अलावा, VirtualizationService
इन अन्य विभाजनों को बनाने के लिए जिम्मेदार है:
-
payload
- एंड्रॉइड के एपेक्स और एपीके द्वारा समर्थित विभाजन का एक सेट -
instance
- प्रति-इंस्टेंस सत्यापित बूट डेटा, जैसे प्रति-इंस्टेंस नमक, विश्वसनीय APEX सार्वजनिक कुंजी और रोलबैक काउंटर को बनाए रखने के लिए एक एन्क्रिप्टेड विभाजन
बूट अनुक्रम
माइक्रोड्रॉइड बूट अनुक्रम डिवाइस बूट के बाद होता है। आर्किटेक्चर दस्तावेज़ में डिवाइस बूट पर चर्चा की गई है। चित्र 1 माइक्रोड्रॉइड बूट अनुक्रम के दौरान होने वाले चरणों को दिखाता है:
यहां चरणों का स्पष्टीकरण दिया गया है:
बूटलोडर को crosvm द्वारा मेमोरी में लोड किया जाता है और pvmfw निष्पादित करना शुरू कर देता है। बूटलोडर पर जाने से पहले, pvmfw दो कार्य करता है:
- यह जांचने के लिए बूटलोडर को सत्यापित करता है कि यह किसी विश्वसनीय स्रोत (Google या OEM) से है या नहीं।
- यह सुनिश्चित करता है कि इंस्टेंस इमेज के उपयोग के माध्यम से एक ही बूटलोडर का उपयोग एक ही पीवीएम के कई बूटों में लगातार किया जाता है। विशेष रूप से, पीवीएम को प्रारंभ में एक खाली इंस्टेंस छवि के साथ बूट किया जाता है। pvmfw इंस्टेंस इमेज में बूटलोडर की पहचान को संग्रहीत करता है और इसे एन्क्रिप्ट करता है। इसलिए, अगली बार जब पीवीएम को उसी इंस्टेंस छवि के साथ बूट किया जाता है, तो पीवीएमएफडब्ल्यू इंस्टेंस छवि से सहेजी गई पहचान को डिक्रिप्ट करता है और सत्यापित करता है कि यह वही है जो पहले सहेजा गया था। यदि पहचान भिन्न है, तो pvmfw बूट करने से इंकार कर देता है।
बूटलोडर फिर माइक्रोड्रॉइड को बूट करता है।
बूटलोडर इंस्टेंस डिस्क तक पहुंचता है। pvmfw के समान, बूटलोडर में एक इंस्टेंस डिस्क ड्राइव होती है जिसमें सार्वजनिक कुंजी सहित पिछले बूट के दौरान इस इंस्टेंस में उपयोग की गई विभाजन छवियों के बारे में जानकारी होती है।
बूटलोडर vbmeta और जंजीर विभाजन, जैसे
boot
औरsuper
को सत्यापित करता है, और, यदि सफल होता है, तो अगले चरण के पीवीएम रहस्य प्राप्त करता है। फिर, माइक्रोड्रॉइड नियंत्रण को कर्नेल को सौंप देता है।क्योंकि सुपर विभाजन को बूटलोडर (चरण 3) द्वारा पहले ही सत्यापित किया जा चुका है, कर्नेल बिना शर्त सुपर विभाजन को माउंट करता है। पूर्ण एंड्रॉइड की तरह, सुपर विभाजन में dm-verity पर आरोहित कई तार्किक विभाजन होते हैं। फिर नियंत्रण
init
प्रक्रिया को दिया जाता है, जो विभिन्न मूल सेवाएँ शुरू करता है।init.rc
स्क्रिप्ट पूर्ण एंड्रॉइड के समान है लेकिन माइक्रोड्रॉइड की आवश्यकताओं के अनुरूप है।init
प्रक्रिया माइक्रोड्रॉइड मैनेजर शुरू करती है, जो इंस्टेंस इमेज तक पहुंचती है। माइक्रोड्रॉइड प्रबंधक सेवा पिछले चरण से पारित कुंजी का उपयोग करके छवि को डिक्रिप्ट करती है और क्लाइंट एपीके और एपेक्स की सार्वजनिक कुंजी और रोलबैक काउंटरों को पढ़ती है जिन पर यह पीवीएम भरोसा करता है। इस जानकारी का उपयोग बाद मेंzipfuse
औरapexd
द्वारा किया जाता है जब वे क्रमशः क्लाइंट एपीके और अनुरोधित एपेक्स को माउंट करते हैं।माइक्रोड्रॉइड प्रबंधक सेवा
apexd
प्रारंभ होती है।apexd
एपेक्स को/apex/<name>
निर्देशिकाओं पर माउंट करता है। Android और Microdroid APEX को कैसे माउंट करते हैं, इसके बीच एकमात्र अंतर यह है कि Microdroid में, APEX फ़ाइलें वर्चुअल ब्लॉक डिवाइस (/dev/vdc1
,…) से आ रही हैं, नियमित फ़ाइलों (/system/apex/*.apex
) से नहीं।zipfuse
माइक्रोड्रॉइड का FUSE फ़ाइल सिस्टम है।zipfuse
क्लाइंट एपीके को माउंट करता है, जो मूल रूप से फ़ाइल सिस्टम के रूप में एक ज़िप फ़ाइल है। नीचे, एपीके फ़ाइल को एपेक्स के समान, डीएम-वेरिटी के साथ पीवीएम द्वारा वर्चुअल ब्लॉक डिवाइस के रूप में पास किया जाता है। एपीके में एपेक्स की सूची के साथ एक कॉन्फिग फ़ाइल है जिसे ऐप डेवलपर ने इस पीवीएम इंस्टेंस के लिए अनुरोध किया है। APEXes को सक्रिय करते समयapexd
द्वारा सूची का उपयोग किया जाता है।बूट प्रवाह माइक्रोड्रॉइड प्रबंधक सेवा पर वापस आ जाता है। प्रबंधक सेवा तब बाइंडर आरपीसी का उपयोग करके एंड्रॉइड की
VirtualizationService
के साथ संचार करती है ताकि यह क्रैश या शटडाउन जैसी महत्वपूर्ण घटनाओं की रिपोर्ट कर सके, और पीवीएम को समाप्त करने जैसे अनुरोध स्वीकार कर सके। प्रबंधक सेवा एपीके की कॉन्फ़िगरेशन फ़ाइल से मुख्य बाइनरी का स्थान पढ़ती है और इसे निष्पादित करती है।
फ़ाइल विनिमय (AuthFS)
एंड्रॉइड घटकों के लिए इनपुट, आउटपुट और स्टेट के लिए फ़ाइलों का उपयोग करना और इन्हें एंड्रॉइड कर्नेल द्वारा नियंत्रित एक्सेस के साथ फ़ाइल डिस्क्रिप्टर (एआईडीएल में ParcelFileDescriptor
प्रकार) के रूप में पास करना आम बात है। AuthFS pVM सीमाओं के पार परस्पर अविश्वास वाले समापन बिंदुओं के बीच फ़ाइलों के आदान-प्रदान के लिए समान कार्यक्षमता की सुविधा प्रदान करता है।
मौलिक रूप से, AuthFS एक दूरस्थ फ़ाइल सिस्टम है, जो fs-verity
के समान, व्यक्तिगत एक्सेस ऑपरेशंस पर पारदर्शी अखंडता जांच करता है। चेक फ्रंटएंड, जैसे कि पीवीएम में चलने वाला फ़ाइल-रीडिंग प्रोग्राम, को यह पता लगाने की अनुमति देता है कि अविश्वसनीय बैकएंड, आमतौर पर एंड्रॉइड, ने फ़ाइल सामग्री के साथ छेड़छाड़ की है या नहीं।
फ़ाइलों का आदान-प्रदान करने के लिए, बैकएंड ( fd\_server
) को प्रति-फ़ाइल कॉन्फ़िगरेशन के साथ शुरू किया जाता है, यह निर्दिष्ट करते हुए कि यह इनपुट (केवल पढ़ने के लिए) या आउटपुट (रीड-राइट) के लिए है। इनपुट के लिए, फ्रंटएंड यह लागू करता है कि सामग्री ऑन-एक्सेस सत्यापन के लिए मर्कल ट्री के शीर्ष पर एक ज्ञात हैश से मेल खाती है। आउटपुट के लिए, AuthFS आंतरिक रूप से सामग्री का एक हैश ट्री बनाए रखता है जैसा कि लिखने के संचालन से देखा जाता है और जब डेटा को वापस पढ़ा जाता है तो अखंडता लागू कर सकता है।
अंतर्निहित परिवहन वर्तमान में बाइंडर आरपीसी पर आधारित है, हालांकि प्रदर्शन को अनुकूलित करने के लिए भविष्य में इसमें बदलाव हो सकता है।
महतवपूर्ण प्रबंधन
पीवीएम को एक स्थिर सीलिंग कुंजी प्रदान की जाती है जो संरक्षित लगातार डेटा के लिए उपयुक्त है, और एक सत्यापन कुंजी जो हस्ताक्षर बनाने के लिए उपयुक्त है जो पीवीएम द्वारा सत्यापित रूप से उत्पादित की जाती है।
बाइंडर आरपीसी
एंड्रॉइड के अधिकांश इंटरफेस एआईडीएल में व्यक्त किए गए हैं, जो बाइंडर लिनक्स कर्नेल ड्राइवर के शीर्ष पर बनाया गया है। पीवीएम के बीच इंटरफेस का समर्थन करने के लिए, सॉकेट पर काम करने के लिए बाइंडर प्रोटोकॉल को फिर से लिखा गया है, पीवीएम के मामले में vsock । सॉकेट पर संचालन एंड्रॉइड के मौजूदा एआईडीएल इंटरफेस को इस नए वातावरण में उपयोग करने की अनुमति देता है।
कनेक्शन स्थापित करने के लिए, एक एंडपॉइंट, जैसे कि पीवीएम पेलोड, एक RpcServer
ऑब्जेक्ट बनाता है, एक रूट ऑब्जेक्ट पंजीकृत करता है, और नए कनेक्शन सुनना शुरू करता है। ग्राहक RpcSession
ऑब्जेक्ट का उपयोग करके इस सर्वर से जुड़ सकते हैं, Binder
ऑब्जेक्ट प्राप्त कर सकते हैं, और इसका उपयोग ठीक उसी तरह कर सकते हैं जैसे Binder
ऑब्जेक्ट का उपयोग कर्नेल बाइंडर ड्राइवर के साथ किया जाता है।