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 üzere sanal A/B aracılığıyla birleştirildi. Android 12, anlık görüntülenmiş 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 kusursuzdur . Sanal A/B güncellemeleri, bir cihazın çevrimdışı ve kullanılamaz 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ükleyici tarafından kullanılan bölümleri çoğaltarak minimum miktarda ekstra 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ümde terminoloji tanımlanır ve sanal A/B'yi destekleyen teknoloji açıklanır.

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ıtlardan oluşan bir yığındır:

  • Yığı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 verilen bölümü oluşturduğunu belirten bir dm-linear aygıt bulunur. Bu, bir A/B cihazında /dev/block/mapper/system_[a|b] olarak veya A/B olmayan bir cihazda /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 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östermektedir.

Partition stacking underneath system

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

dm-snapshot

Virtual A/B, bir depolama cihazının durumunun anlık görüntüsünü almak için bir cihaz eşleme 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 cihaz 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 karşılayacak 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. Anlık görüntü cihazından yapılan okumalar, erişilen verilerin anlık görüntü tarafından değiştirilip değiştirilmediğine bağlı olarak temel cihazdan veya COW cihazından okunur.
  • Kaynak 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 bölümünün daha yüksek alan gereksinimlerini karşılamak için yapınızdaki 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 kurulmuştur:

  • dm-user , kullanıcı alanının blok aygıtları uygulamasına olanak tanıyan, FUSE'a benzer bir çekirdek modülü.
  • snapuserd , yeni bir anlık görüntü formatını uygulamaya yönelik 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 verilmektedir: 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 formatına benzer şekilde, sıkıştırılmış anlık görüntülere yönelik COW formatı, meta veri ve verilerin alternatif bölümlerine sahiptir. Orijinal formatın meta verilerine 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ülerin COW biçimi daha anlamlıdır ve aşağıdaki işlemleri destekler:

  • Kopyala : Temel cihazdaki X bloğu, temel cihazdaki Y bloğu ile 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 sıkıştırılmıştır.
  • Sıfır : Temel cihazdaki X bloğunun tamamı sıfırlarla değiştirilmelidir.
  • XOR : COW cihazı, XOR sıkıştırılmış baytlarını X bloğu ile Y bloğu arasında saklar. (Android 13 ve üzeri sürümlerde mevcuttur.)

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

Android 12'de dm kullanıcısı

dm-user çekirdek modülü, userspace aygıt eşleyici blok aygıtlarını uygulamasını sağlar. Bir dm-user tablosu girişi /dev/dm-user/<control-name> altında çeşitli bir aygıt oluşturur. Bir userspace işlemi, çekirdekten okuma ve yazma isteklerini 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 vardır.

dm-user çekirdek modülü, çekirdeğe, yukarı yöndeki kernel.org kod tabanının parçası olmayan, kullanıcıların görebileceği yeni bir arayüz sağlar. Bu gerçekleşene kadar Google, 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.

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, COW bunun yerine snapuserd arka plan programının bir örneğine bağlı bir dm-user cihazı olarak işlev görür.

Çekirdek yeni COW formatını kullanmıyor. 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'ın akış şeması

Bu çeviri ve açma işlemi hiçbir zaman diskte gerçekleşmez. snapuserd bileşeni, çekirdekte meydana gelen COW okuma ve yazma işlemlerini yakalar ve bunları Android COW formatını kullanarak uygular.

XOR sıkıştırması

Android 13 ve üzeri sürümlerle başlatılan cihazlarda, varsayılan olarak etkin olan XOR sıkıştırma özelliği, kullanıcı alanı anlık görüntülerinin eski bloklar ve yeni bloklar arasında XOR sıkıştırılmış baytları depolamasına olanak tanır. 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 4K baytın tamamını depolamadığından, varsayılan depolama şemasından daha az alan kullanır. Anlık görüntü boyutundaki bu azalma, XOR verilerinin çok sayıda sıfır içermesi ve sıkıştırılmasının ham blok verilerinden daha kolay olması 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ükseltilen cihazlarda XOR sıkıştırmasının etkinleştirilmesi gerekir. Ayrıntılar için bkz. XOR sıkıştırması .

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

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

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 baytlık iki kimliğin eşlenmesinden oluşur. 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 disk istisnası kullanılır.

Bir snapuserd arka plan programı, dahili COW dosyasını COW kütüphanesi aracılığıyla okur ve COW dosyasında mevcut olan COW işlemlerinin her biri için meta verileri oluşturur.

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

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

Sequence diagram, IO path for metadata construction

Şekil 4. Meta veri yapımında GÇ 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 değiştirerek birleştirmeyi başlatır.

dm-snapshot meta verilerde gezinir ve her disk istisnası için bir birleştirme GÇ'si başlatır. Birleştirme G/Ç yoluna üst düzey bir genel bakış aşağıda gösterilmiştir.

Merge IO path

Şekil 5. Birleştirme GÇ yoluna genel bakış

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

Cihaz eşleyici katmanlaması

