वर्चुअल ए / बी अवलोकन

एंड्रॉइड में दो अपडेट मैकेनिज्म हैं: ए/बी (सीमलेस) अपडेट और नॉन-ए/बी अपडेट। कोड जटिलता को कम करने और अपडेट प्रक्रिया को बढ़ाने के लिए, एंड्रॉइड 11 में दो तंत्र वर्चुअल ए / बी के माध्यम से एकीकृत होते हैं ताकि स्टोरेज की न्यूनतम लागत के साथ सभी डिवाइसों में निर्बाध अपडेट लाया जा सके। एंड्रॉइड 12 स्नैपशॉट किए गए विभाजन को संपीड़ित करने के लिए वर्चुअल ए/बी संपीड़न का विकल्प प्रदान करता है। Android 11 और Android 12 दोनों में, निम्नलिखित लागू होते हैं:

  • वर्चुअल ए/बी अपडेट ए/बी अपडेट की तरह निर्बाध होते हैं। वर्चुअल A/B अपडेट डिवाइस के ऑफ़लाइन और अनुपयोगी होने में लगने वाले समय को कम करते हैं।
  • वर्चुअल ए/बी अपडेट को वापस रोल किया जा सकता है। यदि नया OS बूट करने में विफल रहता है, तो डिवाइस स्वचालित रूप से पिछले संस्करण में वापस आ जाते हैं।
  • वर्चुअल ए/बी अपडेट केवल बूटलोडर द्वारा उपयोग किए जाने वाले विभाजन को डुप्लिकेट करके न्यूनतम अतिरिक्त स्थान का उपयोग करते हैं। अन्य अद्यतन करने योग्य विभाजन स्नैपशॉट हैं।

पृष्ठभूमि और शब्दावली

यह खंड शब्दावली को परिभाषित करता है और वर्चुअल ए/बी का समर्थन करने वाली तकनीक का वर्णन करता है।

डिवाइस-नक्शाकार

डिवाइस-मैपर एक लिनक्स वर्चुअल ब्लॉक लेयर है जिसका उपयोग अक्सर एंड्रॉइड में किया जाता है। गतिशील विभाजन के साथ, /system जैसे विभाजन स्तरित उपकरणों का एक ढेर हैं:

  • स्टैक के निचले भाग में भौतिक सुपर विभाजन है (उदाहरण के लिए, /dev/block/by-name/super )।
  • बीच में एक dm-linear डिवाइस है, जो निर्दिष्ट करता है कि सुपर पार्टीशन में कौन से ब्लॉक दिए गए पार्टीशन को बनाते हैं। यह /dev/block/mapper/system_[a|b] किसी A/B डिवाइस पर, या /dev/block/mapper/system गैर-A/B डिवाइस पर दिखाई देता है।
  • सबसे ऊपर एक dm-verity युक्ति है, जिसे सत्यापित विभाजन के लिए बनाया गया है। यह डिवाइस सत्यापित करता है कि dm-linear डिवाइस पर ब्लॉक सही ढंग से हस्ताक्षरित हैं। यह /dev/block/mapper/system-verity रूप में प्रकट होता है और /system आरोह बिंदु का स्रोत है।

चित्र 1 दिखाता है कि /system आरोह बिंदु के तहत स्टैक कैसा दिखता है।

Partition stacking underneath system

चित्र 1. /system आरोह बिंदु के तहत ढेर

डीएम-स्नैपशॉट

वर्चुअल ए/बी स्टोरेज डिवाइस की स्थिति को स्नैपशॉट करने के लिए dm-snapshot , डिवाइस-मैपर मॉड्यूल पर निर्भर करता है। dm-snapshot का उपयोग करते समय, चार डिवाइस चलन में हैं:

  • आधार डिवाइस वह डिवाइस है जिसे स्नैपशॉट किया गया है। इस पृष्ठ पर, आधार युक्ति हमेशा एक गतिशील विभाजन होता है, जैसे कि सिस्टम या विक्रेता।
  • कॉपी-ऑन-राइट (गाय) डिवाइस, आधार डिवाइस में परिवर्तन लॉगिंग के लिए। यह किसी भी आकार का हो सकता है, लेकिन आधार डिवाइस में सभी परिवर्तनों को समायोजित करने के लिए यह काफी बड़ा होना चाहिए।
  • स्नैपशॉट डिवाइस को snapshot लक्ष्य का उपयोग करके बनाया गया है। स्नैपशॉट डिवाइस को लिखता है गाय डिवाइस को लिखा जाता है। स्नैपशॉट डिवाइस से पढ़ता है या तो बेस डिवाइस या गाय डिवाइस से पढ़ा जाता है, इस पर निर्भर करता है कि एक्सेस किए जा रहे डेटा को स्नैपशॉट द्वारा बदल दिया गया है या नहीं।
  • मूल उपकरण snapshot-origin लक्ष्य का उपयोग करके बनाया गया है। मूल डिवाइस को सीधे आधार डिवाइस से पढ़ता है। मूल डिवाइस को लिखता है सीधे बेस डिवाइस पर लिखता है, लेकिन मूल डेटा का बैकअप गाय डिवाइस को लिखकर दिया जाता है।

