वर्चुअल A/B की खास जानकारी

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

  • वर्चुअल A/B अपडेट, A/B की तरह आसान होते हैं. वर्चुअल A/B अपडेट डिवाइस के ऑफ़लाइन और काम न करने के समय को कम करें.
  • वर्चुअल A/B अपडेट को वापस रोल बैक किया जा सकता है. अगर नया ओएस चालू नहीं होता है, तो डिवाइस पिछले वर्शन पर अपने-आप रोल बैक हो जाते हैं.
  • वर्चुअल A/B अपडेट में कम से कम अतिरिक्त जगह का इस्तेमाल होता है. इसके लिए, ऐसे पार्टिशन जिनका इस्तेमाल बूटलोडर करता है. अन्य अपडेट किए जा सकने वाले हिस्से हैं स्नैपशॉट किया गया.

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

इस सेक्शन में शब्दावली के बारे में बताया गया है और उस टेक्नोलॉजी के बारे में बताया गया है जो वर्चुअल A/B.

डिवाइस-मैपर

Device-mapper, Linux वर्चुअल ब्लॉक लेयर है. इसका इस्तेमाल अक्सर Android में किया जाता है. के साथ डाइनैमिक विभाजन, विभाजन जैसे /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 माउंट पॉइंट का.

पहली इमेज में दिखाया गया है कि /system माउंट पॉइंट के नीचे का स्टैक कैसा दिखता है.

नीचे विभाजन स्टैकिंग
सिस्टम

पहला डायग्राम. /system माउंट पॉइंट के नीचे स्टैक करें

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

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

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

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

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

कंप्रेस किए गए स्नैपशॉट

Android 12 और उसके बाद वाले वर्शन में, क्योंकि स्टोरेज की ज़रूरी शर्तें चालू हैं /data वाला हिस्सा बड़ा हो सकता है. ऐसे में, कंप्रेस किए गए स्नैपशॉट को चालू करने पर, बिल्ड, /data पार्टिशन की बढ़ी हुई जगह की ज़रूरतों को पूरा करने के लिए बनाया गया है.

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

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

ये कॉम्पोनेंट, कंप्रेस करने की सुविधा चालू करते हैं. किए गए अन्य आवश्यक परिवर्तन अगले सेक्शन में, कंप्रेस की गई स्नैपशॉट की सुविधाओं के बारे में बताया गया है: कंप्रेस किए गए स्नैपशॉट के लिए CoW फ़ॉर्मैट, dm-user और Snapuserd.

कंप्रेस किए गए स्नैपशॉट के लिए COW फ़ॉर्मैट

Android 12 और उसके बाद वाले वर्शन में, कंप्रेस किए गए स्नैपशॉट में COW फ़ॉर्मैट में होना चाहिए. यह कर्नेल में पहले से मौजूद, बिना कंप्रेस किए गए फ़ॉर्मैट की तरह इस्तेमाल किया जाता है स्नैपशॉट, कंप्रेस किए गए स्नैपशॉट के लिए COW फ़ॉर्मैट में अलग-अलग सेक्शन होते हैं और डेटा की ज़रूरत होती है. ओरिजनल फ़ॉर्मैट के मेटाडेटा में सिर्फ़ बदलने की अनुमति है कार्रवाइयां: बेस इमेज में ब्लॉक X को ब्लॉक Y के कॉन्टेंट से बदलें पर क्लिक करें. कंप्रेस किए गए स्नैपशॉट का COW फ़ॉर्मैट ज़्यादा बेहतर होता है और इन कार्रवाइयों का इस्तेमाल करता है:

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

पूरे ओटीए अपडेट में, सिर्फ़ बदलें और शून्य कार्रवाइयां शामिल होती हैं. वृद्धिशील ओटीए अपडेट में, कॉपी से जुड़ी कार्रवाइयां भी शामिल हो सकती हैं.

Android 12 वाले dm-उपयोगकर्ता

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

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

स्नैपयूज़र

dm-user के लिए snapuserd यूज़रस्पेस कॉम्पोनेंट, वर्चुअल A/B को लागू करता है कंप्रेशन.

वर्चुअल A/B के बिना कंप्रेस किए गए वर्शन में (Android 11 और इससे पहले के वर्शन में या Android 12 में, कंप्रेस किए गए स्नैपशॉट के विकल्प के बिना) COW डिवाइस एक रॉ फ़ाइल है. कंप्रेस करने की सुविधा चालू होने पर, COW फ़ंक्शन इसका इस्तेमाल dm-user डिवाइस के तौर पर करता है, जो snapuserd डीमन.

