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.
Ş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.
Ş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:
Ş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.
Ş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.
Ş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:
- Çerçeve, bir
dm-user
aygıtının üzerine yığılmış olan birdm-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. -
dm-user
, G/Ç'yi, G/Ç isteğini işleyen kullanıcı alanısnapuserd
arka plan programına yönlendirir. - Birleştirme işlemi tamamlandığında, çerçeve
dm-verity
verity'yidm-linear
linear'ın (system_base
) üstüne daraltır vedm-user
öğesini kaldırır.
Ş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:
- İlk aşama
init
,snapuserd
başlatır ve bir ortam değişkeninde ona açık bir dosya tanıtıcı kaydeder. - İlk aşama
init
, kök dosya sistemini sistem bölümüne geçirir, ardındaninit
sistem kopyasını yürütür. -
init
sistem kopyası, birleştirilmiş sepolicy'yi bir dizgede okur. -
Init
, tüm ext4 destekli sayfalardamlock()
'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 vesnapuserd
durdurur. Bundan sonra, kilitlenmeye neden olacağı için bölümlerden okumak yasaktır. -
snapuserd
ramdisk kopyasının açık tanımlayıcısını kullanarakinit
, 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. - 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