Sanal A/B Uygulaması

Sanal A/B'yi yeni bir cihaza uygulamak veya başlatılan bir cihazı güçlendirmek için cihaza özel kodda değişiklik yapmanız gerekir.

Bayraklar oluşturun

Sanal A/B kullanan aygıtlar, bir A/B aygıtı olarak yapılandırılmalı ve dinamik bölümlerle başlatılmalıdır .

Sanal A/B ile başlatılan cihazlar için, bunları sanal A/B cihaz tabanı yapılandırmasını devralacak şekilde ayarlayın:

$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota.mk)

Sanal A/B ile başlatılan cihazların BOARD_SUPER_PARTITION_SIZE için yalnızca yarısı kadar kart boyutu gerekir çünkü B yuvaları artık süper durumda değildir. Yani, BOARD_SUPER_PARTITION_SIZE toplamı(güncelleme gruplarının boyutu) + ek yükünden büyük veya eşit olmalıdır, bu da sırayla toplam(bölümlerin boyutu) + ek yükten büyük veya eşit olmalıdır.

Sanal A/B ile sıkıştırılmış anlık görüntüleri etkinleştirmek için bunun yerine aşağıdaki temel yapılandırmayı devralın:

$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota/compression.mk)

Önyükleme denetimi HAL

Önyükleme denetimi HAL , OTA istemcilerinin önyükleme yuvalarını denetlemesi için bir arabirim sağlar. Sanal A/B, önyükleyicinin yanıp sönme/fabrika ayarlarına sıfırlama sırasında korunmasını sağlamak için ek API'ler gerektiğinden, önyükleme denetimi HAL'nin küçük bir sürüm yükseltmesini gerektirir. HAL tanımının en son sürümü için IBootControl.hal ve type.hal'e bakın.

// hardware/interfaces/boot/1.1/types.hal
enum MergeStatus : uint8_t {
    NONE, UNKNOWN, SNAPSHOTTED, MERGING, CANCELLED };

// hardware/interfaces/boot/1.1/IBootControl.hal
package android.hardware.boot@1.1;
interface IBootControl extends @1.0::IBootControl {
    setSnapshotMergeStatus(MergeStatus status)
        generates (bool success);
    getSnapshotMergeStatus()
        generates (MergeStatus status);
}
tutucu3 l10n-yer
// Recommended implementation

Return<bool> BootControl::setSnapshotMergeStatus(MergeStatus v) {
    // Write value to persistent storage
    // e.g. misc partition (using libbootloader_message)
    // bootloader rejects wipe when status is SNAPSHOTTED
    // or MERGING
}

Fstab değişiklikleri

Meta veri bölümünün bütünlüğü, özellikle bir OTA güncellemesi uygulandıktan hemen sonra, önyükleme işlemi için çok önemlidir. Bu nedenle, meta veri bölümü, first_stage_init onu bağlamadan önce kontrol edilmelidir. Bunun olmasını sağlamak için, /metadata girdisine check fs_mgr bayrağını ekleyin. Aşağıdakiler bir örnek sağlar:

/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount,check

Çekirdek gereksinimleri

Anlık görüntü almayı etkinleştirmek için CONFIG_DM_SNAPSHOT true olarak ayarlayın.

F2FS kullanan aygıtlar için f2fs'yi ekleyin: dosya sabitlemeyi düzeltmek için FS_NOCOW_FL bayrağını kullanıcı çekirdek düzeltme ekine aktarın. f2fs: hizalanmış sabitlenmiş dosya çekirdeği yamasını da dahil edin.

Sanal A/B, çekirdek sürüm 4.3'te eklenen özelliklere dayanır: snapshot ve snapshot-merge hedeflerindeki taşma durumu biti. Android 9 ve sonraki sürümleriyle başlatılan tüm cihazlarda zaten çekirdek sürümü 4.4 veya üstü olmalıdır.