Android 13 ve sonraki sürümleriyle başlatılan cihazlar 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 özelliğin etkinleştirilmesi gerekir. 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-verity cihazının /system bölümünü, bir dm-user cihazının üstüne yığılmış olarak monte eder. Bu, kök dosya sistemindeki her G/Ç'nin 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-linear ( system_base ) üzerine dm-verity daraltır ve dm-user 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. Birleştirme işlemi sırasında cihaz yeniden başlatılırsa, birleştirme işlemi yeniden başlatmanın ardından devam eder.

Geçişleri başlat

Sıkıştırılmış anlık görüntülerle önyükleme yaparken, ilk aşama init'in bölümleri bağlamak için snapuserd başlatması gerekir. Bu bir sorun teşkil ediyor: sepolicy yüklendiğinde ve uygulandığında snapuserd yanlış bağlama yerleştiriliyor ve okuma istekleri selinux reddiyle başarısız oluyor.

Bu sorunu çözmek için snapuserd , init ile kilit adımında aşağıdaki gibi geçiş yapar:

  1. Birinci aşama init , snapuserd ramdisk'ten başlatır ve ona bir ortam değişkeninde açık bir dosya tanımlayıcı kaydeder.
  2. Birinci aşama init kök dosya sistemini sistem bölümüne geçirir, ardından init sistem kopyasını çalıştırır.
  3. init sistem kopyası, birleştirilmiş sepolicy'yi bir dizeye okur.
  4. Init tüm ext4 destekli sayfalarda mlock() u çağırır. Daha sonra 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 bölümlerden okumak yasaktır çünkü bunu yapmak kilitlenmeye neden olur.
  5. snapuserd dosyasının 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ü cihazları için cihaz eşleyici tabloları yeniden etkinleştirildi.
  6. Init, munlockall() çağırır - GÇ'yi tekrar gerçekleştirmek güvenlidir.

Alan kullanımı

Aşağıdaki tablo, Pixel'in işletim sistemi ve OTA boyutlarını kullanan farklı OTA mekanizmaları için alan kullanımının 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 Görüntüsü 4,5 GB süper (3,8G görüntü + 700 milyon ayrılmış) 1 9GB süper (3,8G + 700M ayrılmış, iki yuva için) 4,5 GB süper (3,8G görüntü + 700 milyon ayrılmış) 4,5 GB süper (3,8G görüntü + 700 milyon 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 döndürülen alan) 1,4 GB açık/veri 0 3,8 GB 2 açık/veri 2,1 GB 2 açık/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,6 GB 3 (süper ve veri)

1 Piksel eşlemeye dayalı olarak varsayılan düzeni belirtir.

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

3 Yeniden başlatmaya kadar alan gereksinimi 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

,

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 üzere sanal A/B aracılığıyla birleştirildi. Android 12, anlık görüntülenmiş 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 kusursuzdur . Sanal A/B güncellemeleri, bir cihazın çevrimdışı ve kullanılamaz 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ükleyici tarafından kullanılan bölümleri çoğaltarak minimum miktarda ekstra 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ümde terminoloji tanımlanır ve sanal A/B'yi destekleyen teknoloji açıklanır.

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ıtlardan oluşan bir yığındır:

  • Yığı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 verilen bölümü oluşturduğunu belirten bir dm-linear aygıt bulunur. Bu, bir A/B cihazında /dev/block/mapper/system_[a|b] olarak veya A/B olmayan bir cihazda /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 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östermektedir.

Partition stacking underneath system

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

dm-snapshot

Virtual A/B, bir depolama cihazının durumunun anlık görüntüsünü almak için bir cihaz eşleme 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 cihaz 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 karşılayacak 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. Anlık görüntü cihazından yapılan okumalar, erişilen verilerin anlık görüntü tarafından değiştirilip değiştirilmediğine bağlı olarak temel cihazdan veya COW cihazından okunur.
  • Kaynak 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 bölümünün daha yüksek alan gereksinimlerini karşılamak için yapınızdaki 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 kurulmuştur:

  • dm-user , kullanıcı alanının blok aygıtları uygulamasına olanak tanıyan, FUSE'a benzer bir çekirdek modülü.
  • snapuserd , yeni bir anlık görüntü formatını uygulamaya yönelik 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 verilmektedir: 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 formatına benzer şekilde, sıkıştırılmış anlık görüntülere yönelik COW formatı, meta veri ve verilerin alternatif bölümlerine sahiptir. Orijinal formatın meta verilerine 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ülerin COW biçimi daha anlamlıdır ve aşağıdaki işlemleri destekler:

  • Kopyala : Temel cihazdaki X bloğu, temel cihazdaki Y bloğu ile 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 sıkıştırılmıştır.
  • Sıfır : Temel cihazdaki X bloğunun tamamı sıfırlarla değiştirilmelidir.
  • XOR : COW cihazı, XOR sıkıştırılmış baytlarını X bloğu ile Y bloğu arasında saklar. (Android 13 ve üzeri sürümlerde mevcuttur.)

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

Android 12'de dm kullanıcısı

dm-user çekirdek modülü, userspace aygıt eşleyici blok aygıtlarını uygulamasını sağlar. Bir dm-user tablosu girişi /dev/dm-user/<control-name> altında çeşitli bir aygıt oluşturur. Bir userspace işlemi, çekirdekten okuma ve yazma isteklerini 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 vardır.

