Android 10'da, kök dosya sistemi artık ramdisk.img
dosyasına dahil edilmemektedir ve bunun yerine system.img
dosyasıyla birleştirilmiştir (yani system.img
her zaman BOARD_BUILD_SYSTEM_ROOT_IMAGE
ayarlanmış gibi oluşturulur). Android 10 ile başlatılan cihazlar:
- Kök olarak sistem bölümü düzeni kullanın (davranışı değiştirme seçeneği olmadan yapı tarafından otomatik olarak uygulanır).
- Dm-linear için gerekli olan bir ramdisk kullanılmalıdır.
-
BOARD_BUILD_SYSTEM_ROOT_IMAGE
false
olarak ayarlamanız gerekir. Bu ayar yalnızca ramdisk kullanan aygıtlar ile ramdisk kullanmayan aygıtlar arasında ayrım yapmak için kullanılır (ve bunun yerine doğrudansystem.img
bağlar).
Kök olarak sistem yapılandırmasının anlamı Android 9 ve Android 10 arasında farklılık gösterir. Android 9 kök olarak sistem yapılandırmasında, BOARD_BUILD_SYSTEM_ROOT_IMAGE
true
olarak ayarlanır ve bu, yapıyı kök dosya sistemini system.img
ile birleştirmeye zorlar. system.img
dosyasını kök dosya sistemi (rootfs) olarak bağlayın. Bu yapılandırma, Android 9 ile başlatılan cihazlar için zorunludur ancak Android 9'a yükseltilen cihazlar ve Android'in daha düşük sürümlerini çalıştıran cihazlar için isteğe bağlıdır . Android 10'un kök sistem yapılandırmasında, yapı her zaman $TARGET_SYSTEM_OUT
ve $TARGET_ROOT_OUT
ile system.img
birleştirir; bu yapılandırma, Android 10 çalıştıran tüm cihazlar için varsayılan davranıştır.
Android 10, kablosuz (OTA) güncellemelerin bölümler oluşturmasına, yeniden boyutlandırmasına veya yok etmesine olanak tanıyan bir kullanıcı alanı bölümleme sistemi olan dinamik bölümleri desteklemek için daha fazla değişiklik yapar. Bu değişikliğin bir parçası olarak, Linux çekirdeği artık mantıksal sistem bölümünü Android 10 çalıştıran cihazlara bağlayamayacak, dolayısıyla bu işlem ilk aşama init tarafından gerçekleştirilir.
Aşağıdaki bölümlerde yalnızca sistem OTA'ları için kök olarak sistem gereksinimleri açıklanmakta ve aygıtların kök olarak sistemi kullanacak şekilde güncellenmesine ilişkin rehberlik sağlanmaktadır (bölüm düzeni değişiklikleri ve dm-verity çekirdek gereksinimleri dahil). Ramdisk'te yapılan değişikliklerle ilgili ayrıntılar için bkz. Ramdisk Bölümleri .
Yalnızca sisteme yönelik OTA'lar hakkında
Android sürümlerinin diğer bölümleri değiştirmeden system.img
product.img
dosyalarını güncellemesini sağlayan yalnızca sistem OTA'ları, kök olarak sistem bölümü düzeni gerektirir. Android 10 çalıştıran tüm cihazların, yalnızca sisteme yönelik OTA'ları etkinleştirmek için kök olarak sistem bölümü düzeni kullanması gerekir.
-
system
bölümünü rootf olarak bağlayan A/B cihazları zaten root olarak sistemi kullanır ve sistem OTA'larını desteklemek için değişiklik gerektirmez. -
system
bölümünü/system
konumuna bağlayan A/B olmayan aygıtların, sistem OTA'larını desteklemek için kök olarak sistem bölümü düzenini kullanacak şekilde güncellenmesi gerekir.
A/B ve A/B olmayan cihazlarla ilgili ayrıntılar için A/B (Sorunsuz) Sistem Güncellemeleri bölümüne bakın.
Satıcı yer paylaşımını kullanma
Satıcı katmanı, cihazın önyükleme sırasında vendor
bölümündeki değişiklikleri katmanlamanıza olanak tanır. Satıcı katmanı, product
bölümündeki, cihaz önyüklendiğinde, mevcut modülleri değiştirdiğinde ve onlara ekleme yaptığında vendor
bölümü üzerine bindirilen bir dizi satıcı modülüdür.
Cihaz önyüklendiğinde, init
işlemi ilk aşamadaki montajı tamamlar ve varsayılan özellikleri okur. Daha sonra /product/vendor_overlay/<target_vendor_version>
öğesini arar ve aşağıdaki koşullar yerine getirilirse her alt dizini ilgili vendor
bölümü dizinine bağlar:
-
/vendor/<overlay_dir>
mevcut. -
/product/vendor_overlay/<target_vendor_version>/<overlay_dir>
/vendor/<overlay_dir>
ile aynı dosya bağlamına sahiptir. -
init
/vendor/<overlay_dir>
dosya bağlamına bağlanmasına izin verilir.
Satıcı yer paylaşımının uygulanması
Satıcı yer paylaşımı dosyalarını /product/vendor_overlay/<target_vendor_version>
dizinine yükleyin. Bu dosyalar, cihaz önyüklendiğinde vendor
bölümünün üzerine yerleşir, aynı addaki dosyaları değiştirir ve yeni dosyalar ekler. Satıcı katmanı, dosyaları vendor
bölümünden kaldıramaz.
Satıcı yer paylaşımı dosyaları, vendor
bölümünde değiştirdikleri hedef dosyalarla aynı dosya bağlamına sahip olmalıdır. Varsayılan olarak, /product/vendor_overlay/<target_vendor_version>
dizinindeki dosyalar, vendor_file
bağlamına sahiptir. Satıcı yer paylaşımı dosyaları ile değiştirdikleri dosyalar arasında dosya bağlamı uyumsuzlukları varsa bunu cihaza özel hizmet politikasında belirtin. Dosya içeriği dizin düzeyinde ayarlanır. Bir satıcı yer paylaşımı dizininin dosya içeriği hedef dizinle eşleşmiyorsa ve cihaza özel sepolitikte doğru dosya içeriği belirtilmemişse, bu satıcı yer paylaşımı dizini hedef dizine yerleştirilmez.
Satıcı kaplamasını kullanmak için çekirdeğin CONFIG_OVERLAY_FS=y
ayarını yaparak OverlayFS'yi etkinleştirmesi gerekir. Ayrıca, çekirdeğin ortak çekirdek 4.4 veya üzeri ile birleştirilmesi veya "overlayfs: override_creds=off option bypass creator_cred"
ile yamanması gerekir.
Satıcı yer paylaşımı uygulama örneği
Bu prosedür, /vendor/lib/*
, /vendor/etc/*
ve /vendor/app/*
dizinlerini kaplayan bir satıcı katmanının uygulanmasını gösterir.
device/<vendor>/<target>/vendor_overlay/<target_vendor_version>/
dizinine önceden oluşturulmuş satıcı dosyalarını ekleyin:device/google/device/vendor_overlay/28/lib/libfoo.so device/google/device/vendor_overlay/28/lib/libbar.so device/google/device/vendor_overlay/28/etc/baz.xml device/google/device/vendor_overlay/28/app/qux.apk
Önceden oluşturulmuş satıcı dosyalarını
device/google/device/device.mk
içindekiproduct/vendor_overlay
yükleyin:PRODUCT_COPY_FILES += \ $(call find-copy-subdir-files,*,device/google/device/vendor_overlay,$(TARGET_COPY_OUT_PRODUCT)/vendor_overlay)
Hedef
vendor
bölüm dosyalarınınvendor_file
dışında bağlamları varsa dosya bağlamlarını tanımlayın./vendor/lib/*
vendor_file
bağlamını kullandığından bu örnek o dizini içermez.device/google/device-sepolicy/private/file_contexts
dosyasına aşağıdakini ekleyin:/(product|system/product)/vendor_overlay/[0-9]+/etc(/.*)? u:object_r:vendor_configs_file:s0 /(product|system/product)/vendor_overlay/[0-9]+/app(/.*)? u:object_r:vendor_app_file:s0
init
işleminin satıcı kaplamasınıvendor_file
dışındaki dosya bağlamlarına bağlamasına izin verin.init
işlemininvendor_file
bağlamına bağlama izni zaten olduğundan, bu örnek,vendor_file
ilkesini tanımlamaz.device/google/device-sepolicy/public/init.te
dosyasına aşağıdakini ekleyin:allow init vendor_configs_file:dir mounton; allow init vendor_app_file:dir mounton;
Satıcı katmanını doğrulama
Satıcı katmanı yapılandırmasını doğrulamak için, dosyaları /product/vendor_overlay/<target_vendor_version>/<overlay_dir>
dizinine ekleyin ve dosyaların /vendor/<overlay_dir>
dizinindeki dosyaların üzerine yerleştirilip yerleştirilmediğini kontrol edin.
userdebug
derlemeleri için Atest'e yönelik bir test modülü vardır:
$ atest -v fs_mgr_vendor_overlay_test
Kök olarak sisteme güncelleme
A/B olmayan aygıtları kök olarak sistemi kullanacak şekilde güncellemek için, boot.img
ve system.img
bölümleme düzenini güncellemeniz, dm-verity'yi ayarlamanız ve aygıta özgü kök klasörlerdeki tüm önyükleme bağımlılıklarını kaldırmanız gerekir.
Bölümleri güncelleme
/boot
kurtarma bölümü olarak yeniden kullanan A/B aygıtlarının aksine, A/B olmayan aygıtların, yedek yuva bölümü /recovery
(örneğin, boot_a
boot_b
) /recovery bölümünü ayrı tutmaları gerekir. A/B olmayan cihazda /recovery
kaldırılırsa ve A/B şemasına benzer hale getirilirse, /boot
bölümünde başarısız bir güncelleme sırasında kurtarma modu bozulabilir. Bu nedenle, /recovery
bölümü, A/B olmayan cihazlar için /boot
ayrı bir bölüm olmalıdır ; bu, kurtarma görüntüsünün ertelenmiş bir şekilde güncellenmeye devam edeceği anlamına gelir (yani, Android çalıştıran cihazlarda olduğu gibi). 8.1.0 veya daha düşük).
Aşağıdaki tabloda, Android 9'dan önceki ve sonraki A/B olmayan cihazlar için görüntü bölümü farklılıkları listelenmektedir.
Resim | Ramdisk (9'dan önce) | Kök olarak sistem (9'dan sonra) |
---|---|---|
boot.img | Bir çekirdek ve bir ramdisk.img içerir: ramdisk.img -/ - init.rc - init - etc -> /system/etc - system/ (mount point) - vendor/ (mount point) - odm/ (mount point) ... | Yalnızca normal bir önyükleme çekirdeği içerir. |
recovery.img | Bir kurtarma çekirdeği ve bir kurtarma ramdisk.img içerir. | |
system.img | Aşağıdakileri içerir: system.img -/ - bin/ - etc - vendor -> /vendor - ... | Orijinal system.img ve ramdisk.img birleştirilmiş içeriğini içerir: system.img -/ - init.rc - init - etc -> /system/etc - system/ - bin/ - etc/ - vendor -> /vendor - ... - vendor/ (mount point) - odm/ (mount point) ... |
Bölümlerin kendileri değişmez; hem ramdisk hem de kök sistem aşağıdaki bölüm şemasını kullanır:
-
/boot
-
/system
-
/system
-
/recovery
-
/vendor
vb.
dm-verity'yi ayarlama
Kök olarak sistemde, çekirdeğin system.img
/
(bağlama noktası) altına dm-verity ile bağlaması gerekir. AOSP, system.img
için aşağıdaki dm-verity uygulamalarını destekler.
vbboot 1.0
vboot 1.0 için, çekirdeğin /system
üzerinde Android'e özgü meta verileri ayrıştırması, ardından dm -verity'yi ayarlamak için dm-verity parametrelerine dönüştürmesi gerekir ( bu çekirdek yamalarını gerektirir). Aşağıdaki örnek, çekirdek komut satırında kök olarak sistem için dm-verity ile ilgili ayarları gösterir:
ro root=/dev/dm-0 rootwait skip_initramfs init=/init dm="system none ro,0 1 android-verity /dev/sda34" veritykeyid=id:7e4333f9bba00adfe0ede979e28ed1920492b40f
vbboot 2.0
Vboot 2.0 ( AVB ) için, önyükleyicinin external/avb/libavb entegre etmesi gerekir; bu daha sonra /system
için hashtree tanımlayıcısını ayrıştırır, onu dm-verity params'a dönüştürür ve son olarak parametreleri çekirdek komut satırı aracılığıyla çekirdeğe iletir. ( /system
Hashtree tanımlayıcıları /vbmeta
veya /system
kendisinde olabilir.)
vboot 2.0 aşağıdaki çekirdek yamalarını gerektirir:
- https://android-review.googlesource.com/#/c/kernel/common/+/158491/
- çekirdek 4.4 yamaları , çekirdek 4.9 yamaları vb.
Aşağıdaki örnek, çekirdek komut satırında kök olarak sistem için dm-verity ile ilgili ayarları gösterir:
ro root=/dev/dm-0 rootwait skip_initramfs init=/init dm="1 vroot none ro 1,0 5159992 verity 1 PARTUUID=00000016-0000-0000-0000-000000000000 PARTUUID=00000016-0000-0000-0000-000000000000 4096 4096 644999 644999 sha1 d80b4a8be3b58a8ab86fad1b498640892d4843a2 8d08feed2f55c418fb63447fec0d32b1b107e42c 10 restart_on_corruption ignore_zero_blocks use_fec_from_device PARTUUID=00000016-0000-0000-0000-000000000000 fec_roots 2 fec_blocks 650080 fec_start 650080"
Cihaza özel kök klasörleri kullanma
Kök olarak sistem ile, genel sistem görüntüsü (GSI) cihazda yanıp söndükten sonra (ve Vendor Test Suite testlerini çalıştırmadan önce), kök dizin içeriğinin tamamı değiştirildiği için BOARD_ROOT_EXTRA_FOLDERS
ile eklenen cihaza özel kök klasörler kaybolur. kök sistem GSI tarafından. Bu klasörlerin kaldırılması, aygıta özgü kök klasörlere bağımlılık mevcutsa (örneğin, bağlama noktaları olarak kullanılıyorlarsa) aygıtın yeniden başlatılamaz hale gelmesine neden olabilir.
Bu sorunu önlemek için cihaza özel kök klasörler eklemek üzere BOARD_ROOT_EXTRA_FOLDERS
kullanmayın. Cihaza özel bağlama noktaları belirtmeniz gerekiyorsa /mnt/vendor/<mount point>
(bu değişiklik listelerine eklenmiştir) kullanın. Satıcıya özgü bu bağlama noktaları, hem fstab
aygıt ağacında (birinci aşama bağlama için) hem de /vendor/etc/fstab.{ro.hardware}
dosyasında ek kurulum gerekmeden doğrudan belirtilebilir ( fs_mgr
bunları /mnt/vendor/*
altında oluşturduğundan) /mnt/vendor/*
otomatik olarak).