نقطة تفتيش بيانات المستخدمين

يقدّم نظام التشغيل Android 10 ميزة "نقطة التحقّق من بيانات المستخدم" (UDC)، والتي تتيح لنظام Android الرجوع إلى حالته السابقة عند تعذُّر إجراء تحديث عبر الأثير (OTA) لنظام Android. باستخدام ميزة "تحديث الجهاز بدون اتصال بالإنترنت"، إذا تعذّر إجراء تحديث عبر الأثير على جهاز Android، يمكن للجهاز الرجوع بأمان إلى حالته السابقة. على الرغم من أنّ تحديثات A/B تحلّ هذه المشكلة في عملية التشغيل المبكر، لا يتوفّر التراجع عن التحديث عند تعديل قسم بيانات المستخدم (الذي يتم تركيبه على /data).

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

التأثير في المستخدم

تعمل ميزة UDC على تحسين تجربة تحديثات OTA للمستخدمين، إذ يفقد عدد أقل من المستخدمين بياناتهم عند تعذُّر إجراء تحديث OTA. ويمكن أن يؤدي ذلك إلى تقليل عدد مكالمات الدعم التي يتلقّاها فريق الدعم من المستخدمين الذين يواجهون مشاكل أثناء عملية التحديث. ومع ذلك، عند تعذُّر تثبيت تحديث عبر الأثير، قد يلاحظ المستخدمون إعادة تشغيل الجهاز عدة مرات.

آلية العمل

وظيفة نقاط التحقّق في أنظمة الملفات المختلفة

بالنسبة إلى نظام الملفات F2FS، تضيف ميزة UDC وظيفة نقطة التحقّق إلى إصدار 4.20 من نواة Linux المتاحة للجميع، وتتيحها أيضًا في جميع النواة الشائعة المتوافقة مع الأجهزة التي تعمل بالإصدار 10 من نظام التشغيل Android.

بالنسبة إلى أنظمة الملفات الأخرى، تستخدم ميزة "النسخ الاحتياطي السريع" جهازًا افتراضيًا لبرنامج "أداة ربط الأجهزة" يُسمى dm_bow لتوفير وظيفة نقاط التحقّق. يقع dm_bow بين الجهاز ونظام الملفات. عند ربط قسم، يتم إصدار أمر TRIM ما يؤدي إلى إصدار نظام الملفات لأوامر TRIM على جميع الكتل الحرة. تعترض dm_bow عمليات الحذف هذه وتستخدمها لإعداد قائمة حظر مجانية. بعد ذلك، يتم إرسال عمليات القراءة والكتابة إلى الجهاز بدون تعديل، ولكن قبل السماح بعملية الكتابة، يتم الاحتفاظ بنسخة احتياطية من البيانات اللازمة للاستعادة في وحدة تخزين فارغة.

عملية نقطة التفتيش

عند تثبيت قسم يحمل العلامة checkpoint=fs/block، يستدعي نظام التشغيل Android الدالة restoreCheckpoint على محرك الأقراص للسماح للجهاز باستعادة أي نقطة حفظ حالية. تستدعي init الدالة needsCheckpoint لتحديد ما إذا كان الجهاز في حالة A/B الخاصة ببرنامج الإقلاع أو تم ضبط عدد محاولات إعادة التحديث. إذا كان أي منهما صحيحًا، يستدعي Android createCheckpoint إما لإضافة علامات التحميل أو لإنشاء جهاز dm_bow.

بعد تحميل القسم، يتم استدعاء رمز نقطة التحقّق لإصدار عمليات تهذيب. بعد ذلك، تستمر عملية التشغيل كالمعتاد. في LOCKED_BOOT_COMPLETE، يستدعي نظام التشغيل Android الدالة commitCheckpoint لتنفيذ نقطة التحقّق الحالية ويستمر التحديث كالمعتاد.

إدارة مفاتيح KeyMint (المعروفة سابقًا باسم Keymaster)

تُستخدَم مفاتيح KeyMint لتشفير الأجهزة أو لأغراض أخرى. لإدارة هذه المفاتيح، يؤخّر نظام التشغيل Android طلبات حذف المفاتيح إلى أن يتم تنفيذ نقطة التحقّق.

مراقبة الحالة الصحية

تتحقّق خدمة الخلفية الخاصة بالسلامة من توفّر مساحة كافية على القرص لإنشاء نقطة فحص. يقع برنامج الخدمة الصحية في cp_healthDaemon في Checkpoint.cpp.

تتضمّن خدمة الخلفية الخاصة بالسلامة السلوكيات التالية التي يمكن ضبطها:

  • ro.sys.cp_msleeptime: تتحكّم في عدد المرات التي يتحقّق فيها الجهاز من استخدام القرص.
  • ro.sys.cp_min_free_bytes: تتحكّم في الحد الأدنى للقيمة التي يبحث عنها برنامج الصحة الخفي.
  • ro.sys.cp_commit_on_full: تتحكّم هذه السمة في ما إذا كان برنامج التشغيل الصحي يعيد تشغيل الجهاز أو يثبّت نقطة التحقّق ويواصل العمل عندما يكون القرص ممتلئًا.

