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üncellemeleri, A/B güncellemeleri gibi sorunsuzdur . 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ınabilir. Yeni işletim sistemi önyükleme yapamazsa, cihazlar otomatik olarak önceki sürüme geri döner.
  • Sanal A/B güncellemeleri, yalnızca önyükleyici tarafından kullanılan bölümleri çoğaltarak minimum fazladan alan kullanır. Diğer güncellenebilir bölümlerin anlık görüntüsü alınır.

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. Dinamik bölümlerle , /system gibi bölümler, katmanlı aygıt yığınıdır:

  • Yığının 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 verilen bölümü oluşturduğunu belirten bir dm-linear aygıt bulunur. Bu, A/B aygıtında /dev/block/mapper/system_[a|b] veya A/B olmayan bir aygıtta /dev/block/mapper/system olarak görünür.
  • En üstte, doğrulanmış bölümler için oluşturulmuş bir dm-verity aygıtı 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 bağlama noktasının kaynağıdır.

Şekil 1, /system bağlama noktasının altındaki yığının nasıl göründüğünü gösterir.

Partition stacking underneath system

Şekil 1. /system bağlama noktasının altındaki yığın

dm-anlık görüntü

Sanal A/B, bir depolama aygıtının durumunun anlık görüntüsünü almak için bir aygıt eşleyici modülü olan dm-snapshot dayanır. dm-snapshot kullanırken, oyunda dört cihaz vardır:

  • Temel cihaz, anlık görüntüsü alınan cihazdır. Bu sayfada, temel aygıt her zaman sistem veya satıcı gibi dinamik bir bölümdür.
  • Temel cihazdaki değişiklikleri günlüğe kaydetmek için yazma üzerine kopyalama (COW) 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ı, snapshot hedefi kullanılarak oluşturulur. 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.
  • Orijin cihazı, snapshot-origin hedefi kullanılarak oluşturulur. Doğrudan temel cihazdan okunan kaynak cihaza okur. Kaynak cihaza yazar, doğrudan temel cihaza yazar, ancak orijinal veriler COW cihazına yazılarak yedeklenir.

Device mapping for dm-snapshot

Ş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ündeki alan gereksinimleri yüksek olabileceğinden, /data /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üler, Android 12 ve sonraki sürümlerde bulunan aşağıdaki bileşenlerin üzerine inşa edilmiştir:

  • dm-user , kullanıcı alanının blok aygıtları uygulamasına izin veren FUSE'ye benzer bir çekirdek modülü.
  • snapuserd , yeni bir anlık görüntü biçimi uygulamak için bir kullanıcı alanı arka plan programı.

Bu bileşenler sıkıştırmayı sağlar. Sıkıştırılmış anlık görüntü yeteneklerini 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 formatı , dm-user ve Snapuserd .

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

Android 12 ve sonraki sürümlerde, sıkıştırılmış anlık görüntüler COW biçimini 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 biçimin meta verileri yalnızca değiştirme işlemleri için izin verilir: Temel görüntüdeki X bloğunu, anlık görüntüdeki Y bloğunun içeriğiyle değiştirin. Sıkıştırılmış anlık görüntüler COW formatı daha anlamlıdır ve aşağıdaki işlemleri destekler:

  • Kopyala : Temel cihazdaki Blok X , temel cihazdaki blok Y ile değiştirilmelidir.
  • Değiştir : Temel cihazdaki Blok X , anlık görüntüdeki blok Y'nin içeriğiyle değiştirilmelidir. Bu blokların her biri gz sıkıştırılmıştır.
  • Sıfır : Temel cihazdaki Blok X , tüm sıfırlarla değiştirilmelidir.
  • XOR : COW aygıtı XOR sıkıştırılmış baytlarını X bloğu ve Y bloğu arasında saklar . (Android 13 ve sonraki sürümlerde mevcuttur.)

Tam OTA güncellemeleri, yalnızca değiştirme ve sıfır işlemlerinden oluşur. Artımlı OTA güncellemeleri ayrıca kopyalama işlemlerine sahip olabilir.

Android 12'de dm kullanıcısı

dm-user kernel modülü, userspace cihaz eşleyici blok cihazlarını uygulamasını sağlar. 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 cihazı yoklayabilir. 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ü, çekirdeğe, yukarı akış kernel.org kod tabanının parçası olmayan, kullanıcı tarafından görülebilen yeni bir arabirim sağlar. Olana kadar Google, Android'deki dm-user arayüzünü değiştirme hakkını saklı tutar.

anlık kullanıcı

dm-user snapuserd kullanıcı alanı bileşeni, Sanal A/B sıkıştırmasını uygular.

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 aygıtı ham bir dosyadır. Sıkıştırma etkinleştirildiğinde, COW bunun yerine snapuserd arka plan programının bir örneğine bağlı olan bir dm-user cihazı olarak işlev görür.

Çekirdek, yeni COW biçimini kullanmaz. Böylece snapuserd bileşeni, istekleri Android COW formatı ile çekirdeğin yerleşik formatı arasında çevirir:

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

Şekil 3. Android ve Kernel COW formatları arasında çevirmen olarak snapuserd'in akış şeması

