Bölmeleri Erken Monte Etme

Treble özellikli cihazların, init system ve vendor bölümlerine yayılmış Güvenliği Geliştirilmiş Linux (SELinux) politika parçalarını yükleyebildiğinden emin olmak için birinci aşama montajı etkinleştirmesi gerekir. Bu erişim aynı zamanda çekirdek modüllerinin çekirdek önyüklemesinden sonra mümkün olan en kısa sürede yüklenmesini sağlar.

Erken montajı gerçekleştirmek için Android'in modüllerin bulunduğu dosya sistemlerine erişimi olmalıdır. Android 8.0 ve üzeri /system , /vendor veya /odm montajını init ilk aşamasında (yani SElinux başlatılmadan önce) destekler.

Fstab girişleri

Android 9 ve önceki sürümlerde cihazlar, cihaz ağacı kaplamalarını (DTO'lar) kullanarak erken eklenen bölümler için fstab girişlerini belirtebilir. Android 10 ve üzeri sürümlerde, cihazların ilk aşamadaki ramdisk'te bir fstab dosyası kullanarak erken eklenen bölümler için fstab girişlerini belirtmesi gerekir. Android 10, fstab dosyasında kullanılmak üzere aşağıdaki fs_mgr işaretlerini sunar:

  • first_stage_mount , bir bölümün ilk aşama init tarafından bağlanacağını belirtir.
  • logical bunun dinamik bir bölüm olduğunu gösterir.
  • avb= vbmeta-partition-name vbmeta bölümünü belirtir. İlk aşama init, diğer bölümleri bağlamadan önce bu bölümü başlatır. Girişin vbmeta bölümü önceki satırda başka bir fstab girişi tarafından zaten belirtilmişse, bu işarete ilişkin bağımsız değişken atlanabilir.

Aşağıdaki örnekte system , vendor ve product bölümlerini mantıksal (dinamik) bölümler olarak ayarlamak için fstab girişleri gösterilmektedir.

#<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

Bu örnekte, satıcı vbmeta bölümünü fs_mgr işaretini kullanarak belirtir avb=vbmeta ancak satıcı vbmeta bölümler listesine zaten eklediğinden product vbmeta bağımsız değişkenini atlar.

Android 10 ve üstünü çalıştıran cihazların fstab dosyasını ramdisk'e ve vendor bölümüne yerleştirmesi gerekir.

Ramdisk

Ramdisk'teki fstab dosyasının konumu, aygıtın ramdiski nasıl kullandığına bağlıdır.

Önyükleme ramdiski olan aygıtların fstab dosyasını önyükleme ramdisk köküne yerleştirmesi gerekir. Aygıtta hem önyükleme ramdiski hem de kurtarma ramdiski varsa kurtarma ramdiskinde herhangi bir değişiklik yapılmasına gerek yoktur. Örnek:

PRODUCT_COPY_FILES +=  device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_RAMDISK)/fstab.$(PRODUCT_PLATFORM)

Kurtarmayı bir ramdisk olarak kullanan aygıtların, Android'e önyükleme yapıp yapmamaya veya kurtarmaya önyüklemeye devam etmeye karar vermek için çekirdek komut satırı parametresi androidboot.force_normal_boot=1 kullanması gerekir. Çekirdek sürümü 5.10 veya üzeri olan Android 12 veya üzeri sürümlerle başlatılan cihazların, androidboot.force_normal_boot=1 parametresini iletmek için bootconfig kullanması gerekir. Bu cihazlarda, ilk aşama init, erken bağlama bölümlerini bağlamadan önce /first_stage_ramdisk geçiş kök işlemi yapar, bu nedenle cihazların fstab dosyasını $(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk içine yerleştirmesi gerekir. Örnek:

PRODUCT_COPY_FILES +=  device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk/fstab.$(PRODUCT_PLATFORM)

SATICI

Tüm aygıtların fstab dosyasının bir kopyasını /vendor/etc dizinine yerleştirmesi gerekir. Bunun nedeni, init'in ilk aşamasının, bölümlerin erken montajını tamamladıktan sonra ramdiski serbest bırakması ve montajı /system taşımak için bir anahtar kök / gerçekleştirmesidir. Bu nedenle fstab dosyalarına erişmeyi gerektiren sonraki işlemlerde /vendor/etc içindeki kopya kullanılmalıdır. Örnek:

PRODUCT_COPY_FILES +=  device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.$(PRODUCT_PLATFORM)

Bölümlerin erken montajı, VBoot 1.0

VBoot 1.0 ile bölümlerin erken montajına yönelik gereksinimler şunları içerir:

  1. Cihaz düğümü yolları, fstab ve cihaz ağacı girişlerinde by-name sembolik bağlantılarını kullanmalıdır. Örneğin, bölümleri /dev/block/mmcblk0pX kullanarak belirtmek yerine, bölümlerin adlandırıldığından ve aygıt düğümünün /dev/block/…./by-name/{system,vendor,odm} olduğundan emin olun.
  2. Ürünün cihaz yapılandırmasında (yani, device/ oem / project /device.mk dosyasında) PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION ve CUSTOM_IMAGE_VERITY_BLOCK_DEVICE için verilen yollar, fstab /devicetree'de by-name belirtilen karşılık gelen blok cihaz düğümleriyle eşleşmelidir. girdileri. Örnek:
    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. Cihaz ağacı katmanları aracılığıyla sağlanan girişler, fstab dosya parçalarında tekrarlanmamalıdır. Örneğin, aygıt ağacında mount /vendor için bir giriş belirtirken, fstab dosyası bu girişi tekrarlamamalıdır.
  4. verifyatboot gerektiren bölümler erken kurulmamalıdır (bunun yapılması desteklenmez).
  5. Doğrulanmış bölümler için doğruluk modu/durumu, androidboot.veritymode seçeneği (mevcut gereksinim) kullanılarak kernel_cmdline belirtilmelidir.

