تركيب أقسام في وقت مبكر

يجب أن تقوم الأجهزة التي تدعم تقنية Treble بتمكين تثبيت المرحلة الأولى للتأكد من أن init يمكنه تحميل أجزاء سياسة Linux المحسّنة للأمان (SELinux) المنتشرة عبر أقسام system vendor . يتيح هذا الوصول أيضًا تحميل وحدات kernel في أسرع وقت ممكن بعد تمهيد kernel.

لإجراء التثبيت المبكر، يجب أن يتمتع Android بإمكانية الوصول إلى أنظمة الملفات التي توجد عليها الوحدات. يدعم نظام التشغيل Android 8.0 والإصدارات الأحدث التثبيت /system أو /vendor أو /odm في مرحلة مبكرة من init (أي قبل تهيئة SElinux).

إدخالات فستاب

في نظام التشغيل Android 9 والإصدارات الأقدم، يمكن للأجهزة تحديد إدخالات fstab للأقسام التي تم تثبيتها مبكرًا باستخدام تراكبات شجرة الأجهزة (DTOs) . في نظام التشغيل Android 10 والإصدارات الأحدث، يجب على الأجهزة تحديد إدخالات fstab للأقسام التي تم تثبيتها مبكرًا باستخدام ملف fstab في قرص ذاكرة الوصول العشوائي للمرحلة الأولى. يقدم Android 10 علامات fs_mgr التالية لاستخدامها في ملف fstab :

  • يشير first_stage_mount إلى أنه سيتم تثبيت القسم بواسطة المرحلة الأولى من init.
  • يشير logical إلى أن هذا قسم ديناميكي .
  • avb= vbmeta-partition-name يحدد قسم vbmeta . تقوم المرحلة الأولى بتهيئة هذا القسم قبل تثبيت الأقسام الأخرى. يمكن حذف وسيطة هذه العلامة إذا كان قسم vbmeta للإدخال قد تم تحديده بالفعل بواسطة إدخال fstab آخر في السطر السابق.

يوضح المثال التالي إدخالات fstab لتعيين أقسام system vendor product كأقسام منطقية (ديناميكية).

#<dev>  <mnt_point> <type>  <mnt_flags options> <fs_mgr_flags>
system   /system     ext4    ro,barrier=1     wait,slotselect,avb=vbmeta_system,logical,first_stage_mount
vendor   /vendor     ext4    ro,barrier=1     wait,slotselect,avb=vbmeta,logical,first_stage_mount
product  /product    ext4    ro,barrier=1     wait,slotselect,avb,logical,first_stage_mount

في هذا المثال، يحدد البائع قسم vbmeta باستخدام علامة fs_mgr avb=vbmeta ، لكن product يحذف وسيطة vbmeta لأن البائع قام بالفعل بإضافة vbmeta إلى قائمة الأقسام.

يجب على الأجهزة التي تعمل بنظام التشغيل Android 10 والإصدارات الأحدث وضع ملف fstab في قرص الذاكرة وفي قسم vendor .

رامديسك

يعتمد موقع ملف fstab في قرص ذاكرة الوصول العشوائي على كيفية استخدام الجهاز لذاكرة الوصول العشوائي.

يجب على الأجهزة التي تحتوي على قرص تمهيد أن تضع ملف fstab في جذر قرص التمهيد. إذا كان الجهاز يحتوي على قرص التمهيد وقرص الاسترداد، فلن تكون هناك حاجة لإجراء تغييرات على قرص الاسترداد. مثال:

PRODUCT_COPY_FILES +=  device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_RAMDISK)/fstab.$(PRODUCT_PLATFORM)

