Sanal A/B'ye Genel Bakış

Android'in iki güncelleme mekanizması vardır: A/B (kesintisiz) güncellemeler ve A/B olmayan güncellemeler. Kod karmaşıklığını azaltmak ve güncelleme sürecini geliştirmek için Android 11'de iki mekanizma, minimum depolama maliyetiyle tüm cihazlara sorunsuz güncellemeler getirmek için sanal A/B aracılığıyla birleştirilmiştir. Android 12, anlık görüntülenen bölümleri sıkıştırmak için Sanal A/B sıkıştırma seçeneği sunar. Hem Android 11 hem de Android 12'de aşağıdakiler geçerlidir:

  • Sanal A / B güncellemeler A / B güncellemeleri gibi sorunsuz bulunmaktadır. Sanal A/B güncellemeleri, bir cihazın çevrimdışı ve kullanılamaz durumda olduğu süreyi en aza indirir.
  • Sanal A / B güncellemeleri geri alınmasını. Yeni işletim sistemi önyükleme yapamazsa, cihazlar otomatik olarak önceki sürüme geri döner.
  • Sanal A / B güncellemeleri bootloader tarafından kullanılan tek bölümleri kopyalayarak fazladan boş alan en az kullanın. Diğer güncellenebilen bölümleri vardır snapshotted .

Arka plan ve terminoloji

Bu bölüm terminolojiyi tanımlar ve sanal A/B'yi destekleyen teknolojiyi açıklar.

Cihaz eşleyici

Cihaz eşleyici, Android'de sıklıkla kullanılan bir Linux sanal blok katmanıdır. İle dinamik bölümleri gibi bölmeler /system tabakalı cihazların bir yığın vardır:

  • İstifin altındaki fiziksel süper bölümü (örneğin, /dev/block/by-name/super ).
  • Ortasında a, dm-linear süper bölüm halinde bloke eden verilen bölüm belirten cihaz. Bu görüldüğü gibi /dev/block/mapper/system_[a|b] A / B cihazında veya /dev/block/mapper/system olmayan bir A / B cihazda.
  • En üstte bir ikamet dm-verity doğrulanmış bölümleri için oluşturulan cihazı. Üzerinde bloklar Bu cihaz doğrular dm-linear cihaza doğru imzalanır. Bu şekilde görünür /dev/block/mapper/system-verity ve kaynağıdır /system bağlama noktası.

Altında yığın Ne Şekil 1 /system gibi nokta görünüyor monte.

Partition stacking underneath system

/ System bağlama noktası altında Şekil 1. Yığın

dm-anlık görüntü

Sanal bir A / B dayanır dm-snapshot bir depolama cihazının durumunu anlık görüntü için bir cihaz-eşleyici modülü. Kullanırken dm-snapshot , oyunda dört cihazlar vardır:

  • Baz cihaz snapshotted oluyor cihazdır. Bu sayfada, temel aygıt her zaman sistem veya satıcı gibi dinamik bir bölümdür.
  • Baz cihazında değişiklik günlüğü için kopya üzerinde yazma (İNEK) cihazı. Herhangi bir boyutta olabilir, ancak temel cihazdaki tüm değişiklikleri barındıracak kadar büyük olmalıdır.
  • Anlık görüntü aygıtı kullanılarak oluşturulan snapshot hedefi. Anlık görüntü aygıtına yazılanlar COW aygıtına yazılır. Erişilen verilerin anlık görüntü tarafından değiştirilip değiştirilmediğine bağlı olarak, ana cihazdan veya COW cihazından okunan anlık görüntü cihazından okur.
  • Köken cihazı kullanılarak oluşturulan snapshot-origin hedef. Doğrudan temel cihazdan okunan kaynak cihaza okur. Orijinal cihaza yazar, doğrudan temel cihaza yazar, ancak orijinal veriler COW cihazına yazılarak yedeklenir.

Device mapping for dm-snapshot

Dm enstantane Şekil 2. Aygıt eşleme

Sıkıştırılmış anlık görüntüler

Üzerinde alanı gereksinimleri nedeniyle Android 12'de, /data bölümü yüksek olabilir, sen yüksek uzay gereksinimlerini karşılayacak bir Yapınızda anlık sıkıştırılmış etkinleştirebilirsiniz /data bölümü.

