Sanal A/B'ye genel bakış

Sanal A/B, Android'in ana güncelleme mekanizmasıdır. Sanal A/B, güncellemelerin alan yükü maliyetini azaltmak için eski A/B güncellemelerinin (A/B sistem güncellemeleri bölümüne bakın) ve A/B dışı güncellemelerin (15'te desteği sonlandırılmıştır) üzerine kuruludur.

Sanal A/B testinde dinamik bölümler için ek bir yuva yoktur. Dinamik bölümler bölümüne bakın. Bunun yerine delta, bir anlık görüntüye yazılır ve başarılı başlatmanın onaylanmasından sonra temel bölümle birleştirilir. Sanal A/B, Android'e özel bir anlık görüntü biçimi kullanır. Sıkıştırılmış anlık görüntüler için COW biçimi konusuna bakın. Bu biçim, anlık görüntülerin sıkıştırılmasına olanak tanır ve disk alanı kullanımını en aza indirir. Tam OTA'da, sıkıştırma ile anlık görüntü boyutu yaklaşık% 45 oranında, artımlı OTA anlık görüntü boyutu ise yaklaşık %55 oranında azaltılır.

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. Sanal A/B şunları sunar:

  • Sanal A/B güncellemeleri, A/B güncellemeleri gibi sorunsuzdur (güncelleme, cihaz çalışırken tamamen arka planda gerçekleşir). Sanal A/B güncellemeleri, cihazın çevrimdışı ve kullanılamaz durumda olduğu süreyi en aza indirir.
  • 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 önyükleme yükleyici tarafından kullanılan bölümleri kopyalayarak minimum düzeyde ek alan kullanır. Diğer güncellenebilir bölümler anlık olarak görüntülenir.

Arka plan ve terminoloji

Bu bölümde, terminoloji tanımlanmakta ve sanal A/B'yi destekleyen teknoloji açıklanmaktadır. OTA yükleme sırasında yeni işletim sistemi verileri, fiziksel bölümler için yeni yuvasına veya Android'e özgü bir COW cihazına yazılır. Cihaz yeniden başlatıldıktan sonra dinamik bölüm verileri, dm-user ve snapuserd daemon'ı kullanılarak temel cihazıyla tekrar birleştirilir. Bu işlem tamamen kullanıcı alanında gerçekleşir.

Device-mapper

Device-mapper, Android'de sık kullanılan bir Linux sanal blok katmanıdır. Dinamik bölümler ile /system gibi bölümler, katmanlı cihazlardan oluşan bir yığındır:

  • Yığının en altında fiziksel süper bölüm bulunur (örneğin, /dev/block/by-name/super).
  • Ortada, süper bölümdeki hangi blokların belirli dinamik bölümü oluşturduğunu belirten bir dm-linear cihazı vardır. Bu, A/B cihazlarda /dev/block/mapper/system_[a|b], A/B olmayan cihazlarda ise /dev/block/mapper/system olarak görünür.
  • Üstte, doğrulanmış bölümler için oluşturulan bir dm-verity cihazı bulunur. Bu cihaz, dm-linear cihazındaki engellemelerin doğru şekilde imzalandığını doğrular. /dev/block/mapper/system-verity olarak görünür ve /system ekleme noktasının kaynağıdır.

Şekil 1'de, /system montaj noktasının altındaki yığının görünümü gösterilmektedir.

Sistem altında bölüm yığınları

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

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

Android 12 ve sonraki sürümlerde, /data bölümündeki alan gereksinimleri yüksek olabileceğinden /data bölümünün daha yüksek alan gereksinimlerini karşılamak için derlemenizde sıkıştırılmış anlık görüntüleri etkinleştirebilirsiniz.

Sanal A/B sıkıştırılmış anlık görüntüleri, Android 12 ve sonraki sürümlerde bulunan aşağıdaki bileşenlerin üzerine kurulmuştur:

  • dm-user, kullanıcı alanının blok cihazları uygulamasına olanak tanıyan FUSE benzeri bir çekirdek modülüdür.
  • snapuserd, yeni bir anlık görüntü biçimini uygulamak için kullanıcı alanında çalışan bir daemon.