Sıkıştırılmış anlık görüntüleri etkinleştirmek için desteklenen minimum çekirdek sürümü 4.19'dur. CONFIG_DM_USER=m veya CONFIG_DM_USER=y ayarlayın. İlki (bir modül) kullanılıyorsa, modül birinci aşama ramdisk'e yüklenmelidir. Bu, Makefile cihazına aşağıdaki satırı ekleyerek başarılabilir:

BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko

Android 11'e yükseltilen cihazlarda güçlendirme

Android 11'e yükseltirken, dinamik bölümlerle başlatılan cihazlar isteğe bağlı olarak sanal A/B'yi güçlendirebilir. Güncelleme işlemi, bazı küçük farklılıklar dışında, sanal A/B ile başlatılan cihazlarla çoğunlukla aynıdır:

  • COW dosyalarının konumu — Başlatma cihazları için, OTA istemcisi, /data içindeki alanı kullanmadan önce süper bölümdeki tüm kullanılabilir boş alanı kullanır. Güçlendirme cihazları için, süper bölümde her zaman COW dosyasının /data üzerinde oluşturulmaması için yeterli alan vardır.

  • Derleme zamanı özellik bayrakları — Sanal A/B'yi güçlendiren cihazlar için hem PRODUCT_VIRTUAL_AB_OTA hem de PRODUCT_VIRTUAL_AB_OTA_RETROFIT aşağıda gösterildiği gibi true olarak ayarlanır:

    (call inherit-product, \
        (SRC_TARGET_DIR)/product/virtual_ab_ota_retrofit.mk)
    
  • Süper bölüm boyutu — Sanal A/B ile başlatılan cihazlar, B yuvaları süper bölümde olmadığı için BOARD_SUPER_PARTITION_SIZE yarıya indirebilir. Sanal A/B'yi güçlendiren cihazlar eski süper bölüm boyutunu korur, bu nedenle BOARD_SUPER_PARTITION_SIZE 2 * toplam(güncelleme gruplarının boyutu) + ek yükten büyük veya eşittir, bu da 2 * toplam(bölümlerin boyutu) veya daha büyük + tepegöz .

Önyükleyici değişiklikleri

Bir güncellemenin birleştirme adımı sırasında /data , Android işletim sisteminin tek tüm örneğini tutar. Taşıma başladığında, yerel system , vendor ve product bölümleri kopyalama tamamlanana kadar eksik kalır. Bu işlem sırasında cihaz, kurtarma yoluyla veya Sistem ayarları iletişim kutusu aracılığıyla fabrika ayarlarına sıfırlanırsa, cihaz başlatılamaz hale gelir.

/data dosyasını silmeden önce, cihaz durumuna bağlı olarak kurtarma veya geri alma sırasında birleştirmeyi tamamlayın:

  • Yeni yapı daha önce başarıyla önyüklendiyse, geçişi tamamlayın.
  • Aksi takdirde, eski yuvaya geri dönün:
    • Dinamik bölümler için önceki duruma geri dönün.
    • Statik bölümler için aktif yuvayı eski yuvaya ayarlayın.

Cihazın kilidi açıksa, hem bootloader hem de fastbootd /data bölümünü silebilir. fastbootd , geçişi tamamlamaya zorlayabilirken, önyükleyici yapamaz. Önyükleyici, bir birleştirmenin devam edip etmediğini veya /data içindeki hangi blokların işletim sistemi bölümlerini oluşturduğunu bilmiyor. Cihazlar, aşağıdakileri yaparak kullanıcının bilmeden cihazı çalışmaz hale getirmesini (tuğlalama) önlemelidir:

  1. Önyükleyicinin setSnapshotMergeStatus() yöntemi tarafından ayarlanan değeri okuyabilmesi için HAL önyükleme denetimi uygulayın.
  2. Birleştirme durumu MERGING ise veya birleştirme durumu SNAPSHOTTED ise ve yuva yeni güncellenen yuvaya değiştiyse, userdata verilerini, metadata veya birleştirme durumunu depolayan bölümü silme istekleri önyükleyicide reddedilmelidir.
  3. Kullanıcıların bu koruma mekanizmasını atlamak istediklerini önyükleyiciye bildirebilmeleri için fastboot snapshot-update cancel komutunu uygulayın.
  4. Tüm cihaz yanıp sönerken fastboot snapshot-update cancel sağlamak için özel yanıp sönme araçlarını veya komut dosyalarını değiştirin. Bu, cihazın tamamının yanıp sönmesi OTA'yı kaldıracağı için güvenlidir. Araçlar, fastboot getvar snapshot-update-status uygulayarak bu komutu çalışma zamanında algılayabilir. Bu komut, hata koşulları arasında ayrım yapılmasına yardımcı olur.