Device mapping for dm-snapshot

चित्र 2. डीएम-स्नैपशॉट के लिए डिवाइस मैपिंग

संपीडित स्नैपशॉट

एंड्रॉइड 12 में, क्योंकि /data विभाजन पर स्थान की आवश्यकताएं अधिक हो सकती हैं, आप /data विभाजन की उच्च स्थान आवश्यकताओं को पूरा करने के लिए अपने निर्माण में संपीड़ित स्नैपशॉट को सक्षम कर सकते हैं।

वर्चुअल ए/बी संपीड़ित स्नैपशॉट दो नए घटकों के शीर्ष पर बनाए गए हैं जो Android 12 में उपलब्ध हैं:

  • dm-user , FUSE के समान एक कर्नेल मॉड्यूल जो उपयोक्ता स्थान को ब्लॉक उपकरणों को लागू करने की अनुमति देता है।
  • snapuserd , एक नया स्नैपशॉट प्रारूप को लागू करने के लिए एक यूजरस्पेस डेमॉन।

ये घटक संपीड़न को सक्षम करते हैं। संपीड़ित स्नैपशॉट क्षमताओं को लागू करने के लिए किए गए अन्य आवश्यक परिवर्तन अगले अनुभागों में दिए गए हैं: संपीड़ित स्नैपशॉट के लिए गाय प्रारूप , dm-user , और Snapuserd

संकुचित स्नैपशॉट के लिए गाय प्रारूप

Android 12 में, संपीड़ित स्नैपशॉट एक नए COW स्वरूप का उपयोग करते हैं। असंपीड़ित स्नैपशॉट के लिए उपयोग किए जाने वाले कर्नेल के अंतर्निर्मित स्वरूप के समान, संपीड़ित स्नैपशॉट के लिए गाय प्रारूप में मेटाडेटा और डेटा के वैकल्पिक अनुभाग होते हैं। मूल प्रारूप के मेटाडेटा को केवल "प्रतिस्थापन" संचालन के लिए अनुमति दी गई है: स्नैपशॉट में ब्लॉक वाई की सामग्री के साथ मूल छवि में ब्लॉक एक्स को बदलें। संकुचित स्नैपशॉट गाय प्रारूप अधिक अभिव्यंजक है और तीन कार्यों का समर्थन करता है:

  • कॉपी - बेस डिवाइस में ब्लॉक X को बेस डिवाइस में ब्लॉक Y से बदला जाना चाहिए।
  • बदलें - आधार डिवाइस में ब्लॉक X को स्नैपशॉट में ब्लॉक Y की सामग्री से बदला जाना चाहिए। इनमें से प्रत्येक ब्लॉक gz संपीड़ित है।
  • जीरो - बेस डिवाइस में ब्लॉक एक्स को सभी जीरो से बदल दिया जाना चाहिए।

पूर्ण ओटीए अपडेट में केवल प्रतिस्थापन और शून्य संचालन शामिल हैं। इंक्रीमेंटल ओटीए अपडेट में कॉपी ऑपरेशन भी हो सकते हैं।

एंड्रॉइड 12 . में डीएम-उपयोगकर्ता

डीएम-यूजर कर्नेल मॉड्यूल userspace को डिवाइस-मैपर ब्लॉक डिवाइसेस को लागू करने में सक्षम बनाता है। एक dm-user तालिका प्रविष्टि /dev/dm-user/<control-name> के अंतर्गत एक विविध उपकरण बनाती है। एक userspace प्रक्रिया कर्नेल से पढ़ने और लिखने के अनुरोध प्राप्त करने के लिए डिवाइस को पोल कर सकती है। प्रत्येक अनुरोध में यूजरस्पेस के लिए एक संबद्ध बफर होता है जो या तो पॉप्युलेट (पढ़ने के लिए) या प्रचारित (एक लिखने के लिए) करता है।

