Android 10'da kök dosya sistemi artık ramdisk.img'ya dahil edilmiyor ve bunun yerine system.img ile birleştiriliyor (yani BOARD_BUILD_SYSTEM_ROOT_IMAGE ayarlanmış gibi system.img her zaman oluşturuluyor). Android 10 ile kullanıma sunulan cihazlar:
- Kök olarak sistem bölümü düzeni kullanın (bu düzen, davranış değişikliği seçeneği olmadan derleme tarafından otomatik olarak zorunlu kılınır).
- dm-linear için gerekli olan bir ramdisk kullanılmalıdır.
BOARD_BUILD_SYSTEM_ROOT_IMAGEdeğerinifalseolarak ayarlamanız gerekir. Bu ayar yalnızca ramdisk kullanan cihazlarla ramdisk kullanmayan (bunun yerine doğrudansystem.imgbağlayan) cihazları ayırt etmek için kullanılır.
Kök olarak sistem yapılandırmasının anlamı Android 9 ile Android 10 arasında farklıdır. Android 9'da sistem-as-root yapılandırmasında BOARD_BUILD_SYSTEM_ROOT_IMAGE, true olarak ayarlanır. Bu, derlemenin kök dosya sistemini system.img ile birleştirmesini ve ardından system.img'yi kök dosya sistemi (rootfs) olarak bağlamasını zorunlu kılar. Bu yapılandırma, Android 9 ile kullanıma sunulan cihazlar için zorunludur ancak Android 9'a yükseltilen cihazlar ve Android'in daha eski sürümlerini çalıştıran cihazlar için isteğe bağlıdır. Android 10'da sistem olarak kök yapılandırmasında, yapı her zaman $TARGET_SYSTEM_OUT ve $TARGET_ROOT_OUT öğelerini system.img içinde birleştirir. Bu yapılandırma, Android 10 çalıştıran tüm cihazlar için varsayılan davranıştır.
Android 10, dinamik bölümleri desteklemek için daha fazla değişiklik yapıyor. Bu değişiklikler, kullanıcı alanı bölümlendirme sistemi sayesinde kablosuz (OTA) güncellemelerin bölümleri oluşturmasına, yeniden boyutlandırmasına veya kaldırmasına olanak tanıyor. Bu değişiklik kapsamında, Linux çekirdeği artık Android 10 çalıştıran cihazlarda mantıksal sistem bölümünü bağlayamaz. Bu nedenle, bu işlem ilk aşama başlatma tarafından gerçekleştirilir.
Aşağıdaki bölümlerde, yalnızca sistem OTA'ları için sistem-as-root koşulları açıklanmakta ve cihazları sistem-as-root kullanacak şekilde güncelleme konusunda (bölüm düzeni değişiklikleri ve dm-verity çekirdek koşulları dahil) rehberlik sağlanmaktadır. Ramdisk'teki değişikliklerle ilgili ayrıntılar için Ramdisk Bölümleri başlıklı makaleyi inceleyin.
Yalnızca sistem OTA'ları hakkında
Android sürümlerinin diğer bölümleri değiştirmeden system.img ve product.img güncellenmesini sağlayan yalnızca sistem OTA'ları için sistem-as-root bölüm düzeni gerekir. Android 10'un yüklü olduğu tüm cihazlarda, yalnızca sisteme yönelik OTA'ları etkinleştirmek için sistemin kök olarak kullanıldığı bir bölüm düzeni kullanılmalıdır.
systembölümünü rootfs olarak bağlayan A/B cihazlar, sistem-as-root'u zaten kullanır ve sistem OTA'larını desteklemek için değişiklik yapılması gerekmez.systembölümünü/systemkonumuna monte eden A/B olmayan cihazları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 başlıklı makaleyi inceleyin.
Tedarikçi yer paylaşımını kullanma (<=AOSP 14)
Tedarikçi yerleşimi, cihaz başlatma sırasında vendorbölümünde değişiklik yapmanıza olanak tanır. Tedarikçi katmanı, cihaz başlatıldığında product bölümündeki bir grup tedarikçi modülüdür. Bu modüller, vendor bölümüne yerleştirilerek mevcut modüllerin yerini alır ve yeni modüller ekler.
Cihaz başlatıldığında init işlemi ilk aşama bağlama işlemini tamamlar ve varsayılan özellikleri okur. Ardından, aşağıdaki koşullar karşılanıyorsa her alt dizini arar
/product/vendor_overlay/<target_vendor_version> ve ilgili vendor bölüm dizinine bağlar:
/vendor/<overlay_dir>mevcut./product/vendor_overlay/<target_vendor_version>/<overlay_dir>has the same file context as/vendor/<overlay_dir>.inituygulamasının/vendor/<overlay_dir>dosya bağlamına bağlanmasına izin verilir.
Satıcı yer paylaşımını uygulama
Tedarikçi yer paylaşımı dosyalarını /product/vendor_overlay/<target_vendor_version>'ya yükleyin. Bu dosyalar, cihaz başlatıldığında vendor bölümünün üzerine yazılır. Aynı ada sahip dosyalar değiştirilir ve yeni dosyalar eklenir. Sağlayıcı yer paylaşımı, vendor bölümündeki dosyaları kaldıramaz.
Sağlayı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. Tedarikçi yer paylaşımı dosyaları ile bunların yerine geçen dosyalar arasında dosya bağlamı uyuşmazlıkları varsa bunu cihaza özel sepolicy'de belirtin. Dosya bağlamı, dizin düzeyinde ayarlanır. Bir tedarikçi yer paylaşımı dizininin dosya bağlamı hedef dizinle eşleşmiyorsa ve cihaza özel sepolicy'de doğru dosya bağlamı belirtilmemişse söz konusu tedarikçi yer paylaşımı dizini hedef dizinle yer paylaşımı yapmaz.
Tedarikçi yer paylaşımını kullanmak için çekirdek, CONFIG_OVERLAY_FS=y ayarlanarak OverlayFS'yi etkinleştirmelidir. Ayrıca çekirdek, ortak çekirdek 4.4 veya sonraki sürümlerden birleştirilmiş ya da "overlayfs:
override_creds=off option bypass creator_cred" ile yama uygulanmış olmalıdır.
Tedarikçi yer paylaşımı uygulama örneği
Bu prosedür, /vendor/lib/*, /vendor/etc/* ve /vendor/app/* dizinlerinin üzerine yerleştirilen bir tedarikçi yer paylaşımının nasıl uygulanacağını gösterir.
-
device/<vendor>/<target>/vendor_overlay/<target_vendor_version>/konumuna önceden oluşturulmuş satıcı dosyaları 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ı
product/vendor_overlaykonumuna yükleyin:device/google/device/device.mk:PRODUCT_COPY_FILES += \ $(call find-copy-subdir-files,*,device/google/device/vendor_overlay,$(TARGET_COPY_OUT_PRODUCT)/vendor_overlay)
-
Hedef
vendorbölüm dosyalarıvendor_filedışında bağlamlara sahipse dosya bağlamlarını tanımlayın./vendor/lib/*,vendor_filebağlamını kullandığı için bu örnekte söz konusu dizin yer almıyor.device/google/device-sepolicy/private/file_contextsalanına aşağıdakileri 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
-
initişleminin, satıcı yer paylaşımınıvendor_filedışındaki dosya bağlamlarına yerleştirmesine izin verin.initişlemi,vendor_filebağlamına zaten bağlama iznine sahip olduğundan bu örnektevendor_fileiçin politika tanımlanmamıştır.device/google/device-sepolicy/public/init.tealanına aşağıdakileri ekleyin:allow init vendor_configs_file:dir mounton; allow init vendor_app_file:dir mounton;
Tedarikçi yer paylaşımını doğrulama
Tedarikçi yer paylaşımı yapılandırmasını doğrulamak için /product/vendor_overlay/<target_vendor_version>/<overlay_dir> bölümüne dosya ekleyin ve dosyaların /vendor/<overlay_dir> bölümündeki dosyalarla yer paylaşımı yapılıp yapılmadığını kontrol edin.
userdebug derlemelerinde Atest için bir test modülü bulunur:
$ atest -v fs_mgr_vendor_overlay_test
Sistemin kök olarak güncellenmesi
A/B olmayan cihazları system-as-root kullanacak şekilde güncellemek için boot.img ve system.img bölümleme şemasını güncellemeniz, dm-verity'yi ayarlamanız ve cihaza özel kök klasörlerdeki tüm önyükleme bağımlılıklarını kaldırmanız gerekir.
Bölümleri güncelleme
/boot bölümünü kurtarma bölümü olarak yeniden kullanan A/B cihazların aksine, A/B olmayan cihazlar, geri dönüş yuvası bölümüne sahip olmadıkları için /recovery bölümünü ayrı tutmalıdır (örneğin, boot_a'dan boot_b'ye). A/B olmayan cihazda /recovery kaldırılır ve A/B şemasına benzer hale getirilirse /boot bölümüne yapılan güncelleme başarısız olduğunda kurtarma modu bozulabilir. Bu
nedenle, A/B olmayan cihazlarda /recovery bölümü /boot bölümünden ayrı
bir bölüm olmalıdır. Bu da kurtarma görüntüsünün ertelenmiş bir şekilde güncellenmeye devam ettiği anlamına
gelir (yani
Android 8.1.0 veya daha eski sürümleri çalıştıran cihazlardaki gibi).
Aşağıdaki tabloda, Android 9'dan önce ve sonra A/B olmayan cihazlardaki görüntü bölümü farklılıkları listelenmiştir.
| Resim | Ramdisk (Android 9'dan önce) | System-as-root (Android 9'dan sonra) |
|---|---|---|
boot.img |
Çekirdek ve 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 |
Kurtarma çekirdeği ve kurtarma ramdisk.img içerir. |
|
system.img |
Şunları içerir:
system.img
-/
- bin/
- etc
- vendor -> /vendor
- ... |
Orijinal system.img ve ramdisk.img içeriklerinin birleştirilmiş halini 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 system-as-root aşağıdaki bölüm şemasını kullanır:
/boot/system/system/recovery/vendorvb.
dm-verity'yi ayarlama
Sistemin kök olarak kullanıldığı durumlarda çekirdek, system.img bölümünü / (ekleme noktası) altında dm-verity ile bağlamalıdır. AOSP, system.img için aşağıdaki dm-verity uygulamalarını destekler.
vboot 1.0
vboot 1.0 için çekirdek, /system üzerinde Android'e özgü meta verileri ayrıştırmalı, ardından dm-verity'yi ayarlamak için dm-verity parametrelerine dönüştürmelidir (bu çekirdek yamalarını gerektirir).
Aşağıdaki örnekte, çekirdek komut satırında system-as-root için dm-verity ile ilgili ayarlar gösterilmektedir:
ro root=/dev/dm-0 rootwait skip_initramfs init=/init dm="system none ro,0 1 android-verity /dev/sda34" veritykeyid=id:7e4333f9bba00adfe0ede979e28ed1920492b40f
vboot 2.0
vboot 2.0 (AVB) için önyükleyici, external/avb/libavb'yi entegre etmelidir. Bu kitaplık, /system için hashtree tanımlayıcısını ayrıştırır, dm-verity parametrelerine dönüştürür ve son olarak parametreleri çekirdek komut satırı aracılığıyla çekirdeğe iletir. (/system için karma ağacı tanımlayıcıları /vbmeta üzerinde veya /system üzerinde olabilir.)
vboot 2.0 için aşağıdaki çekirdek yamaları gerekir:
- https://android-review.googlesource.com/#/c/kernel/common/+/158491/
- kernel 4.4 yamaları, kernel 4.9 yamaları vb.
Aşağıdaki örnekte, çekirdek komut satırında system-as-root için dm-verity ile ilgili ayarlar gösterilmektedir:
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
System-as-root ile, genel sistem görüntüsü
(GSI) cihaza yüklendikten sonra (ve Vendor Test Suite testleri çalıştırılmadan önce), BOARD_ROOT_EXTRA_FOLDERS ile eklenen cihaza özel tüm kök klasörler kaybolur. Bunun nedeni, kök dizinin tamamının içeriğinin system-as-root GSI ile değiştirilmiş olmasıdır. Bu klasörlerin kaldırılması, cihaza özgü kök klasörlere bağımlılık varsa (ör. bağlama noktası olarak kullanılıyorsa) cihazın başlatılamamasına neden olabilir.
Bu sorunu önlemek için cihaza özel kök klasörler eklemek üzere BOARD_ROOT_EXTRA_FOLDERS kullanmayın. Cihaza özgü bağlama noktaları belirtmeniz gerekiyorsa /mnt/vendor/<mount point> karakterini kullanın (bu değişiklik listelerinde eklenmiştir). Bu tedarikçiye özel bağlama noktaları, ek kurulum olmadan hem fstab cihaz ağacında (ilk aşama bağlama için) hem de /vendor/etc/fstab.{ro.hardware} dosyasında doğrudan belirtilebilir (fs_mgr bunları /mnt/vendor/* altında otomatik olarak oluşturur).