Sanal A/B'ye genel bakış

Android'in iki güncelleme mekanizması vardır: A/B (kusursuz) güncellemeler ve A/B olmayan güncellemeler. Kod karmaşıklığını azaltmak ve güncelleme sürecini iyileştirmek için Android 11'de tüm kullanıcılara sorunsuz güncellemeler sağlamak için sanal A/B aracılığıyla birleştirilmiş cihazlar için daha az depolama alanı sunar. Android 12 anlık görüntü alınan bölümleri sıkıştırmak için Sanal A/B sıkıştırması seçeneği sunar. Android 11 ve Android 12'de aşağıdakiler uygulayın:

  • Sanal A/B güncellemeleri, A/B güncellemeleri gibi kusursuzdur. Sanal A/B güncellemeleri cihazın çevrimdışı ve kullanılamaz olduğu süreyi en aza indirme.
  • Sanal A/B güncellemeleri geri alınabilir. Yeni işletim sistemi başlatılamazsa cihazlar otomatik olarak önceki sürüme geri döner.
  • Sanal A/B güncellemeleri yalnızca farklı bölümleri vardır. Diğer güncellenebilir bölümler snapshotted.
ziyaret edin.

Arka plan ve terminoloji

Bu bölümde, terminoloji tanımlanmış ve Google Ads'deki sanal A/B'dir.

Cihaz haritacısı

Cihaz eşleyici, Android'de sıklıkla kullanılan bir Linux sanal blok katmanıdır. Entegre dinamik bölümlerin, /system, katmanlı cihazlardan oluşan bir yığındır:

  • Yığının en altında fiziksel süper bölüm (örneğin, /dev/block/by-name/super).
  • Ortada, süper konumdaki blokları belirten bir dm-linear cihazı bulunur. değer, belirli bir bölümlendirmeyi temsil eder. Bu A/B cihazında /dev/block/mapper/system_[a|b] veya A/B olmayan bir cihazda /dev/block/mapper/system.
  • Üstte, doğrulanmış bölümler için oluşturulmuş bir dm-verity cihazı bulunur. Bu cihaz, dm-linear cihazındaki engellemelerin imzalandığını doğrular sağlayabilir. /dev/block/mapper/system-verity olarak görünür ve kaynak olarak kullanılır çıkarım noktasının /system ekleme noktasıdır.

Şekil 1'de /system ekleme noktasının altındaki yığın gösterilmektedir.

Altında bölüm yığma
sistem

Şekil 1. /system ekleme noktasının altında yığ

dm-anlık-görüntü

Sanal A/B, verilerin anlık görüntüsünü almak için bir cihaz eşleme modülü olan dm-snapshot'den yararlanır. durumu olabilir. dm-snapshot kullanırken şurada dört cihaz bulunur: oynat:

  • Ana cihaz, anlık görüntü alınan cihazdır. Bu sayfada, temel alınan her zaman sistem veya satıcı gibi dinamik bir bölümdür.
  • Temel cihazda yapılan değişiklikleri günlüğe kaydetmek için copy-on-yazma (COW) cihazı. Google herhangi bir boyutta olabilir, ancak temel cihaz.
  • Anlık görüntü cihazı, snapshot hedefi kullanılarak oluşturulur. Yazar COW cihazına yazıldığından emin olmalısınız. Anlık görüntüden okur cihazdaki kullanım şekline bağlı olarak ana cihazdan veya COW cihazından Erişilen verilerin anlık görüntü tarafından değiştirilip değiştirilmediğini kontrol eder.
  • Kaynak cihaz, snapshot-origin hedefi kullanılarak oluşturulur. Okuma yeri: kaynak cihaz, doğrudan temel cihazdan okuma yapar. Kaynağa yazar cihaz doğrudan temel cihaza yazıyor, ancak orijinal veriler yedekleniyor COW cihazına yazın.

Şunun için cihaz eşleme:
dm-anlık-görüntü

Şekil 2. dm-snapshot için cihaz eşlemesi

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