Bu çeviri ve açma diskte asla gerçekleşmez. snapuserd bileşeni, çekirdekte meydana gelen COW okuma ve yazma işlemlerini durdurur ve bunları Android COW biçimini kullanarak uygular.

XOR sıkıştırması

Android 13 ve sonraki sürümlerle başlatılan cihazlar için, varsayılan olarak etkinleştirilen XOR sıkıştırma özelliği, kullanıcı alanı anlık görüntülerinin XOR sıkıştırılmış baytlarını eski bloklar ve yeni bloklar arasında depolamasını sağlar. Sanal A/B güncellemesinde bir blokta yalnızca birkaç bayt değiştirildiğinde, anlık görüntüler tam 4K bayt depolamadığından XOR sıkıştırma depolama şeması varsayılan depolama şemasından daha az alan kullanır. Anlık görüntü boyutundaki bu azalma, XOR verilerinin birçok sıfır içermesi ve ham blok verilerinden daha kolay sıkıştırılması nedeniyle mümkündür. Pixel cihazlarda XOR 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ükseltme yapan cihazlar için XOR sıkıştırması etkinleştirilmelidir. Ayrıntılar için XOR sıkıştırmasına bakın.

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

Bu bölüm, Android 13 ve Android 12'de kullanılan Sanal A/B sıkıştırma işlemi hakkında ayrıntılar sağlar.

Meta verileri okuma (Android 12)

Meta veriler, bir snapuserd arka plan programı tarafından oluşturulur. Meta veriler öncelikle, birleştirilecek sektörleri temsil eden, her biri 8 bayt olan iki kimliğin eşlenmesidir. dm-snapshot buna disk_exception denir.

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 arka plan programı, dahili COW dosyasını COW kitaplığı aracılığıyla okur ve COW dosyasında bulunan COW işlemlerinin her biri için meta verileri oluşturur.

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

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

Şekil 4. Meta veri yapısında IO yolu için sıra akışı

Birleştirme (Android 12)

Önyükleme işlemi tamamlandıktan sonra, güncelleme motoru yuvayı önyükleme başarılı olarak işaretler ve dm-snapshot hedefini dm-snapshot-merge hedefine çevirerek birleştirmeyi başlatır.

dm-snapshot , meta verilerde gezinir ve her disk istisnası için bir birleştirme GÇ'sini 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 IO yoluna genel bakış

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

Cihaz eşleyici katmanlaması

Android 13 ve sonraki sürümlerle başlatılan aygıtlar için, Sanal A/B sıkıştırmasındaki 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ılar için bkz. Kullanıcı alanı birleştirme .

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

  1. Çerçeve, bir dm-user aygıtının üzerine yığılmış olan bir dm-verity aygıtının /system bölümünü bağlar. Bu, kök dosya sisteminden gelen her G/ dm-user yönlendirildiği anlamına gelir.
  2. dm-user , G/Ç'yi, G/Ç isteğini işleyen kullanıcı alanı snapuserd arka plan programına yönlendirir.
  3. Birleştirme işlemi tamamlandığında, çerçeve dm-verity verity'yi dm-linear linear'ın ( system_base ) üstüne daraltır ve dm-user öğesini kaldırır.

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

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

Anlık görüntü birleştirme işlemi kesintiye uğrayabilir. Aygıt birleştirme işlemi sırasında yeniden başlatılırsa, yeniden başlatmanın ardından birleştirme işlemi devam eder.

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

Sıkıştırılmış anlık görüntülerle önyükleme yaparken, bölümleri monte etmek için ilk aşama başlatma snapuserd başlatmalıdır. Bu bir sorun yaratır: sepolicy yüklendiğinde ve uygulandığında, snapuserd yanlış bağlama yerleştirilir ve okuma istekleri selinux reddi ile başarısız olur.

Bunu ele almak için, snapuserd aşağıdaki gibi init ile kilit adımlı geçişler yapar:

  1. İlk aşama init , snapuserd başlatır ve bir ortam değişkeninde ona açık bir dosya tanıtıcı kaydeder.
  2. İlk aşama 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 dizgede okur.
  4. Init , tüm ext4 destekli sayfalarda mlock() 'u çağırır. Ardından, anlık görüntü aygıtları için tüm aygıt eşleyici tablolarını devre dışı bırakır ve snapuserd durdurur. Bundan sonra, kilitlenmeye neden olacağı için bölümlerden okumak yasaktır.
  5. snapuserd ramdisk kopyasının açık tanımlayıcısını kullanarak init , arka plan programını doğru selinux bağlamıyla yeniden başlatır. Anlık görüntü aygıtları için aygıt eşleyici tabloları yeniden etkinleştirilir.
  6. Init, munlockall() işlevini çağırır - IO'yu yeniden gerçekleştirmek güvenlidir.

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 süper (3,8 GB resim + 700 milyon ayrılmış) 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 (OTA uygulandıktan sonra geri dönen alan) 1.4 GB /veri 0 3.8GB 2 açık /veri 2.1GB 2 açık /veri
OTA'yı uygulamak için gereken toplam depolama alanı 5,9 GB 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şlemeye dayalı varsayılan düzeni gösterir.

2 Yeni sistem görüntüsünün orijinal ile aynı boyutta olduğunu varsayar.

3 Alan gereksinimi, yeniden başlatılıncaya kadar geçicidir.

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