dm-user कर्नेल मॉड्यूल कर्नेल को एक नया उपयोगकर्ता-दृश्यमान इंटरफ़ेस प्रदान करता है जो upstream kernel.org कोड बेस का हिस्सा नहीं है। ऐसा होने तक, Google Android में dm-user इंटरफ़ेस को संशोधित करने का अधिकार सुरक्षित रखता है।

स्नैपसरड

dm-user के लिए snapuserd यूजरस्पेस घटक वर्चुअल ए/बी संपीड़न लागू करता है।

वर्चुअल ए/बी के असम्पीडित संस्करण में, (या तो एंड्रॉइड 11 और उससे कम में, या एंड्रॉइड 12 में बिना कंप्रेस्ड स्नैपशॉट विकल्प के), गाय डिवाइस एक कच्ची फ़ाइल है। जब संपीड़न सक्षम किया जाता है, तो गाय एक dm-user डिवाइस के रूप में कार्य करती है, जो snapuserd डेमॉन के एक उदाहरण से जुड़ा होता है।

कर्नेल नए गाय प्रारूप का उपयोग नहीं करता है। तो snapuserd घटक एंड्रॉइड गाय प्रारूप और कर्नेल के अंतर्निर्मित प्रारूप के बीच अनुरोधों का अनुवाद करता है:

Snapuserd component translating requests between Android COW format and kernel built-in format

चित्र 3. एंड्रॉइड और कर्नेल गाय प्रारूपों के बीच अनुवादक के रूप में स्नैपसर्ड का प्रवाह आरेख

यह अनुवाद और डीकंप्रेसन डिस्क पर कभी नहीं होता है। snapuserd घटक गाय को पढ़ता और लिखता है जो कर्नेल में होता है, और एंड्रॉइड गाय प्रारूप का उपयोग करके उन्हें लागू करता है।

आभासी ए/बी संपीड़न प्रक्रियाएं

ये खंड वर्चुअल ए/बी संपीड़न में उपयोग की जाने वाली प्रक्रियाओं के बारे में विवरण प्रदान करते हैं: मेटाडेटा पढ़ना, विलय करना, और इनिट ट्रांज़िशन आयोजित करना।

मेटाडेटा पढ़ना

मेटाडेटा का निर्माण snapuserd डेमॉन द्वारा किया जाता है। मेटाडेटा मुख्य रूप से 2 आईडी की मैपिंग है, प्रत्येक में 8 बाइट्स हैं, जो विलय किए जाने वाले क्षेत्रों का प्रतिनिधित्व करते हैं। dm-snapshot में इसे disk_exception कहा जाता है।

struct disk_exception {
    uint64_t old_chunk;
    uint64_t new_chunk;
};

डिस्क अपवाद का उपयोग तब किया जाता है जब डेटा का एक पुराना हिस्सा एक नए से बदल दिया जाता है।

Snapuserd डेमॉन गाय पुस्तकालय के माध्यम से आंतरिक गाय फ़ाइल को पढ़ता है और गाय फ़ाइल में मौजूद प्रत्येक गाय के संचालन के लिए मेटाडेटा का निर्माण करता है।

जब डीएम- dm- snapshot डिवाइस बनाया जाता है तो मेटाडेटा रीड कर्नेल में dm-snapshot से शुरू किया जाता है।

नीचे दिया गया आंकड़ा मेटाडेटा निर्माण के लिए IO पथ के लिए एक अनुक्रम आरेख प्रदान करता है।

Sequence diagram, IO path for metadata construction

चित्रा 4. मेटाडेटा निर्माण में आईओ पथ के लिए अनुक्रम प्रवाह

विलय

एक बार बूट प्रक्रिया पूरी हो जाने के बाद, अद्यतन इंजन स्लॉट को बूट सफल के रूप में चिह्नित करता है और dm-snapshot लक्ष्य को dm-snapshot-merge लक्ष्य पर स्विच करके मर्ज शुरू करता है।

dm-snapshot मेटाडेटा के माध्यम से चलता है और प्रत्येक डिस्क अपवाद के लिए मर्ज IO आरंभ करता है। मर्ज IO पथ का एक उच्च-स्तरीय अवलोकन नीचे दिखाया गया है।