Android 12 ve sonraki sürümlerde, /data bölümü yüksek olabilir. Sıkıştırılmış anlık görüntüleri şuradan etkinleştirebilirsiniz: daha yüksek alan gereksinimlerini karşılamak için geliştirmeye başlayın./data

Sanal A/B sıkıştırılmış anlık görüntüleri, aşağıdaki bileşenlerin üzerine oluşturulur Android 12 ve sonraki sürümlerde kullanılabilen özellikler:

  • dm-user, kullanıcı alanına olanak tanıyan FUSE benzeri bir çekirdek modülü devre dışı bırakabilirsiniz.
  • snapuserd, yeni bir anlık görüntü uygulamak için kullanılan bir kullanıcı alanı arka plan programı biçimindedir.

Bu bileşenler, sıkıştırmayı sağlar. aşağıdaki bölümlerde açıklanmıştır: Sıkıştırılmış anlık görüntüler için COW biçimi, dm-user ve Snapuserd.

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

Android 12 ve sonraki sürümlerde sıkıştırılmış anlık görüntüler COW biçimindedir. Çekirdeğin sıkıştırılmamış dosyalar için kullanılan yerleşik biçimine benzer anlık görüntülerin COW biçiminin bir dizi alternatif olan ve meta verileri ve verileri. Orijinal biçimin meta verileri yalnızca değiştir işlemine izin veriyor işlemler: Ana resimdeki X bloğunu Y bloğunun içeriğiyle değiştirin anlık görüntüde bulabilirsiniz. Sıkıştırılmış anlık görüntüler COW biçimi daha anlamlıdır ve aşağıdaki işlemleri destekler:

  • Kopyala: Temel cihazdaki X bloğunun, Y bloğuyla değiştirilmesi gerekir. temel cihaz.
  • Değiştir: Temel cihazdaki X ifadesinin, içerikle değiştirilmesi gerekir Y blokunun mevcut durumunu gösterir. Bu blokların her biri gz sıkıştırılmıştır.
  • Sıfır: Temel cihazdaki X bloğu tamamen sıfırlarla değiştirilmelidir.
  • ÖZELVEYA: COW cihazı, X bloku ve Y bloğunu bloke eder. (Android 13 ve sonraki sürümlerde kullanılabilir.)

Tam OTA güncellemeleri yalnızca değiştirme ve sıfır işlemlerinden oluşur. Artımlı OTA güncellemelerinde ayrıca copy işlemleri de olabilir.

Android 12'de dm kullanıcısı

dm kullanıcısı çekirdek modülü, userspace ürününün cihaz eşleyici blokunu uygulamasını sağlar cihazlar. Bir dm-kullanıcı tablo girişi, /dev/dm-user/<control-name> userspace işlemi, cihazı yoklayarak çekirdekten okuma ve yazma istekleri alma Her istekle ilişkilendirilmiş bir kullanıcı alanının doldurulacağı (okuma için) veya yayılması (yazma için) için bir arabellek.

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

Snapuserd

dm-user için snapuserd kullanıcı alanı bileşeni, Sanal A/B'yi uygular sağlayabilirsiniz.

Sanal A/B'nin sıkıştırılmamış sürümünde (Android 11 ve önceki sürümlerde veya (yalnızca Android 12'de sıkıştırılmış anlık görüntü seçeneği olmadan) COW cihazı ham dosyadır. Sıkıştırma etkinleştirildiğinde COW işlevleri yerine bir dm-user cihazı olarak snapuserd arka plan programı.

Çekirdek, yeni COW biçimini kullanmıyor. Dolayısıyla snapuserd bileşeni Android COW biçimi ile çekirdeğin yerleşik biçimi arasındaki istekleri çevirir. biçim:

Android COW biçimi ile çekirdek arasında çeviri istekleri için Snapuserd bileşeni
yerleşik
format

Şekil 3. Android ve Kernel arasında çevirmen olarak anlık mesajlaşmanın akış diyagramı COW biçimleri

