Sanal A/B'ye genel bakış

Sanal A/B, Android'in temel güncelleme mekanizmasıdır. Sanal A/B, eski A/B güncellemelerinin (bkz. A/B Sistem Güncellemeleri) ve 15'te kullanımdan kaldırılan A/B dışı güncellemelerin üzerine kurulmuştur. Bu sayede, güncellemelerin kapladığı alan azaltılır.

Sanal A/B testinde dinamik bölümler için ek bir yuva yoktur. Dinamik bölümler başlıklı makaleyi inceleyin. Bunun yerine, delta bir anlık görüntüye yazılır ve başarılı bir başlatma işlemi onaylandıktan sonra temel bölüme birleştirilir. Sanal A/B, Android'e özgü bir anlık görüntü biçimi kullanır. Anlık görüntülerin sıkıştırılmasına ve disk alanı kullanımının en aza indirilmesine olanak tanıyan sıkıştırılmış anlık görüntüler için COW biçimi bölümüne bakın. Tam OTA'da sıkıştırma ile anlık görüntü boyutu yaklaşık% 45, artımlı OTA'da ise yaklaşık %55 oranında küçültülür.

Android 12, anlık görüntüsü alınan bölümleri sıkıştırmak için sanal A/B sıkıştırma seçeneği sunar. Sanal A/B testi aşağıdaki özellikleri 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 kalma süresini 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 çekilir.
  • Sanal A/B güncellemeleri, yalnızca önyükleyici tarafından kullanılan bölümleri kopyalayarak minimum ek alan kullanır. Güncellenebilen diğer bölümlerin anlık görüntüsü alınır.

Arka plan ve terminoloji

Bu bölümde, terminoloji tanımlanmakta ve sanal A/B testini destekleyen teknoloji açıklanmaktadır. OTA yüklemesi 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 arka plan programı kullanılarak temel cihaza geri 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ığın gibidir:

  • Yığının en altında fiziksel super bölümü bulunur (örneğin, /dev/block/by-name/super).
  • Ortada, süper bölümdeki hangi blokların belirli bir dinamik bölümü oluşturduğunu belirten bir dm-linear cihazı bulunur. Bu, A/B cihazlarda /dev/block/mapper/system_[a|b], A/B olmayan cihazlarda ise /dev/block/mapper/system olarak görünür.
  • En üstte, doğrulanmış bölümler için oluşturulmuş bir dm-verity cihazı bulunur. Bu cihaz, dm-linear cihazındaki blokların 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 ekleme noktasının altındaki yığın gösterilmektedir.

Sistemin altında bölüm yığını

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

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.

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

  • dm-user: Kullanıcı alanının blok cihazları uygulamasına olanak tanıyan, FUSE'a benzer bir çekirdek modülü.
  • Yeni bir anlık görüntü biçimini uygulamak için kullanılan bir kullanıcı alanı arka plan programı olan snapuserd.

