تثبيت الأقسام مبكرًا

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

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

إدخالات Fstab

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

  • يشير الحقل first_stage_mount إلى أنّه تم تثبيت قسم. من بداية المرحلة الأولى.
  • تشير السمة 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) في ذاكرة الوصول العشوائي (RAM) وفي vendor قسم القرص.

رامديسك

يعتمد مكان ملف "fstab" في ذاكرة الوصول العشوائي (RAM) على كيفية استخدام الجهاز تستخدم RAMdisk.

يجب وضع علامة 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 أو الإصدارات الأحدث باستخدام يجب أن يستخدم الإصدار 5.10 من النواة (kernel) أو الإصدارات الأحدث الضبط (bootconfig) لاجتياز مَعلمة androidboot.force_normal_boot=1. ضِمن هذه الأجهزة، فإن المرحلة الأولى تقوم فيها بإجراء عملية تحويل الجذر إلى /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 وذلك لأن البداية الأولى تحرر بعد أن ينتهي من التثبيت المبكر للأقسام وينفّذ تبديل عملية الجذر لنقل قاعدة التثبيت في /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 وشجرة الجهاز على سبيل المثال، بدلًا من تحديد الأقسام باستخدام /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 ضمن قائمة Android fs_mgr flags (كما في ملفات fstab).
  • يجب أن تحتوي أقسام A/B على الخيار "slotselect fs_mgr".
  • يجب أن تحتوي الأقسام المفعَّلة باستخدام dm-verity على verify fs_mgr. .

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

يوضّح المثال التالي التثبيت المبكر لشجرة الجهاز في 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

يوضّح المثال التالي التثبيت المبكر لشجرة الجهاز في /vendor. على هاتف Pixel (تذكَّر إضافة slotselect للأقسام الخاضعة إلى أ/ب):

/ {
  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

الإصدار 2.0 من VBoot هو التشغيل المتحقّق منه (AVB) على نظام التشغيل Android. ومتطلبات وقت مبكر أقسام التثبيت باستخدام VBoot 2.0 هي:

  1. يجب أن تستخدم مسارات عُقد الجهاز روابط by-name الرمزيّة في إدخالات fstab وشجرة الجهاز على سبيل المثال، بدلًا من تحديد الأقسام باستخدام /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). لمدة التكوين الكامل، فراجع إنشاء عملية دمج لنظام AVB
  3. يجب ألا تتكرر الإدخالات المقدَّمة من خلال تراكبات شجرة الأجهزة في fstab جزءًا من الملف على سبيل المثال، إذا حددت إدخالاً إلى تثبيت /vendor في شجرة الجهاز، الملف 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";
            };
          };
        };
      };
    };