Bölüm düzeni

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_IMAGE değerini false olarak ayarlamanız gerekir. Bu ayar yalnızca ramdisk kullanan cihazlarla ramdisk kullanmayan (bunun yerine doğrudan system.img bağ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.

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>.
  • init uygulaması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.

  1. 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
  2. Önceden oluşturulmuş satıcı dosyalarını product/vendor_overlay konumuna 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)
  3. Hedef vendor bölüm dosyaları vendor_file dışında bağlamlara sahipse dosya bağlamlarını tanımlayın. /vendor/lib/*, vendor_file bağlamını kullandığı için bu örnekte söz konusu dizin yer almıyor.

    device/google/device-sepolicy/private/file_contexts alanı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
  4. init işleminin, satıcı yer paylaşımını vendor_file dışındaki dosya bağlamlarına yerleştirmesine izin verin. init işlemi, vendor_file bağlamına zaten bağlama iznine sahip olduğundan bu örnekte vendor_file için politika tanımlanmamıştır.

    device/google/device-sepolicy/public/init.te alanı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
  • /vendor vb.

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:

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).