Devicetree'nin erken montajı, VBoot 1.0

Android 8.x ve üzeri sürümlerde, init , aygıt ağacını ayrıştırır ve bölümü ilk aşamasında erken monte etmek için fstab girişleri oluşturur. Bir fstab girişi şu formu alır:

src mnt_point type mnt_flags fs_mgr_flags

Devicetree özellikleri bu formatı taklit edecek şekilde tanımlanır:

  • fstab girişleri, cihaz ağacında /firmware/android/fstab altında olmalı ve android,fstab olarak ayarlanmış uyumlu bir dizeye sahip olmalıdır.
  • /firmware/android/fstab altındaki her düğüm, tek bir erken montaj fstab girişi olarak değerlendirilir. Bir düğümün tanımlanmış aşağıdaki özelliklere sahip olması gerekir:
    • dev bölümü by-name temsil eden cihaz düğümünü işaret etmelidir
    • type dosya sistemi türü olmalıdır ( fstab dosyalarında olduğu gibi)
    • mnt_flags bağlama bayraklarının virgülle ayrılmış listesi olmalıdır ( fstab dosyalarında olduğu gibi)
    • fsmgr_flags Android fs_mgr flags listesi olmalıdır ( fstab dosyalarında olduğu gibi)
  • A/B bölümlerinin slotselect fs_mgr seçeneği olmalıdır.
  • dm-verity özellikli bölümlerde verify fs_mgr seçeneğinin olması gerekir.

Örnek: N6P'de /system ve /vendor

Aşağıdaki örnek, Nexus 6P'de system ve vendor bölümleri için Devicetree'nin erken montajını göstermektedir:

/ {
  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";
        };
      };
    };
  };
};

Örnek: Pixel'de /vendor

Aşağıdaki örnek, Pixel'de /vendor için aygıt ağacının erken montajını gösterir (A/B'ye tabi bölümler için slotselect eklemeyi unutmayın):

/ {
  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";
        };
      };
    };
  };
};

Bölümlerin erken montajı, VBoot 2.0

VBoot 2.0, Android Doğrulanmış Önyüklemedir (AVB) . VBoot 2.0 ile bölümlerin erken montajına yönelik gereksinimler şunlardır:

  1. Cihaz düğümü yolları, fstab ve cihaz ağacı girişlerinde by-name sembolik bağlantılarını kullanmalıdır. Örneğin, bölümleri /dev/block/mmcblk0pX kullanarak belirtmek yerine, bölümlerin adlandırıldığından ve aygıt düğümünün /dev/block/…./by-name/{system,vendor,odm} olduğundan emin olun.
  2. VBoot 1.0 için kullanılan derleme sistemi değişkenleri (örneğin PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION ve CUSTOM_IMAGE_VERITY_BLOCK_DEVICE ) VBoot 2.0 için gerekli DEĞİLDİR. Bunun yerine, VBoot 2.0'da tanıtılan derleme değişkenleri ( BOARD_AVB_ENABLE := true dahil) tanımlanmalıdır; Tam yapılandırma için AVB için Sistem Entegrasyonunu Oluşturma konusuna bakın.
  3. Cihaz ağacı katmanları aracılığıyla sağlanan girişler, fstab dosya parçalarında tekrarlanmamalıdır. Örneğin, aygıt ağacında mount /vendor için bir giriş belirtirseniz fstab dosyasının bu girişi tekrarlamaması gerekir.
  4. VBoot 2.0, erken bağlama etkin olsa da olmasa da, verifyatboot desteklemez.
  5. Doğrulanan bölümler için doğruluk modu/durumu, androidboot.veritymode seçeneği (mevcut gereksinim) kullanılarak kernel_cmdline belirtilmelidir. AVB için aşağıdaki düzeltmeleri eklediğinizden emin olun:

Devicetree'nin erken montajı, VBoot 2.0

VBoot 2.0 için aygıt ağacındaki yapılandırma, aşağıdaki istisnalar dışında VBoot 1.0'dakiyle aynıdır:

  • fsmgr_flag verify avb değiştirildi.
  • AVB meta verilerine sahip tüm bölümler, bölüm erken bağlanmasa bile (örneğin, /boot ) aygıt ağacındaki VBMeta girişinde olmalıdır.

Örnek: N5X'te /system ve /vendor

Aşağıdaki örnek, Nexus 5X'teki system ve vendor bölümleri için cihaz ağacının erken montajını göstermektedir. Dikkat:

  • /system AVB ile bağlanır ve /vendor bütünlük doğrulaması olmadan bağlanır.
  • Nexus 5X'te /vbmeta bölümü bulunmadığından üst düzey vbmeta, /boot bölümünün sonunda bulunur (ayrıntılar için AOSP değişiklik listesine bakın).
    / {
      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";
            };
          };
        };
      };
    };
    

Örnek: Pixel'de /vendor

Aşağıdaki örnekte Pixel'de erken montaj /vendor gösterilmektedir. Dikkat:

  • Vbmeta girişinde daha fazla bölüm belirtildi çünkü bu bölümler AVB tarafından korunuyor .
  • Yalnızca /vendor erken monte edilmiş olsa bile tüm AVB bölümleri dahil edilmelidir.
  • A/B'ye tabi bölümler için slotselect eklemeyi unutmayın.
    / {
      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";
            };
          };
        };
      };
    };