نظرة عامة على اختبارات A/B الافتراضية

يتضمّن نظام Android آليتين للتحديث: تحديثات A/B (سلسة) وتحديثات غير A/B. لتقليل تعقيد الرمز وتحسين عملية التحديث، في نظام Android 11 تم توحيد آليتين من خلال A/B الافتراضي لتوفير تحديثات سلسة لجميع المستخدمين أجهزة ذات تكلفة تخزين منخفضة. الإصدار 12 من نظام التشغيل Android خيار الضغط باستخدام A/B الافتراضي لضغط الأقسام التي تم الحصول على لقطات شاشة لها في نظامَي التشغيل Android 11 وAndroid 12، سيتم تطبيق ما يلي: ينطبق:

  • تتوفّر تحديثات أ/ب الافتراضية بسلاسة مثل تحديثات أ/ب. إشعارات A/B الافتراضية تقليل الوقت الذي يكون فيه الجهاز غير متصل بالإنترنت وغير قابل للاستخدام.
  • يمكن إرجاع تحديثات أ/ب الافتراضية. فإذا فشل تشغيل نظام التشغيل الجديد، تلقائيًا إلى الإصدار السابق.
  • تستخدم تحديثات A/B الافتراضية حدًا أدنى من المساحة الإضافية من خلال تكرار الأقسام التي يستخدمها برنامج الإقلاع. تشمل الأقسام الأخرى القابلة للتحديث لقطة.

المعلومات الأساسية والمصطلحات

يعرّف هذا القسم المصطلحات ويصف التقنية التي تدعم A/B الافتراضية.

برنامج تحديد الأجهزة

أداة تحديد الأجهزة هي طبقة كتل افتراضية في Linux تُستخدَم كثيرًا في نظام التشغيل Android. مع الأقسام الديناميكية، هي أقسام مثل /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.

تكديس الأقسام تحتها
النظامية

الشكل 1. تكديس ضمن نقطة تثبيت /النظام

لقطة من نوع dm

تعتمد تقنية A/B الافتراضية على "dm-snapshot"، وهي وحدة مصمّمة على الأجهزة لأخذ لقطات جهاز التخزين. عند استخدام dm-snapshot، تتوفر أربعة أجهزة في اللعب:

  • الجهاز الأساسي هو الجهاز الذي تم أخذ لقطة منه. في هذه الصفحة، تستخدم قاعدة أن يكون الجهاز دائمًا قسمًا ديناميكيًا، مثل النظام أو المورد.
  • جهاز النسخ عند الكتابة (COW) لتسجيل التغييرات على الجهاز الأساسي. أُنشأها جون هنتر، الذي كان متخصصًا بأي حجم، لكنها يجب أن تكون كبيرة بما يكفي لاستيعاب جميع التغييرات على للجهاز الأساسي.
  • يتم إنشاء جهاز اللقطة باستخدام الهدف "snapshot". يكتب إلى جهاز لقطة الشاشة إلى جهاز COW. القراءات من اللقطة الجهاز المقروءة إما من الجهاز الأساسي أو جهاز COW، اعتمادًا على ما إذا كانت البيانات التي يتم الوصول إليها قد تغيرت بواسطة اللقطة أم لا.
  • يتم إنشاء جهاز المصدر باستخدام هدف snapshot-origin. يقرأ إلى قراءة جهاز المصدر مباشرةً من الجهاز الأساسي. الكتابة إلى الأصل على الجهاز الأساسي مباشرةً، ولكن يتم الاحتفاظ بنسخة احتياطية من البيانات الأصلية بالكتابة إلى جهاز البقرة.

تعيين الجهاز لـ
لقطة من نوع dm

الشكل 2. ربط الجهاز لميزة dm-snapshot

اللقطات المضغوطة

في نظام التشغيل Android 12 والإصدارات الأحدث، نظرًا لأن متطلبات المساحة على أن يكون قسم /data مرتفعًا، فيمكنك تفعيل لقطات مضغوطة في لتلبية متطلبات المساحة الأعلى لقسم /data.