Örnek vermek

struct VirtualAbState {
    uint8_t StructVersion;
    uint8_t MergeStatus;
    uint8_t SourceSlot;
};

bool ShouldPreventUserdataWipe() {
    VirtualAbState state;
    if (!ReadVirtualAbState(&state)) ...
    return state.MergeStatus == MergeStatus::MERGING ||
           (state.MergeStatus == MergeStatus::SNAPSHOTTED &&
            state.SourceSlot != CurrentSlot()));
}

Fastboot takım değişiklikleri

Android 11, fastboot protokolünde aşağıdaki değişiklikleri yapar:

  • getvar snapshot-update-status — Önyükleme denetimi HAL'nin önyükleyiciye ilettiği değeri döndürür:
    • Durum MERGING ise, önyükleyici merging dönmelidir.
    • Durum SNAPSHOTTED ise, önyükleyici snapshotted döndürmelidir.
    • Aksi takdirde, önyükleyici none döndürmemelidir.
  • snapshot-update merge — Bir birleştirme işlemini tamamlar, gerekirse kurtarma/fastbootd'a önyükleme yapar. Bu komut yalnızca snapshot-update-status merging geçerlidir ve yalnızca fastbootd'da desteklenir.
  • snapshot-update cancel — Önyükleme denetimi HAL'ın birleştirme durumunu CANCELLED olarak ayarlar. Cihaz kilitliyken bu komut geçersizdir.
  • erase veya wipe — Önyükleme denetimi HAL için birleştirme durumunu tutan metadata , userdata verilerinin veya bir bölümün erase veya wipe , anlık görüntü birleştirme durumunu kontrol etmelidir. Durum MERGING veya SNAPSHOTTED ise, cihaz işlemi iptal etmelidir.
  • set_active — Etkin yuvayı değiştiren bir set_active komutu, anlık görüntü birleştirme durumunu kontrol etmelidir. Durum MERGING ise, cihaz işlemi iptal etmelidir. Slot, SNAPSHOTTED durumunda güvenle değiştirilebilir.

Bu değişiklikler, bir aygıtı yanlışlıkla önyüklenemez hale getirmeyi önlemek için tasarlanmıştır, ancak otomatik araçlar için yıkıcı olabilir. Komutlar, fastboot flashall çalıştırılması gibi tüm bölümlerin yanıp sönmesinin bir bileşeni olarak kullanıldığında, aşağıdaki akışın kullanılması önerilir:

  1. getvar snapshot-update-status sorgusu.
  2. merging veya snapshotted , snapshot-update cancel .
  3. Yanıp sönen adımlarla devam edin.

Depolama gereksinimlerinin azaltılması

Süper olarak ayrılmış tam A/B depolama alanına sahip olmayan ve gerektiğinde /data kullanmayı bekleyen cihazların blok eşleme aracını kullanmaları şiddetle önerilir. Blok eşleme aracı, yapılar arasında blok ayırmayı tutarlı tutar ve anlık görüntüye gereksiz yazmaları azaltır. Bu, OTA Boyutunu Azaltma başlığı altında belgelenmiştir.