Sanal A/B sıkıştırılmış anlık görüntüler, Android 12'de bulunan iki yeni bileşenin üzerine inşa edilmiştir:

  • dm-user , kullanıcı alanı blok cihazları uygulamaya izin veren sigortaya benzer bir çekirdek modülü.
  • snapuserd , userspace cin yeni anlık biçimi uygulamaktır.

Bu bileşenler sıkıştırmayı sağlar. : Sıkıştırılmış yetenekleri sonraki bölümlerde verilmiştir anlık uygulamak için yapılan diğer gerekli değişiklikleri sıkıştırılmış enstantane için İNEK biçimini , dm-kullanıcı ve Snapuserd .

Sıkıştırılmış anlık görüntüler için COW formatı

Android 12'de sıkıştırılmış anlık görüntüler yeni bir COW biçimi kullanır. Sıkıştırılmamış anlık görüntüler için kullanılan çekirdeğin yerleşik biçimine benzer şekilde, sıkıştırılmış anlık görüntüler için COW biçimi, değişen meta veri ve veri bölümlerine sahiptir. Orijinal formatın meta verileri yalnızca "yerine" işlemleri için izin: anlık blok Y içeriği ile taban görüntüde blok X değiştirin. Sıkıştırılmış anlık görüntüler COW formatı daha anlamlıdır ve üç işlemi destekler:

  • Kopya - Blok X, bir temel cihazın temel cihazında blok Y ile değiştirilmelidir.
  • Yerine - Blok X, bir temel cihazın bir anlık blok Y içeriği ile değiştirilmesi gerekir. Bu blokların her biri gz sıkıştırılmıştır.
  • Sıfır - Baz cihazda Blok X tamamen sıfır değiştirilmelidir.

Tam OTA güncellemeleri arasında yerini ve sadece sıfır operasyonları şekillenmektedir. Artan OTA güncellemeleri ayrıca kopyalama işlemi olabilir.

Android 12'de dm kullanıcısı

Dm kullanıcı çekirdek modülü sağlar userspace aygıt eşleyici blok cihazları uygulamak. Bir dm-kullanıcı tablosu girdisi altında çeşitli cihaz yaratır /dev/dm-user/<control-name> . Bir userspace süreci çekirdeğinden okuma ve yazma isteği almak için cihazı yoklayabilirsiniz. Her istek, kullanıcı alanının doldurulması (bir okuma için) veya yayılması (bir yazma için) için ilişkili bir arabelleğe sahiptir.

dm-user çekirdek modülü yukarı kernel.org kod tabanının bir parçası olmayan çekirdek için yeni bir kullanıcı tarafından görülen bir arayüz sağlar. Öyle kadar, Google değiştirme hakkını saklı tutar dm-user Android'de arabirimi.

Snapuserd

snapuserd için kullanıcı alanı bileşeni dm-user uygular Sanal A / B Sıkıştırma.

Virtual A/B'nin sıkıştırılmamış sürümünde (Android 11 ve önceki sürümlerde veya sıkıştırılmış anlık görüntü seçeneği olmayan Android 12'de), COW cihazı ham bir dosyadır. Sıkıştırma etkinleştirildiğinde, inek fonksiyonları yerine bir dm-user örneğine bağlı olan cihaz, snapuserd cini.

Çekirdek, yeni COW biçimini kullanmaz. Yani snapuserd bileşeni Android İNEK formatı ve yerleşik oluyor biçiminde çekirdek arasında istekleri çevirir:

Snapuserd component translating requests between Android COW format and kernel built-in format

Android ve Çekirdek İNEK biçimleri arasında çevirmen olarak snapuserd Şekil 3. Akış şeması

Bu çeviri ve açma diskte asla gerçekleşmez. snapuserd bileşeni İNEK okur yakaladığını ve yazma çekirdekte meydana gelir ve uygular onları Android İNEK biçimini kullanarak.

Sanal A/B sıkıştırma işlemleri

Bu bölümler, Sanal A/B sıkıştırmasında kullanılan işlemlerle ilgili ayrıntıları sağlar: meta verileri okuma, birleştirme ve başlangıç ​​geçişlerini gerçekleştirme.

Meta verileri okuma

Meta bir inşa edilir snapuserd cini. Meta veriler, öncelikle, birleştirilecek sektörleri temsil eden, her biri 8 bayt olan 2 kimliğin bir eşlemesidir. In dm-snapshot o kadar deniyor disk_exception .

struct disk_exception {
    uint64_t old_chunk;
    uint64_t new_chunk;
};

