वर्चुअल ए/बी सिंहावलोकन

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

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

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

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

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

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

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

चित्र 1 दिखाता है कि /system माउंट बिंदु के अंतर्गत स्टैक कैसा दिखता है।

Partition stacking underneath system

चित्र 1. /सिस्टम माउंट बिंदु के नीचे स्टैक

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

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

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

Device mapping for dm-snapshot

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

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

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

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

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

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

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

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

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

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

एंड्रॉइड 12 में डीएम-यूजर

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

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

स्नैपसर्ड

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

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

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

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

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

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

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

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

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

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

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

मेटाडेटा पढ़ना (एंड्रॉइड 12)

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

struct disk_exception {
    uint64_t old_chunk;
    uint64_t new_chunk;
};

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

एक snapuserd डेमॉन COW लाइब्रेरी के माध्यम से आंतरिक COW फ़ाइल को पढ़ता है और COW फ़ाइल में मौजूद प्रत्येक COW ऑपरेशन के लिए मेटाडेटा का निर्माण करता है।

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

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

Sequence diagram, IO path for metadata construction

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

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

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

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

Merge IO path

चित्र 5. मर्ज IO पथ अवलोकन

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

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

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

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

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

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

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

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

आरंभिक परिवर्तन

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

1 पिक्सेल मैपिंग के आधार पर कल्पित लेआउट को इंगित करता है।

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

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

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