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

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

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

  • वर्चुअल ए/बी अपडेट ए/बी अपडेट की तरह निर्बाध होते हैं। वर्चुअल A/B अपडेट डिवाइस के ऑफ़लाइन और अनुपयोगी होने में लगने वाले समय को कम करते हैं।
  • वर्चुअल 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 विभाजन की उच्च स्थान आवश्यकताओं को पूरा करने के लिए अपने निर्माण में संपीड़ित स्नैपशॉट को सक्षम कर सकते हैं।

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

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

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

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

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

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

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

डीएम-उपयोगकर्ता Android 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 घटक Android गाय प्रारूप और कर्नेल के अंतर्निर्मित प्रारूप के बीच अनुरोधों का अनुवाद करता है:

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

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

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

एक्सओआर संपीड़न

एंड्रॉइड 13 और उच्चतर के साथ लॉन्च होने वाले उपकरणों के लिए, एक्सओआर संपीड़न सुविधा, जो डिफ़ॉल्ट रूप से सक्षम है, पुराने ब्लॉक और नए ब्लॉक के बीच एक्सओआर संपीड़ित बाइट्स को स्टोर करने के लिए यूजरस्पेस स्नैपशॉट को सक्षम करती है। जब किसी ब्लॉक में केवल कुछ बाइट्स को वर्चुअल A/B अपडेट में बदला जाता है, तो XOR कंप्रेशन स्टोरेज स्कीम डिफ़ॉल्ट स्टोरेज स्कीम की तुलना में कम जगह का उपयोग करती है क्योंकि स्नैपशॉट पूर्ण 4K बाइट्स को स्टोर नहीं करते हैं। स्नैपशॉट आकार में यह कमी संभव है क्योंकि एक्सओआर डेटा में कई शून्य होते हैं और कच्चे ब्लॉक डेटा की तुलना में संपीड़ित करना आसान होता है। Pixel डिवाइस पर, XOR कंप्रेशन स्नैपशॉट के आकार को 25% से 40% तक कम कर देता है।

Android 13 और उच्चतर में अपग्रेड करने वाले उपकरणों के लिए, XOR संपीड़न सक्षम होना चाहिए। विवरण के लिए, एक्सओआर संपीड़न देखें।

वर्चुअल ए / बी संपीड़न प्रक्रियाएं

यह खंड Android 13 और Android 12 में उपयोग की जाने वाली वर्चुअल A/B संपीड़न प्रक्रिया के बारे में विवरण प्रदान करता है।

मेटाडेटा पढ़ना (Android 12)

मेटाडेटा का निर्माण snapuserd डेमॉन द्वारा किया जाता है। मेटाडेटा मुख्य रूप से दो आईडी की मैपिंग है, प्रत्येक में 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. मेटाडेटा निर्माण में आईओ पथ के लिए अनुक्रम प्रवाह

विलय (एंड्रॉयड 12)

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

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

Merge IO path

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

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

डिवाइस-मैपर लेयरिंग

एंड्रॉइड 13 और उच्चतर के साथ लॉन्च होने वाले उपकरणों के लिए, वर्चुअल ए / बी संपीड़न में स्नैपशॉट और स्नैपशॉट मर्ज प्रक्रियाएं snapuserd घटक द्वारा की जाती हैं। Android 13 और उच्चतर में अपग्रेड करने वाले उपकरणों के लिए, यह सुविधा सक्षम होनी चाहिए। विवरण के लिए, यूज़रस्पेस मर्ज देखें।

निम्नलिखित वर्चुअल ए/बी संपीड़न प्रक्रिया का वर्णन करता है:

  1. फ्रेमवर्क एक dm-verity डिवाइस के /system विभाजन को माउंट करता है, जो एक dm-user डिवाइस के ऊपर स्टैक्ड होता है। इसका मतलब है कि रूट फाइल सिस्टम से प्रत्येक I/O को dm-user पर रूट किया जाता है।
  2. dm-user I/O को यूजरस्पेस snapuserd डेमॉन पर रूट करता है, जो I/O रिक्वेस्ट को हैंडल करता है।
  3. जब मर्ज ऑपरेशन पूरा हो जाता है, तो फ्रेमवर्क dm-verity verity को dm-linear ( system_base ) के ऊपर ध्वस्त कर देता है और dm-user को हटा देता है।

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

चित्रा 6. वर्चुअल ए / बी संपीड़न प्रक्रिया

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

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

संपीड़ित स्नैपशॉट के साथ बूट करते समय, विभाजन को माउंट करने के लिए पहले चरण के 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 रीबूट होने तक स्थान की आवश्यकता क्षणिक होती है।

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