Checkpoint APIs

تستخدم ميزة "التحكّم في الأجهزة المحدودة الاستخدام" واجهات برمجة تطبيقات نقاط التحقّق. للاطّلاع على واجهات برمجة التطبيقات الأخرى التي تستخدمها "خدمة بيانات المستخدمين"، يُرجى الانتقال إلى IVold.aidl.

void startCheckpoint(int retry)

تنشئ هذه الطريقة نقطة توقّف.

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

لا يتم استدعاء هذه الطريقة عند إجراء تعديل عادي على اختبار أ/ب.

void commitChanges()

يتم تنفيذ التغييرات.

يستدعي إطار العمل هذه الطريقة بعد إعادة التشغيل عندما تكون التغييرات جاهزة للتنفيذ. يتم تنفيذ هذا الإجراء قبل كتابة البيانات (مثل الصور والفيديوهات والرسائل القصيرة وإيصال الاستلام من الخادم) في بيانات المستخدم وقبل BootComplete.

إذا لم يكن هناك تحديث نشط تم حفظ حالته، لن يكون لهذه الطريقة أي تأثير.

abortChanges()

يفرض إعادة التشغيل والرجوع إلى نقطة التحقّق. يتجاهل جميع التعديلات التي تم إجراؤها على بيانات المستخدم منذ إعادة التشغيل الأولى.

يستدعي إطار العمل هذه الطريقة بعد إعادة التشغيل ولكن قبل commitChanges. يتم تقليل قيمة retry_counter عند استدعاء هذه الطريقة. يتم إنشاء إدخالات السجلّ.

bool needsRollback()

تحدِّد هذه السمة ما إذا كان يجب إجراء عملية استرجاع.

في الأجهزة التي لا تتضمّن نقطة فحص، تعرض الدالة القيمة false. على أجهزة نقاط التحقّق، تعرض الدالة true أثناء عملية تشغيل غير مرتبطة بنقطة تحقّق.

تنفيذ UDC

التنفيذ المرجعي

للاطّلاع على مثال حول كيفية تنفيذ UDC، راجِع dm-bow.c. للحصول على مستندات إضافية حول الميزة، راجِع dm-bow.txt.

ضبط إعدادات الميزة

في on fs في ملف init.hardware.rc، تأكَّد من توفّر ما يلي:

mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --early

في on late-fs في ملف init.hardware.rc، تأكَّد من توفّر ما يلي:

mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --late

في ملف fstab.hardware، تأكَّد من وضع علامة /data على أنّه latemount.

/dev/block/bootdevice/by-name/userdata              /data              f2fs
noatime,nosuid,nodev,discard,reserve_root=32768,resgid=1065,fsync_mode=nobarrier
latemount,wait,check,fileencryption=ice,keydirectory=/metadata/vold/metadata_encryption,quota,formattable,sysfs_path=/sys/devices/platform/soc/1d84000.ufshc,reservedsize=128M,checkpoint=fs

إضافة قسم البيانات الوصفية

يتطلّب UDC قسمًا للبيانات الوصفية لتخزين عدد محاولات إعادة التشغيل غير المخصّصة لبرنامج الإقلاع والمفاتيح. اضبط قسم البيانات الوصفية وقم بتثبيته مبكرًا في /metadata.

في ملف fstab.hardware، تأكَّد من وضع علامة /metadata على أنّه earlymount أو first_stage_mount.

/dev/block/by-name/metadata           /metadata           ext4
noatime,nosuid,nodev,discard,sync
wait,formattable,first_stage_mount

اضبط قيمة القسم على أصفار.

أضِف الأسطر التالية إلى BoardConfig.mk:

BOARD_USES_METADATA_PARTITION := true
BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata

تحديث الأنظمة

أنظمة F2FS

بالنسبة إلى الأنظمة التي تستخدم نظام الملفات F2FS لتنسيق البيانات، تأكَّد من أنّ إصدار F2FS الذي تستخدمه يتوافق مع نقاط التحقّق. لمزيد من المعلومات، يُرجى الاطّلاع على وظيفة نقاط التحقّق في أنظمة الملفات المختلفة.

أضِف العلامة checkpoint=fs إلى القسم <fs_mgr_flags> من fstab للجهاز الذي تم تركيبه في /data.

أنظمة غير F2FS

بالنسبة إلى الأنظمة التي لا تستخدم نظام الملفات F2FS، يجب تفعيل dm-bow في إعدادات النواة.

أضِف العلامة checkpoint=block إلى القسم <fs_mgr_flags> من fstab للجهاز الذي تم تركيبه في /data.

مراجعة السجلات

يتم إنشاء إدخالات السجلّ عند طلب بيانات من واجهات برمجة تطبيقات Checkpoint.

التحقُّق

لاختبار تنفيذ UDC، شغِّل VtsKernelCheckpointTest مجموعة اختبارات VTS.