عمليات الدمج المستقرة لنظام التشغيل Linux

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

يُنصح بتحديث الأجهزة بانتظام باستخدام النواة الأحدث المتوافقة مع فترة زمنية طويلة (LTS). يمكن أن تساعد تحديثات الدعم الطويل الأمد (LTS) في معالجة الثغرات الأمنية المُحتمَلة غير المعروفة، مثل تقرير Project Zero الذي صدر في وقت سابق من عام 2019، قبل الإفصاح العلني عن المحتوى أو اكتشافه من قِبل الجهات الضارّة.

المتطلّبات الأساسية

  • فرع النواة الشائعة لنظام Android (من AOSP)
  • فرع مرحلي لدمج الدعم الطويل الأمد (LTS) لنواة الجهاز المستهدف
  • فرع إصدار النواة للجهاز
  • مستودع Git
  • مجموعة أدوات إنشاء النواة

دمج التغييرات مع التغييرات في قناة الإصدارات الثابتة

دمج التغييرات في قناة الدعم الطويل الأمد (LTS)
الشكل 1: دمج تغييرات قناة الدعم الطويل الأمد

توضِّح الخطوات التالية الخطوات المعتادة لدمج إصدار LTS.

  • إعادة دمج فرع إصدار النواة المستهدفة في فرع مرحلة الدعم الطويل الأمد (LTS)
  • دمج linux-stable أو Android common محليًا في فرع الإصدار التجريبي من الإصدار LTS
  • حلّ تعارضات الدمج (استشِر مالكي المنطقة/الرمز حسب الحاجة)
  • إنشاء التطبيق على الجهاز وإجراء اختبارات الصحة/الوحدات (راجِع قسم الاختبار أدناه)
  • تحميل ودمج تغييرات Android الشائعة في فرع التقسيم المرحلي لقناة الدعم الطويل الأمد (LTS)
  • إجراء اختبار شامل باستخدام فرع التقسيم المرحلي لـ LTS (راجِع قسم الاختبار أدناه)
  • مراجعة نتائج الاختبار
  • معالجة أيّ تراجعات، دمج التحليل الثنائي حسب الحاجة
  • دمج الفرع المؤقت لإصدار LTS في الفرع الرئيسي لإصدار نواة الجهاز
  • إنشاء إصدار جديد من Android لأجهزة Android يتضمّن نواة LTS التجريبية
  • تجميع بنية الإصدار أو ذاكرة التخزين المؤقت باستخدام نواة جديدة

مثال على الدمج مع الإصدار الثابت الطويل

دمج android-4.9 في الفرع main (من خلال مرحلة الطرح لإصدار LTS) واستخدام الفرع العلني لإصدار LTS وفحصه ومزامنته:

repo init -b <Device kernel LTS staging branch>  # init
repo sync
git checkout -b lts <Device kernel LTS staging branch>
git merge <Device kernel release branch>         # back-merge
git commit

في هذه المرحلة، من الأفضل دفع عملية الدمج الخلفي إلى وحدة التحكّم عن بُعد في المصدر قبل مواصلة. بعد ذلك، يمكنك دمج الإصدار العام من Android في قناة الإصدار العلني لنظام التشغيل LTS.

git merge -X patience android-4.9-q            # LTS merge

حلّ تعارضات الدمج

في معظم الحالات، تحدث تعارضات بين نواة Android الشائعة و فرع الإصدار التجريبي من الإصدارات الطويلة المدى (-LTS). يمكن أن يكون حلّ تعارضات الدمج أثناء عمليات دمج الإصدارات الطويلة المدى (LTS) صعبًا، لذا إليك بعض النصائح المفيدة حول معالجتها.

الدمج المتزايد

إذا مرّ وقت طويل منذ تحديث نواة الجهاز باستخدام قناة الدعم الطويل الأمد (LTS)، هناك احتمال كبير أن يكون هناك العديد من الإصدارات الثابتة (أكثر من 50) منذ طرح آخر تحديث مدمج. وأفضل طريقة لمعالجة هذه المشكلة هي اللحاق بالإصدارات الجديدة تدريجيًا من خلال دمج عدد أقل من الإصدارات في كل مرة (5 إصدارات ثانوية كحد أدنى)، مع إجراء الاختبار في كل خطوة من الخطوات.

على سبيل المثال، إذا كان المستوى الفرعي لإصدار النواة للجهاز هو 4.14.100 والمستوى الفرعي الثابت الرئيسي هو 4.14.155، يُفضَّل دمج هذه البيانات بزيادات صغيرة لضمان إمكانية مراجعة كمية التغييرات المعقولة واختبارها.

بشكل عام، تبيّن لنا أنّ العمل بشكل تدريجي في دفعات تضمّ <=5 إصدارات ثانوية لكل عملية دمج يضمن مجموعة من الرقع يمكن إدارتها بسهولة أكبر.

الاختبار

اختبار التشغيل السريع

لإجراء اختبار سريع لبدء التشغيل، عليك أولاً دمج تغييرات LTS على الجهاز ثم إنشاء النواة. توضّح الخطوات التالية عملية اختبار التشغيل السريع.

وصِّل الجهاز المستهدَف بالكمبيوتر باستخدام كابل USB وادفع ملف ‎ .ko إلى الجهاز باستخدام أداة Android Debug Bridge (adb).

adb root
adb disable-verity
adb reboot
(wait for device boot-to-home)
adb root
adb remount
adb push *.ko vendor/lib/modules/
adb reboot bootloader

تشغيل dtbo وتحميل صورة النواة من مصدر غير معروف.

fastboot boot --header-version=2 Image.lz4 (redo again if device rebooted)

راجِع سجلّ ‎ /dev/kmsg بحثًا عن أخطاء.

adb shell
su
cat /dev/kmsg (inspect kernel log for obvious new errors)

اختبارات Android

أولاً، أنشئ صورة -userdebug محليًا باستخدام ملفّ kernel و الوحدات الجديدة التي تتطلّب دعمًا على المدى الطويل.

تحقَّق من /dev/kmsg بحثًا عن أي أخطاء وتأكَّد من عدم توفّرها قبل متابعة الخطوات. اختبِر العناصر التالية للتأكّد من أنّ كل شيء يعمل على النحو المتوقّع.

  • سرعة Wi-Fi
  • متصفح Chrome
  • التقاط الصور والفيديوهات باستخدام تطبيق الكاميرا
  • تشغيل الفيديوهات على YouTube باستخدام مكبّرات صوت مدمجة وسماعة رأس بلوتوث
  • المكالمات عبر شبكة مشغّل شبكة الجوّال
  • مكالمة فيديو عبر شبكة Wi-Fi

حِزم الاختبارات المبرمَجة

يتم تنفيذ عملية التحقّق النهائية للتأكّد من عدم تراجع أداء صورة المنتج باستخدام مجموعات الاختبار المتاحة من خلال مجموعة اختبار المورّد (VTS) واختبار التحمل التلقائي للثبات.