يجب على الأجهزة التي تستخدم الاسترداد كقرص ذاكرة وصول عشوائي أن تستخدم معلمة سطر أوامر kernel androidboot.force_normal_boot=1 لتحديد ما إذا كان سيتم التمهيد إلى Android أو مواصلة التمهيد في الاسترداد. يجب على الأجهزة التي تعمل بنظام التشغيل Android 12 أو إصدار أحدث بإصدار kernel 5.10 أو إصدار أحدث أن تستخدم bootconfig لتمرير المعلمة androidboot.force_normal_boot=1 . في هذه الأجهزة، تقوم المرحلة الأولى من init بإجراء عملية تبديل الجذر إلى /first_stage_ramdisk قبل تثبيت أقسام التثبيت المبكرة، لذا يجب على الأجهزة وضع ملف fstab في $(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk . مثال:

PRODUCT_COPY_FILES +=  device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk/fstab.$(PRODUCT_PLATFORM)

بائع

يجب على كافة الأجهزة وضع نسخة من ملف fstab في /vendor/etc . وذلك لأن المرحلة الأولى من init تحرر قرص ذاكرة الوصول العشوائي بعد اكتمال التثبيت المبكر للأقسام وتنفيذ عملية تبديل الجذر لتحريك التثبيت في /system إلى / . أي عمليات لاحقة تحتاج إلى الوصول إلى ملفات fstab يجب أن تستخدم النسخة الموجودة في /vendor/etc . مثال:

PRODUCT_COPY_FILES +=  device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.$(PRODUCT_PLATFORM)

تركيب الأقسام مبكرًا، VBoot 1.0

تتضمن متطلبات التثبيت المبكر للأقسام باستخدام VBoot 1.0 ما يلي:

  1. يجب أن تستخدم مسارات عقدة الجهاز الارتباطات by-name الخاصة بها في إدخالات fstab وdevicetree. على سبيل المثال، بدلاً من تحديد الأقسام باستخدام /dev/block/mmcblk0pX ، تأكد من تسمية الأقسام وأن عقدة الجهاز هي /dev/block/…./by-name/{system,vendor,odm} .
  2. يجب أن تتطابق المسارات المقدمة لـ PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION و CUSTOM_IMAGE_VERITY_BLOCK_DEVICE في تكوين الجهاز للمنتج (أي في device/ oem / project /device.mk ) مع عقد جهاز الكتلة المقابلة المحددة by-name في fstab /devicetree إدخالات. مثال:
    PRODUCT_SYSTEM_VERITY_PARTITION := /dev/block/…./by-name/system
    PRODUCT_VENDOR_VERITY_PARTITION := /dev/block/…./by-name/vendor
    CUSTOM_IMAGE_VERITY_BLOCK_DEVICE := /dev/block/…./by-name/odm
    
  3. يجب ألا تتكرر الإدخالات المقدمة من خلال تراكبات شجرة الجهاز في أجزاء ملف fstab . على سبيل المثال، عند تحديد إدخال لتركيب /vendor في شجرة الأجهزة، يجب ألا يكرر ملف fstab هذا الإدخال.
  4. يجب عدم تثبيت الأقسام التي تتطلب verifyatboot مبكرًا (القيام بذلك غير مدعوم).
  5. يجب تحديد وضع/حالة الحقيقة للأقسام التي تم التحقق منها في kernel_cmdline باستخدام خيار androidboot.veritymode (المتطلبات الموجودة).

تركيب شجرة الأجهزة مبكرًا، VBoot 1.0

في Android 8.x والإصدارات الأحدث، يقوم init بتوزيع شجرة الأجهزة وإنشاء إدخالات fstab لتثبيت القسم مبكرًا أثناء مرحلته الأولى. يأخذ إدخال fstab النموذج:

src mnt_point type mnt_flags fs_mgr_flags

يتم تعريف خصائص Devicetree لتقليد هذا التنسيق:

  • يجب أن تكون إدخالات fstab ضمن /firmware/android/fstab في شجرة الأجهزة ويجب أن تحتوي على سلسلة متوافقة مضبوطة على android,fstab .
  • يتم التعامل مع كل عقدة ضمن /firmware/android/fstab على أنها إدخال fstab واحد مبكر. يجب أن تحتوي العقدة على الخصائص التالية المحددة:
    • يجب أن يشير dev إلى عقدة الجهاز التي تمثل القسم by-name
    • يجب أن يكون type هو نوع نظام الملفات (كما في ملفات fstab )
    • يجب أن تكون mnt_flags قائمة مفصولة بفواصل لأعلام التحميل (كما هو الحال في ملفات fstab )
    • يجب أن تكون fsmgr_flags هي قائمة fs_mgr flags (كما هو الحال في ملفات fstab )
  • يجب أن تحتوي أقسام A/B على خيار slotselect fs_mgr .
  • يجب أن تحتوي الأقسام التي تم تمكينها بواسطة dm-verity على خيار verify fs_mgr .

مثال: /system و/vendor على N6P

يوضح المثال التالي التثبيت المبكر لـ Devicetree لأقسام system vendor على Nexus 6P:

/ {
  firmware {
    android {
      compatible = "android,firmware";
      fstab {
        compatible = "android,fstab";
        system {
          compatible = "android,system";
          dev = "/dev/block/platform/soc.0/f9824900.sdhci/by-name/system";
          type = "ext4";
          mnt_flags = "ro,barrier=1,inode_readahead_blks=8";
          fsmgr_flags = "wait,verify";
        };
        vendor {
          compatible = "android,vendor";
          dev = "/dev/block/platform/soc.0/f9824900.sdhci/by-name/vendor";
          type = "ext4";
          mnt_flags = "ro,barrier=1,inode_readahead_blks=8";
          fsmgr_flags = "wait";
        };
      };
    };
  };
};

مثال: /vendor على Pixel

يوضح المثال التالي التثبيت المبكر لـ Devicetree لـ /vendor على Pixel (تذكر إضافة slotselect للأقسام الخاضعة لـ A/B):

/ {
  firmware {
    android {
      compatible = "android,firmware";
      fstab {
        compatible = "android,fstab";
        vendor {
          compatible = "android,vendor";
          dev = "/dev/block/platform/soc/624000.ufshc/by-name/vendor";
          type = "ext4";
          mnt_flags = "ro,barrier=1,discard";
          fsmgr_flags = "wait,slotselect,verify";
        };
      };
    };
  };
};

تركيب الأقسام مبكرًا، VBoot 2.0

VBoot 2.0 هو التمهيد الذي تم التحقق منه لنظام Android (AVB) . متطلبات التثبيت المبكر للأقسام باستخدام VBoot 2.0 هي:

  1. يجب أن تستخدم مسارات عقدة الجهاز الارتباطات by-name الخاصة بها في إدخالات fstab وdevicetree. على سبيل المثال، بدلاً من تحديد الأقسام باستخدام /dev/block/mmcblk0pX ، تأكد من تسمية الأقسام وأن عقدة الجهاز هي /dev/block/…./by-name/{system,vendor,odm} .
  2. إن إنشاء متغيرات النظام (مثل PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION و CUSTOM_IMAGE_VERITY_BLOCK_DEVICE ) المستخدمة لـ VBoot 1.0 ليست مطلوبة لـ VBoot 2.0. بدلاً من ذلك، يجب تعريف متغيرات البناء المقدمة في VBoot 2.0 (بما في ذلك BOARD_AVB_ENABLE := true ) ؛ للحصول على التكوين الكامل، راجع Build System Integration for AVB .
  3. يجب ألا تتكرر الإدخالات المقدمة من خلال تراكبات شجرة الجهاز في أجزاء ملف fstab . على سبيل المثال، إذا قمت بتحديد إدخال لتركيب /vendor في Devicetree، فيجب ألا يكرر ملف fstab هذا الإدخال.
  4. لا يدعم VBoot 2.0 verifyatboot ، سواء تم تمكين التثبيت المبكر أم لا.
  5. يجب تحديد وضع/حالة التحقق للأقسام التي تم التحقق منها في kernel_cmdline باستخدام خيار androidboot.veritymode (المتطلبات الموجودة). تأكد من تضمين الإصلاحات التالية لـ AVB:

تركيب شجرة الأجهزة مبكرًا، VBoot 2.0

التكوين في Devicetree لـ VBoot 2.0 هو نفسه الموجود في VBoot 1.0 ، مع الاستثناءات التالية:

  • تم تحويل fsmgr_flag من verify إلى avb .
  • يجب أن تكون كافة الأقسام التي تحتوي على بيانات تعريف AVB موجودة في إدخال VBMeta في شجرة الأجهزة، حتى عندما لا يتم تثبيت القسم مبكرًا (على سبيل المثال، /boot ).

مثال: /system و/vendor على N5X

يوضح المثال التالي التثبيت المبكر لشجرة الأجهزة لأقسام system vendor على جهاز Nexus 5X. لاحظ أن:

  • تم تثبيت /system مع AVB وتم تثبيت /vendor بدون التحقق من التكامل.
  • نظرًا لأن Nexus 5X لا يحتوي على قسم /vbmeta ، فإن المستوى الأعلى من vbmeta موجود في نهاية القسم /boot (للحصول على التفاصيل، راجع قائمة تغيير AOSP ).
    / {
      firmware {
        android {
          compatible = "android,firmware";
          vbmeta {
            compatible = "android,vbmeta";
            parts = "boot,system,vendor";
          };
          fstab {
            compatible = "android,fstab";
            system {
              compatible = "android,system";
              dev = "/dev/block/platform/soc.0/f9824900.sdhci/by-name/system";
              type = "ext4";
              mnt_flags = "ro,barrier=1,inode_readahead_blks=8";
              fsmgr_flags = "wait,avb";
            };
            vendor {
              compatible = "android,vendor";
              dev = "/dev/block/platform/soc.0/f9824900.sdhci/by-name/vendor";
              type = "ext4";
              mnt_flags = "ro,barrier=1,inode_readahead_blks=8";
              fsmgr_flags = "wait";
            };
          };
        };
      };
    };
    

مثال: /vendor على Pixel

يوضح المثال التالي التركيب /vendor مبكرًا على جهاز Pixel. لاحظ أن:

  • يتم تحديد المزيد من الأقسام في إدخال vbmeta لأن هذه الأقسام محمية بواسطة AVB .
  • يجب تضمين جميع أقسام AVB، حتى لو تم تركيب /vendor فقط مبكرًا.
  • تذكر إضافة slotselect للأقسام الخاضعة لـ A/B.
    / {
      vbmeta {
        compatible = "android,vbmeta";
        parts = "vbmeta,boot,system,vendor,dtbo";
      };
      firmware {
        android {
          compatible = "android,firmware";
          fstab {
            compatible = "android,fstab";
            vendor {
              compatible = "android,vendor";
              dev = "/dev/block/platform/soc/624000.ufshc/by-name/vendor";
              type = "ext4";
              mnt_flags = "ro,barrier=1,discard";
              fsmgr_flags = "wait,slotselect,avb";
            };
          };
        };
      };
    };