يجب أن تقوم الأجهزة التي تدعم تقنية 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 ما يلي:
- يجب أن تستخدم مسارات عقدة الجهاز الارتباطات
by-name
الخاصة بها في إدخالاتfstab
وdevicetree. على سبيل المثال، بدلاً من تحديد الأقسام باستخدام/dev/block/mmcblk0pX
، تأكد من تسمية الأقسام وأن عقدة الجهاز هي/dev/block/…./by-name/{system,vendor,odm}
. - يجب أن تتطابق المسارات المقدمة لـ
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
- يجب ألا تتكرر الإدخالات المقدمة من خلال تراكبات شجرة الجهاز في أجزاء ملف
fstab
. على سبيل المثال، عند تحديد إدخال لتركيب/vendor
في شجرة الأجهزة، يجب ألا يكرر ملفfstab
هذا الإدخال. - يجب عدم تثبيت الأقسام التي تتطلب
verifyatboot
مبكرًا (القيام بذلك غير مدعوم). - يجب تحديد وضع/حالة الحقيقة للأقسام التي تم التحقق منها في
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 هي:
- يجب أن تستخدم مسارات عقدة الجهاز الارتباطات
by-name
الخاصة بها في إدخالاتfstab
وdevicetree. على سبيل المثال، بدلاً من تحديد الأقسام باستخدام/dev/block/mmcblk0pX
، تأكد من تسمية الأقسام وأن عقدة الجهاز هي/dev/block/…./by-name/{system,vendor,odm}
. - إن إنشاء متغيرات النظام (مثل
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 . - يجب ألا تتكرر الإدخالات المقدمة من خلال تراكبات شجرة الجهاز في أجزاء ملف
fstab
. على سبيل المثال، إذا قمت بتحديد إدخال لتركيب/vendor
في Devicetree، فيجب ألا يكرر ملفfstab
هذا الإدخال. - لا يدعم VBoot 2.0
verifyatboot
، سواء تم تمكين التثبيت المبكر أم لا. - يجب تحديد وضع/حالة التحقق للأقسام التي تم التحقق منها في
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"; }; }; }; }; };