Bu bileşenler sıkıştırmayı etkinleştirir. Sıkıştırılmış anlık görüntü özelliklerini uygulamak için yapılan diğer gerekli değişiklikler sonraki bölümlerde verilmiştir: 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 Android'e özel bir COW biçimi kullanır. COW Biçimi, OTA hakkında meta verileri içerir. Ayrıca COW işlemlerini ve yeni işletim sistemi verilerini içeren ayrı arabelleklere sahiptir. Yalnızca yerine koyma işlemlerine (temel görüntüdeki X bloğunu, anlık görüntüdeki Y bloğunun içeriğiyle değiştirme) izin veren çekirdek anlık görüntü biçimine kıyasla Android sıkıştırılmış anlık görüntüler COW biçimi daha etkileyicidir ve aşağıdaki işlemleri destekler:

  • Kopyala: Ana cihazdaki X bloğu, ana cihazdaki Y bloğuyla değiştirilmelidir.
  • Değiştir: Ana cihazdaki X bloğu, anlık görüntüdeki Y bloğunun içeriğiyle değiştirilmelidir. Bu blokların her biri gz sıkıştırılmıştır.
  • Sıfır: Ana cihazdaki X bloğu tamamen sıfırlarla değiştirilmelidir.
  • XOR: COW cihazı, XOR sıkıştırılmış baytları X bloğu ile Y bloğu arasında depolar. (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 ek olarak kopyalama işlemleri de olabilir.

Diskteki tam anlık görüntü düzeni aşağıdaki gibidir:

inek biçimi

Şekil 2. Diskte Android COW Formatı

dm-user

dm-user çekirdek modülü, userspace'ün cihaz-eşleyici blok cihazlarını uygulamasını sağlar. Bir dm-kullanıcı tablo girişi, /dev/dm-user/<control-name> altında çeşitli bir cihaz oluşturur. userspace işlemleri, çekirdekten okuma ve yazma istekleri almak için cihazı yoklayabilir. Her isteğin, kullanıcı alanının doldurulması (okuma için) veya yayılması (yazma için) için ilişkili bir arabelleği bulunur.

dm-user çekirdek modülü, yukarı akış kernel.org kod tabanının parçası olmayan çekirdeğ için kullanıcı tarafından görülebilen yeni bir arayüz sağlar. Bu tarihe kadar Google, Android'deki 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 sıkıştırmasını uygular. Snapuserd, Android COW cihazlarına yazma ve okuma işlemlerinden sorumlu bir kullanıcı alanı daemon'udur. Anlık görüntüye yapılan tüm G/Ç işlemleri bu hizmet üzerinden yapılmalıdır. OTA yükleme sırasında, snapuserd tarafından yeni işletim sistemi verileri anlık görüntüye yazılır (sıkıştırma ile). Meta verilerin ayrıştırılması ve yeni blok verilerinin paketten çıkarılması da burada gerçekleştirilir.

XOR sıkıştırması

Android 13 ve sonraki sürümlerin yüklü olduğu cihazlarda varsayılan olarak etkin olan XOR sıkıştırma özelliği, kullanıcı alanı anlık görüntülerinin eski bloklar ile yeni bloklar arasında XOR sıkıştırılmış baytları depolamasını sağlar. Sanal A/B güncellemesinde bir bloktaki yalnızca birkaç bayt değiştiğinde, XOR sıkıştırma depolama şeması, anlık görüntüler 4K baytın tamamını depolamadığından varsayılan depolama şemasına göre daha az yer kullanır. Anlık görüntü boyutunda bu azalma, XOR verilerinin çok sayıda sıfır içermesi ve ham blok verilerinden daha kolay sıkıştırılabilmesi nedeniyle mümkündür. Pixel cihazlarda ÖZELVEYA sıkıştırması, anlık görüntü boyutunu% 25 ila %40 oranında azaltır.

Android 13 ve sonraki sürümlere yükseltilen cihazlarda XOR sıkıştırması etkinleştirilmelidir. Ayrıntılar için XOR sıkıştırma başlıklı makaleyi inceleyin.

Anlık görüntü birleştirme

Android 13 ve sonraki sürümleri çalıştıran cihazlarda, sanal A/B sıkıştırmadaki anlık görüntü ve anlık görüntü birleştirme işlemleri snapuserd kullanıcı alanı bileşeni tarafından gerçekleştirilir. Android 13 ve sonraki sürümlere yükseltilen cihazlarda bu özellik etkin olmalıdır. Ayrıntılı bilgi için Kullanıcı alanı birleştirme başlıklı makaleyi inceleyin.

Sanal A/B sıkıştırma işlemi aşağıdaki şekilde açıklanmaktadır:

  1. Çerçeve, bir dm-user cihazının üzerine yerleştirilmiş bir dm-verity cihazından /system bölümünü ekler. Bu, kök dosya sisteminden gelen her G/Ç dm-user'a yönlendirildiği anlamına gelir.
  2. dm-user, G/Ç isteklerini işleyen kullanıcı alanı snapuserd daemon'ına yönlendirir.
  3. Birleştirme işlemi tamamlandığında çerçeve, dm-verity öğesini dm-linear (system_base) öğesinin üzerine daraltır ve dm-user öğesini kaldırır.

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

Şekil 3. Sanal A/B sıkıştırma süreci

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

Başlangıç geçişleri

Sıkıştırılmış anlık görüntülerle başlatma yapılırken, bölümleri eklemek için ilk aşama başlatma işlemi snapuserd başlamalıdır. Bu durum bir soruna yol açar: sepolicy yüklendiğinde ve uygulandığında snapuserd yanlış bağlama yerleştirilir ve okuma istekleri selinux'un reddetmesi nedeniyle başarısız olur.

Bu sorunu gidermek için snapuserd, init ile senkronize olarak aşağıdaki şekilde geçiş yapar:

  1. İlk aşama init, RAM'den snapuserd öğesini başlatır ve bir ortam değişkeninde ona bir açık dosya tanımlayıcısı kaydeder.
  2. İlk aşama init, kök dosya sistemini sistem bölümüne değiştirir, ardından init sistem kopyasını yürütür.
  3. init dosyasının sistem kopyası, birleştirilmiş sepolicy dosyasını bir dizeye okur.
  4. Init, ext4 destekli tüm sayfalarda mlock()'ı çağırır. Ardından, anlık görüntü cihazları için tüm cihaz eşleyici tablolarını devre dışı bırakır ve snapuserd'yi durdurur. Bu işlemden sonra kilitlenmeye neden olacağından bölümlerden okumak yasaktır.
  5. snapuserd dosyasının ramdisk kopyasına yönelik açık tanımlayıcıyı kullanarak init, daemon'u doğru selinux bağlamıyla yeniden başlatır. Anlık görüntü cihazları için cihaz eşleyici tabloları yeniden etkinleştirilir.
  6. İlklendirme, munlockall() işlevini çağırır. IO işlemini tekrar gerçekleştirmek güvenlidir.

Alan kullanımı

Aşağıdaki tabloda, Pixel'in işletim sistemi ve OTA boyutlarını kullanan farklı OTA mekanizmalarının alan kullanımı karşılaştırması verilmiştir.

Boyut Etkisi A/B dışı A/B Sanal A/B Sanal A/B (sıkıştırılmış)
Orijinal Fabrika Görüntüsü 4,5 GB süper (3,8G resim + 700 milyon ayrılmış)1 9 GB süper (iki yuva için 3, 8 GB + 700 MB ayrılmış) 4,5 GB süper (3,8 GB resim + 700 MB 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 iade edilen alan) /data üzerinde 1,4 GB 0 /data'da 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)

1: Pixel eşlemeye dayalı varsayılan düzeni gösterir.

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

3Yeniden başlatılana kadar alan gereksinimi geçicidir.

Android 11 Sanal A/B

Sanal A/B'nin Android 11 sürümü, çekirdek COW biçimini kullanarak dinamik bölüme yazdı. Kernel COW biçimi sıkıştırmayı desteklemediğinden bu yöntemin desteği sonlandırıldı.

Android 12 Sanal A/B

Android 12'de sıkıştırma, Android'e özgü bir COW biçiminde desteklenir. Sanal A/B'nin bu sürümü, Android'e özgü COW'un Kernel COW biçimine çevrilmesini gerektiriyordu. Sonunda bu, android 13'te Kernel COW biçimine ve dm-snapshot'e olan bağımlılığı kaldıran bir yöntemle değiştirildi.

Sanal A/B'yi uygulamak veya sıkıştırılmış anlık görüntü özelliklerini kullanmak için Sanal A/B'yi Uygulama başlıklı makaleyi inceleyin.