कर्नेल, नए COW फ़ॉर्मैट का इस्तेमाल नहीं करते हैं. इस तरह, snapuserd कॉम्पोनेंट Android COW फ़ॉर्मैट और कर्नेल के बिल्ट-इन फ़ॉर्मैट:

Android COW फ़ॉर्मैट और कर्नेल के बीच अनुरोधों का अनुवाद करने वाला Snapuserd कॉम्पोनेंट
बिल्ट-इन
फ़ॉर्मैट

तीसरी इमेज. Android और Kernel के बीच अनुवादक के रूप में स्नैपuserd का फ़्लो डायग्राम COW फ़ॉर्मैट

डिस्क पर यह अनुवाद और डिकंप्रेशन कभी नहीं होता. snapuserd कॉम्पोनेंट COW, कर्नेल में होने वाले रीडिंग और राइट को इंटरसेप्ट करता है, और उन्हें Android COW फ़ॉर्मैट का इस्तेमाल करके लागू करता है.

XOR संपीड़न

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

Android 13 और उसके बाद के वर्शन वाले डिवाइसों के लिए, XOR कंप्रेस करने की सुविधा चालू होनी चाहिए. ज़्यादा जानकारी के लिए, XOR देखें कंप्रेस करना.

वर्चुअल A/B कंप्रेशन की प्रोसेस

इस सेक्शन में, वर्चुअल A/B कंप्रेस करने की प्रोसेस के बारे में बताया गया है Android 13 और Android 12.

पढ़ने से जुड़ा मेटाडेटा (Android 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 पाथ का क्रम डायग्राम दिया गया है निर्माण.

सीक्वेंस डायग्राम, मेटाडेटा के लिए IO पाथ
कंस्ट्रक्शन

चौथी इमेज. मेटाडेटा बनाने में इस्तेमाल होने वाला IO पाथ का क्रम फ़्लो

मर्ज करना (Android 12)

बूट प्रोसेस पूरी होने के बाद, अपडेट इंजन, स्लॉट को बूट के तौर पर मार्क कर देता है सफल हो जाता है और dm-snapshot टारगेट को dm-snapshot-merge का टारगेट.

dm-snapshot, मेटाडेटा के बारे में जानकारी देता है और हर डिस्क के लिए एक मर्ज IO शुरू करता है अपवाद. मर्ज IO पाथ की खास जानकारी नीचे दिखाई गई है.

IO पाथ मर्ज करें

पांचवी इमेज. मर्ज IO पाथ की खास जानकारी

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

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

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

वर्चुअल A/B कंप्रेशन प्रोसेस के बारे में नीचे बताया गया है:

  1. यह फ़्रेमवर्क, dm-verity डिवाइस के /system पार्टिशन को माउंट करता है, जिसे dm-user डिवाइस की स्क्रीन पर सबसे ऊपर रखा गया है. इसका मतलब है कि हर I/O रूट फ़ाइल सिस्टम से dm-user पर रूट किया जाता है.
  2. dm-user, I/O को यूज़रस्पेस snapuserd डीमन पर रूट करता है, जो हैंडल करता है I/O अनुरोध
  3. मर्ज की कार्रवाई पूरी होने पर, फ़्रेमवर्क इस तारीख को dm-verity को छोटा कर देता है dm-linear (system_base) के ऊपरी हिस्से में मौजूद होता है. साथ ही, dm-user को हटाता है.

वर्चुअल A/B कंप्रेशन
प्रोसेस

छठी इमेज. वर्चुअल A/B कंप्रेशन प्रोसेस

स्नैपशॉट मर्ज करने की प्रोसेस में रुकावट आ सकती है. अगर डिवाइस को तो मर्ज करने की प्रोसेस फिर से चालू हो जाती है.

ट्रांज़िशन शुरू करें

कंप्रेस किए गए स्नैपशॉट के साथ चालू करते समय, पहले चरण की शुरुआत होनी चाहिए पार्टिशन माउंट करने के लिए 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 का इस्तेमाल करना सुरक्षित है.

स्पेस का इस्तेमाल

नीचे दी गई टेबल में, अलग-अलग ओटीए के लिए जगह के इस्तेमाल की तुलना की गई है ओएस और ओटीए साइज़ का इस्तेमाल करने वाले तरीके.

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

1यह Pixel मैपिंग के आधार पर अनुमानित लेआउट के बारे में बताता है.

2यह माना जाता है कि नई सिस्टम इमेज का साइज़, ओरिजनल इमेज के जैसा ही है.

3डिवाइस के फिर से चालू होने तक, स्पेस की ज़रूरत नहीं रहती.

वर्चुअल A/B को लागू करने या कंप्रेस की गई स्नैपशॉट की सुविधाओं का इस्तेमाल करने के लिए, देखें वर्चुअल A/B को लागू करना