Merge IO path

चित्रा 5. आईओ पथ सिंहावलोकन मर्ज करें

यदि मर्ज प्रक्रिया के दौरान डिवाइस को रीबूट किया जाता है, तो मर्ज अगले रीबूट पर फिर से शुरू हो जाता है, और मर्ज पूरा हो जाता है।

इनिट ट्रांज़िशन

संपीड़ित स्नैपशॉट के साथ बूट करते समय, विभाजन को माउंट करने के लिए पहले चरण के init को snapuserd शुरू करना चाहिए। यह एक समस्या उत्पन्न करता है: जब sepolicy को लोड और लागू किया जाता है, snapuserd को गलत संदर्भ में डाल दिया जाता है, और इसके पढ़ने के अनुरोध विफल हो जाते हैं, सेलिनक्स इनकार के साथ।

इसे संबोधित करने के लिए, snapuserd init साथ लॉक-स्टेप में संक्रमण करता है, जो निम्नानुसार है:

  1. प्रथम-चरण init रैमडिस्क से snapuserd लॉन्च करता है, और एक पर्यावरण चर में एक खुली फ़ाइल-डिस्क्रिप्टर को इसमें सहेजता है।
  2. प्रथम-चरण init रूट फाइल सिस्टम को सिस्टम विभाजन में स्विच करता है, फिर init की सिस्टम कॉपी निष्पादित करता है।
  3. init की सिस्टम कॉपी संयुक्त सेपॉलिसी को एक स्ट्रिंग में पढ़ती है।
  4. Init सभी ext4-समर्थित पृष्ठों पर mlock() को आमंत्रित करता है। इसके बाद यह स्नैपशॉट डिवाइस के लिए सभी डिवाइस-मैपर टेबल को निष्क्रिय कर देता है, और snapuserd को रोक देता है। इसके बाद पार्टिशन से पढ़ना मना है, क्योंकि ऐसा करने से गतिरोध पैदा होता है।
  5. snapuserd की रैमडिस्क कॉपी के लिए ओपन डिस्क्रिप्टर का उपयोग करते हुए, init डेमॉन को सही सेलिनक्स संदर्भ के साथ फिर से लॉन्च करता है। स्नैपशॉट डिवाइस के लिए डिवाइस-मैपर टेबल को फिर से सक्रिय किया जाता है।
  6. Init munlockall() को आमंत्रित करता है - IO को फिर से करना सुरक्षित है।

अंतरिक्ष उपयोग

निम्न तालिका पिक्सेल के OS और OTA आकारों का उपयोग करते हुए विभिन्न OTA तंत्रों के लिए स्थान उपयोग की तुलना प्रदान करती है।

आकार प्रभाव गैर-ए/बी ए/बी आभासी ए/बी वर्चुअल ए/बी (संपीड़ित)
मूल फैक्टरी छवि 4.5GB सुपर (3.8G इमेज + 700M आरक्षित) 1 9GB सुपर (3.8G + 700M आरक्षित, दो स्लॉट के लिए) 4.5GB सुपर (3.8G इमेज + 700M आरक्षित) 4.5GB सुपर (3.8G इमेज + 700M आरक्षित)
अन्य स्थिर विभाजन /कैश कोई भी नहीं कोई भी नहीं कोई भी नहीं
ओटीए के दौरान अतिरिक्त भंडारण (ओटीए लागू करने के बाद लौटाया गया स्थान) 1.4GB ऑन /डेटा 0 3.8GB 2 ऑन /डेटा 2.1GB 2 ऑन /डेटा
OTA लागू करने के लिए आवश्यक कुल संग्रहण 5.9GB 3 (सुपर और डेटा) 9GB (सुपर) 8.3GB 3 (सुपर और डेटा) 6.6GB 3 (सुपर और डेटा)

1 पिक्सेल मैपिंग के आधार पर अनुमानित लेआउट को दर्शाता है।

2 मान लें कि नई सिस्टम छवि मूल आकार के समान है।

3 रीबूट होने तक स्थान की आवश्यकता क्षणिक होती है।

वर्चुअल ए/बी को लागू करने के लिए, या संपीड़ित स्नैपशॉट क्षमताओं का उपयोग करने के लिए, वर्चुअल ए/बी लागू करना देखें