Bu çevirme ve sıkıştırma açma işlemleri hiçbir zaman diskte gerçekleşmez. snapuserd bileşeni, çekirdekte gerçekleşen COW okuma ve yazma işlemlerine müdahale eder ve bunları Android COW biçimini kullanarak uygular.

XOR sıkıştırması

Android 13 ve sonraki sürümlerin yüklü olduğu cihazlarda Varsayılan olarak etkin olan ÖZELVEYA sıkıştırma özelliği, kullanıcı alanını etkinleştirir. eski bloklar ve yeni bloklar arasında XOR sıkıştırılmış baytları depolamak için anlık görüntüler. Zaman Sanal A/B güncellemesinde bloktaki yalnızca birkaç bayt değiştirilir. Bu nedenle, XOR sıkıştırılmış depolama şeması, varsayılan depolama şemasından daha az alan kullanır anlık görüntüler tam 4K bayt depolamaz. Anlık görüntü boyutundaki bu azalma Çünkü XOR verileri birçok sıfır içerdiğinden ve ham veri işlemeye kıyasla sıkıştırılmaları daha kolaydır. veya blok verileri. Pixel cihazlarda XVEYA sıkıştırması anlık görüntü boyutunu% 25 oranında küçülterek %40.

Android 13 ve sonraki sürümlere geçen cihazlar için XOR sıkıştırmanın etkinleştirilmesi gerekir. Ayrıntılar için bkz. XOR sıkıştırma.

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

Bu bölümde, API'de kullanılan Sanal A/B sıkıştırma işlemi hakkında Android 13 ve Android 12.

Meta veri okuma (Android 12)

Meta veri, bir snapuserd arka plan programı tarafından oluşturulur. Meta veri birincil olarak birleştirilecek sektörleri temsil eden 8 baytlık iki kimliğin eşlemesi. dm-snapshot dilinde adı disk_exception.

struct disk_exception {
    uint64_t old_chunk;
    uint64_t new_chunk;
};

Disk istisnası, eski bir veri parçası yeni bir parçayla değiştirildiğinde kullanılır.

snapuserd arka plan programı, dahili COW dosyasını COW kitaplığından okur ve dosyası, COW dosyasında bulunan COW işlemlerinin her biri için meta verileri oluşturur.

Meta veri okumaları, dm- snapshot cihazı oluşturulduğunda çekirdekteki dm-snapshot öğesinden başlatılır.

Aşağıdaki şekilde, meta verilerin KS yolu için bir dizi şeması gösterilmektedir inşaat işleri.

Sıra şeması, meta verilerin KS yolu
inşaat

4.Şekil Meta veri oluşturmada KS yolu için dizi akışı

Birleştirme (Android 12)

Başlatma işlemi tamamlandığında, güncelleme motoru, yuvayı başlatma olarak işaretler başarılı olur ve dm-snapshot hedefini dm-snapshot-merge hedef.

dm-snapshot, meta verilerde adım adım ilerler ve her disk için bir birleştirme KS'si başlatır kabul edersiniz. Aşağıda birleştirme KS yoluna ilişkin üst düzey bir genel bakış gösterilmektedir.

KS yolunu birleştirme

5. Şekil. KS yoluna genel bakış

Cihaz, birleştirme işlemi sırasında yeniden başlatılırsa birleştirme işlemi aynı ve birleştirme işlemi tamamlanır.

Cihaz haritalama katmanları

Android 13 ve sonraki sürümlerin yüklü olduğu cihazlarda Sanal A/B sıkıştırmasında anlık görüntü ve anlık görüntü birleştirme işlemleri gerçekleştirilir snapuserd kullanıcı alanı bileşeni tarafından yapılır. Android'e geçen cihazlar için 13 ve sonraki sürümlerde bu özelliğin etkinleştirilmesi gerekir. Örneğin, daha fazla bilgi için Userspace birleştirme.

