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 cihazdm-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.
Ş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.
Ş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:
Ş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.
Ş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.
Ş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:
- Çerçeve, bir
dm-verity
cihazının/system
bölümünü, birdm-user
cihazının üstüne yığılmış olarak monte eder. Bu, kök dosya sistemindeki her G/Ç'nindm-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-linear
(system_base
) üzerinedm-verity
daraltır vedm-user
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. 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:
- 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. - Birinci aşama
init
kök dosya sistemini sistem bölümüne geçirir, ardındaninit
sistem kopyasını çalıştırır. -
init
sistem kopyası, birleştirilmiş sepolicy'yi bir dizeye okur. -
Init
tüm ext4 destekli sayfalardamlock()
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 vesnapuserd
durdurur. Bundan sonra bölümlerden okumak yasaktır çünkü bunu yapmak kilitlenmeye neden olur. -
snapuserd
dosyasının 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ü cihazları için cihaz eşleyici tabloları yeniden etkinleştirildi. - 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 cihazdm-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.
Ş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.
Ş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:
Ş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.
Ş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.
Ş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:
- Çerçeve, bir
dm-verity
cihazının/system
bölümünü, birdm-user
cihazının üstüne yığılmış olarak monte eder. Bu, kök dosya sistemindeki her G/Ç'nindm-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-linear
(system_base
) üzerinedm-verity
daraltır vedm-user
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. 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:
- 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. - Birinci aşama
init
kök dosya sistemini sistem bölümüne geçirir, ardındaninit
sistem kopyasını çalıştırır. -
init
sistem kopyası, birleştirilmiş sepolicy'yi bir dizeye okur. -
Init
tüm ext4 destekli sayfalardamlock()
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 vesnapuserd
durdurur. Bundan sonra bölümlerden okumak yasaktır çünkü bunu yapmak kilitlenmeye neden olur. -
snapuserd
dosyasının 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ü cihazları için cihaz eşleyici tabloları yeniden etkinleştirildi. - 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