يتم إنشاء اللقطات الافتراضية المضغوطة من خلال A/B على أساس المكونات التالية التي تتوفّر في نظام التشغيل Android 12 والإصدارات الأحدث:

  • dm-user، وهي وحدة نواة تشبه FUSE تتيح مساحة المستخدم لتطبيق الأجهزة الكتلية.
  • snapuserd، برنامج خفي لمساحة المستخدم لتنفيذ لقطة جديدة .

تعمل هذه المكونات على تمكين الضغط. التغييرات الضرورية الأخرى التي تم إجراؤها على وتنفيذ إمكانات اللقطات المضغوطة الواردة في الأقسام التالية: تنسيق COW للقطات المضغوطة، dm-user وSnapuserd.

تنسيق COW للقطات مضغوطة

في نظام التشغيل Android 12 والإصدارات الأحدث، تستخدم اللقطات المضغوطة تنسيق COW. على غرار تنسيق النواة المدمج والمستخدم في التنسيق غير المضغوط لقطات سريعة، يحتوي تنسيق "بقرة" لللقطات المضغوطة على أقسام بيانات التعريف والبيانات. يُسمح باستبدال البيانات الوصفية للتنسيق الأصلي فقط. العمليات: استبدال القالب X في الصورة الأساسية بمحتويات القالب Y في اللقطة. يعد تنسيق اللقطات المضغوطة COW أكثر تعبيرًا يتيح العمليات التالية:

  • النسخ: يجب استبدال القطعة X في الجهاز الأساسي بالقطعة Y في الجهاز الأساسي.
  • استبدال: يجب استبدال العنصر X في الجهاز الأساسي بالمحتوى. كتلة ص في اللقطة. كل كتلة من هذه الكتل مضغوطة بتنسيق gz.
  • صفر: يجب استبدال العنصر X في الجهاز الأساسي بجميع الأصفار.
  • XOR: يخزِّن جهاز COW وحدات البايت المضغوطة XOR بين الكتلة X و حظر Y (متوفّر في نظام التشغيل Android 13 والإصدارات الأحدث).

تتضمن التحديثات الكاملة للتحديث الهوائي عمليات الاستبدال وصفر فقط. تزايدي يمكن أن تشمل تحديثات "عبر الهواء" أيضًا عمليات نسخ.

dm-user في Android 12

تتيح وحدة النواة لمستخدم dm لـ userspace تنفيذ حظر برنامج تحديد الأجهزة. الأجهزة. يؤدي إدخال جدول مستخدم dm إلى إنشاء جهاز متنوع ضمن /dev/dm-user/<control-name> يمكن لعملية userspace أن تؤدي إلى فحص الجهاز تلقي طلبات القراءة والكتابة من النواة. لكل طلب معلومات مرتبطة مخزن مؤقت لمساحة المستخدم إما لتعبئة (للقراءة) أو نشرها (للكتابة).

توفّر وحدة النواة dm-user واجهة جديدة مرئية للمستخدم للنواة. والذي ليس جزءًا من قاعدة التعليمات البرمجية kernel.org الرئيسية. إلى أن ينتهي الأمر، يحتفظ بالحق في تعديل واجهة dm-user في Android.

ملف تعريف الارتباط

ينفِّذ مكوِّن userspace في snapuserd من أجل dm-user نموذج A/B الافتراضي والضغط عليه.

في الإصدار غير المضغوط من اختبار A/B الافتراضي (إما في الإصدار 11 من نظام التشغيل Android والإصدارات الأقدم أو في Android 12 بدون خيار اللقطة المضغوطة)، جهاز COW هو ملف غير معدَّل. عند تفعيل الضغط، تؤدي دوال "COW" بدلاً من ذلك كجهاز dm-user، وهو متصل بمثيل من البرنامج الخفي "snapuserd"