dm-user çekirdek modülü, çekirdeğe, yukarı yöndeki kernel.org kod tabanının parçası olmayan, kullanıcıların görebileceği yeni bir arayüz sağlar. Bu gerçekleşene kadar Google, 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.

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, COW bunun yerine snapuserd arka plan programının bir örneğine bağlı bir dm-user cihazı olarak işlev görür.

Çekirdek yeni COW formatını kullanmıyor. 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'ın akış şeması

Bu çeviri ve açma işlemi hiçbir zaman diskte gerçekleşmez. snapuserd bileşeni, çekirdekte meydana gelen COW okuma ve yazma işlemlerini yakalar ve bunları Android COW formatını kullanarak uygular.

XOR sıkıştırması

Android 13 ve üzeri sürümlerle başlatılan cihazlarda, varsayılan olarak etkin olan XOR sıkıştırma özelliği, kullanıcı alanı anlık görüntülerinin eski bloklar ve yeni bloklar arasında XOR sıkıştırılmış baytları depolamasına olanak tanır. 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 4K baytın tamamını depolamadığından, varsayılan depolama şemasından daha az alan kullanır. Anlık görüntü boyutundaki bu azalma, XOR verilerinin çok sayıda sıfır içermesi ve sıkıştırılmasının ham blok verilerinden daha kolay olması 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ükseltilen cihazlarda XOR sıkıştırmasının etkinleştirilmesi gerekir. Ayrıntılar için bkz. XOR sıkıştırması .

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

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

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 baytlık iki kimliğin eşlenmesinden oluşur. 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 disk istisnası kullanılır.

Bir snapuserd arka plan programı, dahili COW dosyasını COW kütüphanesi aracılığıyla okur ve COW dosyasında mevcut olan COW işlemlerinin her biri için meta verileri oluşturur.

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

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

Sequence diagram, IO path for metadata construction

Şekil 4. Meta veri yapımında GÇ 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 değiştirerek birleştirmeyi başlatır.

dm-snapshot meta verilerde gezinir ve her disk istisnası için bir birleştirme GÇ'si başlatır. Birleştirme G/Ç yoluna üst düzey bir genel bakış aşağıda gösterilmiştir.

Merge IO path

Şekil 5. Birleştirme GÇ yoluna genel bakış

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

Cihaz eşleyici katmanlaması

Android 13 ve sonraki sürümleriyle başlatılan cihazlar 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 özelliğin etkinleştirilmesi gerekir. 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-verity cihazının /system bölümünü, bir dm-user cihazının üstüne yığılmış olarak monte eder. Bu, kök dosya sistemindeki her G/Ç'nin 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-linear ( system_base ) üzerine dm-verity daraltır ve dm-user 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. Birleştirme işlemi sırasında cihaz yeniden başlatılırsa, birleştirme işlemi yeniden başlatmanın ardından devam eder.

Geçişleri başlat

Sıkıştırılmış anlık görüntülerle önyükleme yaparken, ilk aşama init'in bölümleri bağlamak için snapuserd başlatması gerekir. Bu bir sorun teşkil ediyor: sepolicy yüklendiğinde ve uygulandığında snapuserd yanlış bağlama yerleştiriliyor ve okuma istekleri selinux reddiyle başarısız oluyor.

Bu sorunu çözmek için snapuserd , init ile kilit adımında aşağıdaki gibi geçiş yapar:

  1. Birinci aşama init , snapuserd ramdisk'ten başlatır ve ona bir ortam değişkeninde açık bir dosya tanımlayıcı kaydeder.
  2. Birinci aşama init kök dosya sistemini sistem bölümüne geçirir, ardından init sistem kopyasını çalıştırır.
  3. init sistem kopyası, birleştirilmiş sepolicy'yi bir dizeye okur.
  4. Init tüm ext4 destekli sayfalarda mlock() u çağırır. Daha sonra 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 bölümlerden okumak yasaktır çünkü bunu yapmak kilitlenmeye neden olur.
  5. snapuserd dosyasının 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ü cihazları için cihaz eşleyici tabloları yeniden etkinleştirildi.
  6. Init, munlockall() çağırır - GÇ'yi tekrar gerçekleştirmek güvenlidir.

Alan kullanımı

Aşağıdaki tablo, Pixel'in işletim sistemi ve OTA boyutlarını kullanan farklı OTA mekanizmaları için alan kullanımının 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 Görüntüsü 4,5 GB süper (3,8G görüntü + 700 milyon ayrılmış) 1 9GB süper (3,8G + 700M ayrılmış, iki yuva için) 4,5 GB süper (3,8G görüntü + 700 milyon ayrılmış) 4,5 GB süper (3,8G görüntü + 700 milyon 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 döndürülen alan) 1,4 GB açık/veri 0 3,8 GB 2 açık/veri 2,1 GB 2 açık/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,6 GB 3 (süper ve veri)

1 Piksel eşlemeye dayalı olarak varsayılan düzeni gösterir.

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

3 Yeniden başlatmaya kadar alan gereksinimi geçicidir.

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