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