Bölme Düzeni

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ğrudan system.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.

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.

  1. 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
    
  2. Önceden oluşturulmuş satıcı dosyalarını device/google/device/device.mk içindeki product/vendor_overlay yükleyin:

    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ının vendor_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
    
  4. init işleminin satıcı kaplamasını vendor_file dışındaki dosya bağlamlarına bağlamasına izin verin. init işleminin vendor_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:

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