Eski bir veri yığını yenisiyle değiştirildiğinde bir disk istisnası kullanılır.

Bir Snapuserd cini İNEK kitaplığı aracılığıyla iç İNEK dosyasını okur ve İNEK dosyasında İNEK işlemleri mevcut her biri için meta oluşturur.

Meta başlatılan okur dm-snapshot zaman çekirdek dm- snapshot aygıtı oluşturulur.

Aşağıdaki şekil, meta veri oluşturmaya yönelik IO yolu için bir dizi diyagramı sağlar.

Sequence diagram, IO path for metadata construction

Meta veri yapı IO yolu Şekil 4. Sekans akış

birleştirme

Önyükleme işlemi tamamlandıktan sonra, güncelleme motor işaretleri çizme başarılı ve geçiş yaparak inisiyeler birleştirme olarak yuva dm-snapshot için hedef dm-snapshot-merge hedefi.

dm-snapshot meta veriler üzerinden yürür ve her bir disk özel durum için bir birleştirme IO başlatır. Birleştirme IO yolunun üst düzey bir genel görünümü aşağıda gösterilmiştir.

Merge IO path

Şekil 5. Birleştirme ES yolu genel

Aygıt birleştirme işlemi sırasında yeniden başlatılırsa, birleştirme sonraki yeniden başlatmada devam eder ve birleştirme tamamlanır.

Başlangıç ​​geçişleri

Sıkıştırılmış enstantane ile önyükleme, ilk aşama init başlamalıdır snapuserd bölümleri monte etmek. Bu pozlar sorun: Ne zaman sepolicy yüklenir ve uygulanır, snapuserd yanlış bağlamda koymak alır ve onun okuma istekleri selinux inkar ile, başarısız.

Bu, ele almak için snapuserd ile kilit aşamasında geçişleri init aşağıdaki gibi:

  1. Birinci aşama init başlattı snapuserd ramdisk'ten ve bir ortam değişkeni içinde kendisine açık bir dosya tanımlayıcısı kaydeder.
  2. Birinci aşama init sistem bölümü için kök dosya sistemini geçer, daha sonra sistemi kopyasını çalıştırır init .
  3. Sistem kopyası init bir dizeye kombine sepolicy okur.
  4. Init çağırır mlock() tüm ext4'ün destekli sayfaları. Daha sonra anlık cihazlar için tüm cihaz-mapper tabloları devre dışı bırakır ve durur snapuserd . Bundan sonra, kilitlenmeye neden olacağı için bölümlerden okumak yasaktır.
  5. Ait ramdiskin kopyası açık tanımlayıcısı kullanarak snapuserd , init doğru selinux içeriğiyle cini relaunches. Anlık görüntü aygıtları için aygıt eşleyici tabloları yeniden etkinleştirilir.
  6. İnit çağırır munlockall() - güvenlidir IO tekrar gerçekleştirmek için.

Alan kullanımı

Aşağıdaki tablo, Pixel'in OS ve OTA boyutlarını kullanan farklı OTA mekanizmaları için alan kullanımının bir karşılaştırmasını sağlar.

Boyut Etkisi A/B olmayan A/B Sanal A/B Sanal A/B (sıkıştırılmış)
Orijinal Fabrika Resmi 4,5 GB'tır süper (700M ayrılmış + 3.8g görüntüsü) 1 9GB süper (iki yuva için 3.8G + 700M ayrılmış) 4.5GB süper (3,8G resim + 700M ayrılmış) 4.5GB süper (3,8G resim + 700M ayrılmış)
Diğer statik Bölümler /önbellek Hiçbiri Hiçbiri Hiçbiri
OTA sırasında ek depolama (boşluk OTA uygulayarak döndü) 1.4 GB /veri 0 3.8GB 2 / veri 2.1GB 2 / veri
OTA'yı uygulamak için gereken toplam depolama alanı 5.9GB 3 (süper ve veri) 9GB (süper) 8.3GB 3 (süper ve veri) 6.6GB 3 (süper ve veri)

1 Piksel eşleme dayalı assumed düzenini gösterir.

2 yeni sistem görüntü, orijinal olarak aynı boyutta olduğu farzedilir.

3 Uzay gereksinimi açılışa kadar geçicidir.

Sanal A / B uygulamak için, veya sıkıştırılmış anlık özelliklerini kullanmak, bkz Sanal A / B Uygulama