پارتیشن ها را زود نصب کنید

دستگاه‌های دارای 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 عبارتند از:

  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 مشخص شده اند مطابقت داشته باشند. ورودی ها مثال:
    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 تکرار شوند. برای مثال، هنگام تعیین ورودی برای mount /vendor در devicetree، فایل fstab نباید آن ورودی را تکرار کند.
  4. پارتیشن هایی که به verifyatboot نیاز دارند نباید زود نصب شوند (انجام این کار پشتیبانی نمی شود).
  5. حالت/وضعیت اعتبار برای پارتیشن‌های تأیید شده باید در 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 عبارتند از:

  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 برای AVB مراجعه کنید.
  3. ورودی های ارائه شده از طریق همپوشانی درخت دستگاه نباید در قطعات فایل fstab تکرار شوند. برای مثال، اگر یک ورودی برای mount /vendor در devicetree مشخص کنید، فایل fstab نباید آن ورودی را تکرار کند.
  4. VBoot 2.0 از verifyatboot پشتیبانی نمی‌کند، خواه نصب اولیه فعال باشد یا نباشد.
  5. حالت/ویت اعتبار برای پارتیشن‌های تایید شده باید در 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";
            };
          };
        };
      };
    };