دستگاههای دارای Treble باید mount مرحله اول را فعال کنند تا مطمئن شوند که init
میتواند قطعات خطمشی لینوکس تقویتشده با امنیت (SELinux) را که در پارتیشنهای system
و vendor
پخش شدهاند، بارگیری کند. این دسترسی همچنین بارگذاری ماژول های هسته را در اسرع وقت پس از بوت شدن هسته امکان پذیر می کند.
برای انجام نصب اولیه، اندروید باید به سیستم فایلی که ماژول ها در آن قرار دارند دسترسی داشته باشد. اندروید 8.0 و بالاتر از نصب /system
، /vendor
یا /odm
در اولین مرحله init
(یعنی قبل از شروع اولیه SElinux) پشتیبانی میکند.
ورودی های Fstab
در اندروید ۹ و پایینتر، دستگاهها میتوانند ورودیهای fstab
برای پارتیشنهای نصبشده اولیه با استفاده از همپوشانی درخت دستگاه (DTO) مشخص کنند. در اندروید 10 و بالاتر، دستگاهها باید ورودیهای fstab
برای پارتیشنهای نصبشده اولیه با استفاده از یک فایل fstab
در مرحله اول ramdisk مشخص کنند. اندروید 10 پرچمهای fs_mgr
زیر را برای استفاده در فایل fstab
معرفی میکند:
-
first_stage_mount
نشان می دهد که یک پارتیشن توسط مرحله اول init نصب شده است. -
logical
نشان می دهد که این یک پارتیشن پویا است. -
avb= vbmeta-partition-name
پارتیشنvbmeta
را مشخص می کند. مرحله اول init این پارتیشن را قبل از نصب پارتیشن های دیگر مقدار دهی اولیه می کند. اگر پارتیشن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
flag avb=vbmeta
مشخص میکند، اما product
آرگومان vbmeta
را حذف میکند زیرا فروشنده قبلا vbmeta
به لیست پارتیشنها اضافه کرده است.
دستگاههای دارای اندروید 10 و بالاتر باید فایل fstab
را در ramdisk و در پارتیشن vendor
قرار دهند.
رامدیسک
مکان فایل fstab
در ramdisk به نحوه استفاده دستگاه از ramdisk بستگی دارد.
دستگاه های دارای ramdisk بوت باید فایل fstab
را در ریشه ramdisk بوت قرار دهند. اگر دستگاه دارای هر دو ramdisk بوت و ramdisk بازیابی باشد، هیچ تغییری در ramdisk بازیابی لازم نیست. مثال:
PRODUCT_COPY_FILES += device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_RAMDISK)/fstab.$(PRODUCT_PLATFORM)
دستگاه هایی که از بازیابی به عنوان ramdisk استفاده می کنند باید از پارامتر خط فرمان هسته androidboot.force_normal_boot=1
استفاده کنند تا تصمیم بگیرند که آیا در Android بوت شوند یا به بوت شدن در بازیابی ادامه دهند. دستگاههایی که با Android 12 یا بالاتر با هسته نسخه 5.10 یا بالاتر راهاندازی میشوند باید از bootconfig برای عبور پارامتر androidboot.force_normal_boot=1
استفاده کنند. در این دستگاهها، مرحله اول init یک عملیات روت سوئیچ به /first_stage_ramdisk
قبل از نصب پارتیشنهای mount اولیه انجام میدهد، بنابراین دستگاهها باید فایل 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 ramdisk را پس از اتمام نصب اولیه پارتیشن ها آزاد می کند و یک عملیات root سوئیچ برای انتقال mount در /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
مشخص شده اند مطابقت داشته باشند. ورودی ها مثال: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
تکرار شوند. برای مثال، هنگام تعیین ورودی برای mount/vendor
در devicetree، فایلfstab
نباید آن ورودی را تکرار کند. - پارتیشن هایی که به
verifyatboot
نیاز دارند نباید زود نصب شوند (انجام این کار پشتیبانی نمی شود). - حالت/وضعیت اعتبار برای پارتیشنهای تأیید شده باید در
kernel_cmdline
با استفاده از گزینهandroidboot.veritymode
(نیاز موجود) مشخص شود.
Devicetree را زود نصب کنید، VBoot 1.0
در اندروید 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
باید لیست پرچم های mount جدا شده با کاما باشد (مانند فایل هایfstab
) -
fsmgr_flags
باید لیستی از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
مثال زیر، نصب اولیه 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 بوت تایید شده اندروید (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 برای AVB مراجعه کنید. - ورودی های ارائه شده از طریق همپوشانی درخت دستگاه نباید در قطعات فایل
fstab
تکرار شوند. برای مثال، اگر یک ورودی برای mount/vendor
در devicetree مشخص کنید، فایلfstab
نباید آن ورودی را تکرار کند. - VBoot 2.0 از
verifyatboot
پشتیبانی نمیکند، خواه نصب اولیه فعال باشد یا نباشد. - حالت/ویت اعتبار برای پارتیشنهای تایید شده باید در
kernel_cmdline
با استفاده از گزینهandroidboot.veritymode
(نیاز موجود) مشخص شود. مطمئن شوید که اصلاحات زیر را برای AVB لحاظ کنید:
Devicetree را زود نصب کنید، 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
در مراحل اولیه پیکسل نشان می دهد. توجه داشته باشید که:
- پارتیشن های بیشتری در ورودی 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"; }; }; }; }; };