لا تستخدم النواة تنسيق COW الجديد. وبالتالي، المكوّن snapuserd تترجم الطلبات بين تنسيق Android COW والنواة المضمنة التنسيق:

مكوِّن Snapuserd يترجم الطلبات بين تنسيق Android COW والنواة
مدمج
التنسيق

الشكل 3. مخطط انسيابي لـ Snapuserd كمترجم بين Android وKernel تنسيقات COW

لا تحدث هذه الترجمة وإلغاء الضغط مطلقًا على القرص. snapuserd المكون يعترض قراءة البقرة وكتابتها التي تحدث في النواة، وتنفيذها باستخدام تنسيق Android COW.

ضغط XOR

بالنسبة إلى الأجهزة التي تعمل بنظام التشغيل Android 13 والإصدارات الأحدث، سيتم تطبيق تعمل ميزة ضغط XOR، المفعَّلة تلقائيًا، على تفعيل مساحة المستخدم لقطات لتخزين وحدات بايت XOR المضغوطة بين الكتل القديمة والكتل الجديدة. فعندما يتم تغيير بضع وحدات بايت فقط في كتلة واحدة في تحديث A/B افتراضي، وهو XOR يستخدم نظام التخزين المضغوط مساحة أقل من نظام التخزين التلقائي لأنه لا يتم تخزين اللقطات بحجم 4K بايت بالكامل. يعد هذا التقليل في حجم اللقطة يكون ممكنًا لأن بيانات XOR تحتوي على العديد من الأصفار ويسهل ضغطها من ضغطها الأوّلية حظر البيانات. يعمل ضغط XOR على تقليل حجم اللقطة بنسبة% 25 على أجهزة Pixel 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 للبيانات الوصفية
بناء وتشييد

الشكل 4. تدفق التسلسل لمسار طلب الإدراج في إنشاء البيانات الوصفية

الدمج (نظام التشغيل Android 12)

بعد اكتمال عملية التشغيل، يضع محرك التحديث علامة "تمهيد" على الفتحة ناجح وتبدأ عملية الدمج من خلال تحويل هدف dm-snapshot إلى الهدف dm-snapshot-merge.

يستعرض dm-snapshot البيانات الوصفية ويبدأ عملية إدخال طلب دمج لكل قرص. . في ما يلي نظرة عامة عالية المستوى على مسار إدخال الإدراجات المدمجة.

دمج مسار طلب الإدراج

الشكل 5. نظرة عامة على مسار طلب الإدراج

إذا تمت إعادة تشغيل الجهاز أثناء عملية الدمج، فسيتم استئناف عملية الدمج في وعند إعادة تشغيله، وتكتمل عملية الدمج.

طبقات برنامج تحديد الأجهزة

بالنسبة إلى الأجهزة التي تعمل بنظام التشغيل Android 13 والإصدارات الأحدث، سيتم تطبيق يتم تنفيذ عمليتَي دمج اللقطات ولقطات الشاشة في ضغط A/B الافتراضي. من خلال مكوّن مساحة المستخدم snapuserd. بالنسبة إلى الأجهزة التي تتم ترقيتها إلى Android 13 والإصدارات الأحدث، يجب تفعيل هذه الميزة. بالنسبة ، يُرجى مراجعة Userspace دمجها.

في ما يلي وصف لعملية ضغط A/B الافتراضية:

  1. يتيح إطار العمل تثبيت قسم /system من جهاز dm-verity. المُكدسة فوق جهاز dm-user. وهذا يعني أنّ كل مؤتمر I/O من نظام الملفات الجذر إلى dm-user.
  2. يوجِّه dm-user وحدات الإدخال والإخراج إلى البرنامج الخفي snapuserd لـ userspace الذي يعالج طلب إدخال/إخراج.
  3. عند اكتمال عملية الدمج، يتم تصغير إطار العمل dm-verity على أعلى dm-linear (system_base) وإزالة dm-user.

ضغط A/B الافتراضي
المعالجة

