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şinvbmeta
bölümü önceki satırda başka birfstab
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:
- Cihaz düğümü yolları,
fstab
ve cihaz ağacı girişlerindeby-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. - Ürünün cihaz yapılandırmasında (yani,
device/ oem / project /device.mk
dosyasında)PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION
veCUSTOM_IMAGE_VERITY_BLOCK_DEVICE
için verilen yollar,fstab
/devicetree'deby-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
- 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. -
verifyatboot
gerektiren bölümler erken kurulmamalıdır (bunun yapılması desteklenmez). - Doğrulanmış bölümler için doğruluk modu/durumu,
androidboot.veritymode
seçeneği (mevcut gereksinim) kullanılarakkernel_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ı veandroid,fstab
olarak ayarlanmış uyumlu bir dizeye sahip olmalıdır. -
/firmware/android/fstab
altındaki her düğüm, tek bir erken montajfstab
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
Androidfs_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:
- Cihaz düğümü yolları,
fstab
ve cihaz ağacı girişlerindeby-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. - VBoot 1.0 için kullanılan derleme sistemi değişkenleri (örneğin
PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION
veCUSTOM_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. - 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ş belirtirsenizfstab
dosyasının bu girişi tekrarlamaması gerekir. - VBoot 2.0, erken bağlama etkin olsa da olmasa da,
verifyatboot
desteklemez. - Doğrulanan bölümler için doğruluk modu/durumu,
androidboot.veritymode
seçeneği (mevcut gereksinim) kullanılarakkernel_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"; }; }; }; }; };