Aşağıda, sanal A/B sıkıştırma işlemi açıklanmaktadır:

  1. Çerçeve, /system bölümünü bir dm-verity cihazdan ekler. bir dm-user cihazın üzerine yığılıyor. Bu, her G/Ç anlamına gelir. kök dosya sisteminden dm-user hedefine yönlendirilir.
  2. dm-user, G/Ç'yi snapuserd kullanıcı alanı arka plan programına yönlendirir. G/Ç isteği.
  3. Birleştirme işlemi tamamlandığında çerçeve şurada dm-verity daraltılır: üst kısmına (dm-linear) (system_base) eklenir ve dm-user kaldırılır.

Sanal A/B sıkıştırması
işlem

6. Şekil. Sanal A/B sıkıştırma işlemi

Anlık görüntü birleştirme işlemi kesintiye uğrayabilir. Cihaz şu işlem sırasında yeniden başlatılırsa: yeniden başlatma işleminden sonra birleştirme işlemi devam eder.

Başlatma geçişleri

Sıkıştırılmış anlık görüntülerle başlatma yapılırken ilk aşamanın başlatılması gerekir Bölümleri eklemek için snapuserd. Bu durum bir soruna neden oluyor: sepolicy yüklendiğinde ve zorunlu kılındığında snapuserd yanlış bağlama yerleştirilir ve okuma istekleri her şeyi reddedip başarısız olabilirsiniz.

Bu sorunu gidermek için snapuserd, aşağıdaki adımları uygulayarak init ile kilit adımlarında geçiş yapar:

  1. İlk aşama init, RAM'den snapuserd işlemini başlatır ve bir açık dosya tanımlayıcısına izin verir.
  2. İlk aşama init, kök dosya sistemini sistem bölümüne geçirir. daha sonra, init sistem kopyasını yürütür.
  3. init sistem kopyası, birleştirilmiş sepolicy'i bir dizeye okur.
  4. Init, ext4 destekli tüm sayfalarda mlock() yöntemini çağırır. Daha sonra cihaz eşleyici tablolarının yerini alır ve snapuserd durur. Bundan sonra Kilitlenmeye neden olduğundan bölümlerden okunması yasaktır.
  5. snapuserd, init dosyasının açık tanımlayıcısını kullanarak arka plan programını doğru selinux bağlamıyla yeniden başlatır. Cihaz eşleştirme tabloları yeniden etkinleştirilmesi gerekir.
  6. Başlatma, munlockall() yöntemini çağırır. KS'yi tekrar gerçekleştirmek güvenlidir.

Alan kullanımı

Aşağıdaki tabloda farklı OTA'lar için alan kullanımının karşılaştırması verilmiştir mekanizmalarını ele alalım.

Boyut Etkisi A/B olmayan A/B Sanal A/B Sanal A/B (sıkıştırılmış)
Orijinal Fabrika Resmi 4,5 GB süper (3,8G resim + 700 milyon ayrılmış)1 9 GB süper (3, 8G + iki yuva için ayrılmış 700 milyon) 4,5 GB süper (3,8G resim + 700 milyon ayrılmış) 4,5 GB süper (3,8G resim + 700 milyon ayrılmış)
Diğer statik bölümler /cache Yok Yok Yok
OTA sırasında ek depolama alanı (OTA uygulandıktan sonra döndürülen alan) /data üzerinde 1,4 GB 0 /data üzerinde 3,8 GB2 /data üzerinde 2,1 GB2
OTA'yı uygulamak için gereken toplam depolama alanı 5,9 GB3 (süper ve veri) 9 GB (süper) 8,3 GB3 (süper ve veri) 6,6 GB3 (süper ve veri)

1Piksel eşlemesine göre varsayılan düzeni gösterir.

2Yeni sistem görüntüsünün orijinalle aynı boyutta olduğu varsayılır.

3Alan gerekliliği, cihaz yeniden başlatılana kadar geçicidir.

Sanal A/B özelliğini uygulamak veya sıkıştırılmış anlık görüntü özelliklerini kullanmak için şuraya bakın: Sanal A/B'yi Uygulama