الشكل 6. عملية ضغط A/B الافتراضية

وقد تتم مقاطعة عملية دمج اللقطات. في حال إعادة تشغيل الجهاز خلال عملية الدمج، يتم استئناف عملية الدمج بعد إعادة التشغيل.

بدء الانتقالات

عند بدء التشغيل باستخدام لقطات مضغوطة، يجب أن يبدأ إعداد المرحلة الأولى snapuserd لتثبيت الأقسام. هناك مشكلة: عند تحميل sepolicy وفرضها، يتم وضع snapuserd في سياق غير صحيح، وطلبات القراءة الخاصة به مع عمليات رفض selinux.

لحلّ هذه المشكلة، يتم إجراء عمليات نقل من snapuserd في خطوة القفل باستخدام init على النحو التالي:

  1. المرحلة الأولى من "init" تُطلق snapuserd من الهرم وتمنعها من فتح الباب واصف الملف إليه في متغير بيئة.
  2. تعمل المرحلة الأولى init على تبديل نظام الملفات الجذر إلى قسم النظام، ثم تنفيذ نسخة النظام من init.
  3. تقرأ نسخة النظام من init سياسة sepolicy المدمجة في سلسلة.
  4. يستدعي Init الرمز mlock() على جميع الصفحات المستندة إلى ext4. بعد ذلك، يوقف جميع جداول أدوات تحديد الأجهزة الخاصة بأجهزة لقطات الشاشة، وإيقاف snapuserd. بعد ذلك يٌحظر القراءة من الأقسام، حيث يؤدي ذلك إلى حدوث توقف مؤقت.
  5. استخدام الواصف المفتوح مع نسخة ذاكرة الوصول العشوائي لـ snapuserd، init يعيد تشغيل البرنامج الخفي باستخدام سياق selinux الصحيح. جداول أداة ربط الأجهزة لإعادة تنشيط أجهزة أخذ اللقطات.
  6. يستدعي الأمر munlockall()- من الآمن إجراء IO مرة أخرى.

استخدام المساحة

يقدِّم الجدول التالي مقارنة بين استخدام المساحة لمختلف وكالات السفر على الإنترنت. باستخدام حجمي نظام التشغيل Pixel وOTA.

تأثير الحجم ليس A/B اختبار A/B أ/ب افتراضي أ/ب افتراضي (مضغوط)
الصورة الأصلية الأصلية 4.5 غيغابايت رائعة (صورة 3.8 غيغابايت + 700 مليون محجوز)1 9 غيغابايت رائعة (3.8 غيغابايت + 700 مليون محجوز، لخانتين) 4.5 غيغابايت رائعة (صورة 3.8G + 700 مليون محجوز) 4.5 غيغابايت رائعة (صورة 3.8G + 700 مليون محجوز)
الأقسام الثابتة الأخرى /cache بدون تحديد نمط ما من خصومات بدون تحديد نمط
مساحة تخزين إضافية أثناء التحديث عبر الهواء (يتم إرجاع المساحة بعد تطبيق التحديث عبر الهواء) 1.4 غيغابايت على /data 0 3.8 غيغابايت2 على /data 2.1 غيغابايت2 على /data
إجمالي مساحة التخزين المطلوبة لتطبيق التحديث عبر الهواء 5.9 غيغابايت3 (Super and data) 9 غيغابايت (فائقة) 8.3 غيغابايت3 (Super and data) 6.6 غيغابايت3 (Super and data)

1تشير إلى التنسيق المفترَض استنادًا إلى ربط وحدات البكسل.

2بافتراض أنّ حجم صورة النظام الجديدة بنفس حجم الصورة الأصلية

3تكون متطلبات المساحة مطلوبة بشكل مؤقت حتى تتم إعادة التشغيل.

ولتنفيذ خيار "أ/ب" افتراضي أو لاستخدام إمكانات النبذة المضغوطة، يمكنك الاطّلاع على تنفيذ تجارب A/B الافتراضية