Bu bileşenler sıkıştırmayı sağlar. 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 ile ilgili meta veriler içerir ve COW işlemleri ile yeni işletim sistemi verilerini içeren farklı arabellekleri vardır. Yalnızca değiştirme 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çimiyle karşılaştırıldığında, Android sıkıştırılmış anlık görüntüleri COW biçimi daha açıklayıcıdır ve aşağıdaki işlemleri destekler:

  • Kopya: Ana cihazdaki X bloğu, ana cihazdaki Y bloğuyla değiştirilmelidir.
  • Değiştir: Temel 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 ile sıkıştırılmıştır.
  • Sıfır: Temel cihazdaki X bloğu tamamen sıfırlarla değiştirilmelidir.
  • XOR: COW cihazı, X bloğu ile Y bloğu arasında XOR sıkıştırılmış baytları saklar. (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 şu şekilde görünür:

inek biçimi

Şekil 2. Android COW Format on Disk

dm-user

dm-user çekirdek modülü, userspace'nın device-mapper blok cihazlarını uygulamasına olanak tanır. Bir dm-user tablosu girişi, /dev/dm-user/<control-name> altında çeşitli bir cihaz oluşturur. Bir userspace işlemi, çekirdekten okuma ve yazma istekleri almak için cihaza yoklama yapabilir. Her istekle ilişkili bir kullanıcı alanı arabelleği vardır. Bu arabellek, okuma için doldurulur, yazma için ise yayılır.

dm-user çekirdek modülü, çekirdeğe yönelik, kullanıcı tarafından görülebilen yeni bir arayüz sağlar. Bu arayüz, yukarı akış kernel.org kod tabanının bir parçası değildir. Google, bu durum gerçekleşene kadar Android'deki dm-user arayüzünü değiştirme hakkını saklı tutar.

snapuserd

snapuserd Kullanıcı alanı bileşeni, dm-user sanal A/B sıkıştırmasını uygular. Snapuserd, Android COW cihazlarına yazma ve bu cihazlardan okuma işlemlerinden sorumlu bir kullanıcı alanı arka plan programıdır. Anlık görüntüye yönelik tüm G/Ç işlemleri bu hizmet üzerinden yapılmalıdır. OTA kurulumu sırasında, yeni işletim sistemi verileri snapuserd tarafından (sıkıştırma ile) anlık görüntüye yazılır. Meta verilerin ayrıştırılması ve yeni blok verilerinin açılması da burada yapılır.

XOR sıkıştırması

Android 13 ve sonraki sürümlerle kullanıma sunulan cihazlarda, varsayılan olarak etkinleştirilen 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 blokta yalnızca birkaç bayt değiştirildiğinde, XOR sıkıştırma depolama şeması, anlık görüntüler tam 4K bayt depolamadığından varsayılan depolama şemasından daha az alan kullanır. XOR verileri çok sayıda sıfır içerdiğinden ve ham blok verilerine kıyasla daha kolay sıkıştırılabildiğinden anlık görüntü boyutunda bu azalma mümkündür. Pixel cihazlarda XOR sıkıştırma, anlık görüntü boyutunu %25-40 oranında küçültür.

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

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

Android 13 ve sonraki sürümlerle kullanıma sunulan 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ükseltme yapan cihazlarda bu özellik etkinleştirilmelidir. Ayrıntılı bilgi için Userspace merge başlıklı makaleyi inceleyin.

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

  1. Çerçeve, dm-user cihazın üzerine yerleştirilmiş bir dm-verity cihazdan /system bölümünü monte eder. Bu, kök dosya sisteminden gelen her G/Ç'nin dm-user'ya yönlendirildiği anlamına gelir.
  2. dm-user, G/Ç'yi, G/Ç isteğini işleyen userspace snapuserd arka plan programına yönlendirir.
  3. Birleştirme işlemi tamamlandığında çerçeve dm-verity, dm-linear (system_base) üzerinde daralır ve dm-user kaldırılı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 birleştirme işlemi yeniden başlatıldıktan sonra devam eder.

Geçişleri başlatma

Sıkıştırılmış anlık görüntülerle başlatma sırasında, bölümleri bağlamak için birinci aşama başlatma işlemi başlatılmalıdır.snapuserd Bu durum bir soruna yol açar: sepolicy yüklendiğinde ve zorunlu kılındığında snapuserd yanlış bağlama yerleştirilir ve okuma istekleri, SELinux retleriyle başarısız olur.

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

  1. Birinci aşamada, initramdiskten snapuserd başlatılır ve açık bir dosya tanımlayıcısı, ortam değişkeni olarak kaydedilir.
  2. Birinci aşamada init, kök dosya sistemini sistem bölümüne geçirir, ardından init sistem kopyasını yürütür.
  3. init sistem kopyası, birleştirilmiş sepolicy'yi bir dizeye okur.
  4. Init, ext4 ile desteklenen tüm sayfalarda mlock()'ı çağırır. Ardından, anlık görüntü cihazları için tüm device-mapper tablolarını devre dışı bırakır ve snapuserd işlemini durdurur. Bu işlemden sonra, kilitlenmeye neden olacağı için bölümlerden okuma yapmak yasaktır.
  5. snapuserd'nın ramdisk kopyasına açık tanımlayıcıyı kullanarak init, arka plan programını doğru SELinux bağlamıyla yeniden başlatır. Anlık görüntü cihazları için device-mapper tabloları yeniden etkinleştirilir.
  6. Init, munlockall() işlevini çağırır. Bu durumda, G/Ç işlemini tekrar gerçekleştirmek güvenlidir.

Alan kullanımı

Aşağıdaki tabloda, Pixel'in işletim sistemi ve OTA boyutları kullanılarak farklı OTA mekanizmalarının alan kullanımı karşılaştırılmaktadır.

Boyut Etkisi A/B olmayan 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,8 GB görüntü + 700 MB ayrılmış)1 9 GB süper (3,8 GB + 700 MB ayrılmış, iki yuva için) 4,5 GB süper (3,8 GB görüntü + 700 MB ayrılmış) 4,5 GB süper (3,8 GB görüntü + 700 MB ayrılmış)
Diğer statik bölümler /cache Yok Yok Yok
OTA sırasında ek depolama alanı (OTA uygulandıktan sonra alan geri döner) /data üzerinde 1,4 GB 0 3,8 GB2 /data üzerinde /data üzerinde 2,1 GB2
OTA 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şlemeye dayalı olarak varsayılan düzeni gösterir.

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

3Alan gereksinimi, yeniden başlatma işlemine kadar geçicidir.

Android 11'de sanal A/B

Sanal A/B'nin Android 11 sürümü, Kernel COW biçimini kullanarak dinamik bölüme yazıyordu. Çekirdek COW biçimi sıkıştırmayı desteklemediğinden bu özellik kullanımdan kaldırıldı.

Android 12'de 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ünde, Android'e özgü COW'un Kernel COW biçimine çevrilmesi gerekiyordu. Bu özellik, Android 13'te Kernel COW biçimine olan bağımlılığı ve dm-snapshot'yı kaldıran bir özellikle 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.