Kullanıcı Verileri Kontrol Noktası

Android 10'da, kullanıcı verileri kontrol noktası (UDC) Android kablosuz ağa bağlıyken önceki durumuna dönmesini sağlar. (OTA) güncellemesi başarısız oldu. UDC sayesinde, Android OTA güncellemesi başarısız olursa cihaz güvenli bir şekilde önceki durumuna geri dönebilir. Her ne kadar A/B güncellemeleri erken başlatma, geri alma için bu sorunu çözer kullanıcı verileri bölümü (/data üzerine eklenir) değiştirildiğinde desteklenmemektedir.

UDC, cihazın değiştirildikten sonra bile kullanıcı verileri bölümünü geri almasını sağlar. UDC özelliği bunu kullanıldığında, dosya sistemi kontrol noktaları, bootloader A/B mekanizmasıyla entegrasyon ve aynı zamanda A/B olmayan güncellemeler, anahtar sürümü bağlama ve anahtar geri alma desteği önlemede çok etkilidir.

Kullanıcıya etkisi

UDC özelliği, daha az kullanıcı kaybettiği için kullanıcılar için OTA güncelleme deneyimini iyileştirir. OTA güncellemesi başarısız olduğunda bu kullanıcıların verilerini görebilirsiniz. Bu, destek çağrılarının sayısını azaltabilir güncelleme sürecinde sorunla karşılaşan kullanıcılardan. Ancak OTA güncellemesi başarısız olduğunda kullanıcılar cihazın birden çok kez yeniden başlatıldığını fark edebilir.

İşleyiş şekli

Farklı dosya sistemlerinde kontrol noktası işlevi

UDC, F2FS dosya sistemi için yukarı akışa kontrol noktası işlevini ekler. 4.20 Linux çekirdeği ve cihazlar tarafından desteklenen tüm yaygın çekirdeklere geri bağlantı verir Android 10 yüklü halde.

Diğer dosya sistemlerinde UDC, kontrol noktası işlevi için dm_bow adlı bir cihaz eşleyici sanal cihazı kullanır. dm_bow, cihaz ile dosya arasında durur bahsedeceğim. Bir bölüm monte edildiğinde, dosya sisteminin tüm boş bloklarda trim komutları yayınlamasına neden olan bir kırpma işlemi gerçekleştirilir. dm_bow bu kırpmaları durdurur ve ücretsiz bir engellenenler listesi oluşturmak için kullanır. Ardından okuma ve yazma işlemleri, değiştirilmeden cihaza gönderilir. Ancak yazma işlemine izin verilmeden önce, geri yükleme için gereken veriler boş bir bloğa yedeklenir.

Kontrol noktası süreci

checkpoint=fs/block işareti içeren bir bölüm eklendiğinde, Android çağrıları cihazın mevcut verileri geri yüklemesine izin vermek için sürücüde restoreCheckpoint kontrol noktası olabilir. init, daha sonraneedsCheckpoint cihaz bootloader A/B durumundadır veya güncellemeyi yeniden deneme seçeneğini ayarlamıştır sayısı. İkisinden biri doğruysa Android, ekleme eklemek için createCheckpoint öğesini çağırır işaretleyin veya dm_bow cihazı oluşturun.

Bölüm eklendikten sonra, kırpma işlemlerini yapmak için kontrol noktası kodu çağrılır. Ardından, önyükleme işlemi normal şekilde devam eder. LOCKED_BOOT_COMPLETE noktasında Android, mevcut kontrol noktasını kaydetmek için commitCheckpoint'ı çağırır ve güncelleme normal şekilde devam eder.

Keymaster anahtarlarını yönetme

Anahtar yöneticisi anahtarları, cihaz şifreleme veya başka amaçlar için kullanılır. Android, bu anahtarları yönetmek için anahtar silme çağrılarını kontrol noktası kaydedilene kadar geciktirir.

Sağlığı izleme

Sağlık hizmetli, kontrol noktası oluşturmak için yeterli disk alanı olup olmadığını doğrular. Health arka plan programı şu konumdadır: cp_healthDaemon Checkpoint.cpp içinde.

Durum arka plan programı, yapılandırılabilen aşağıdaki davranışlara sahiptir:

  • ro.sys.cp_msleeptime: Cihazın disk kullanımını ne sıklıkta kontrol ettiğini kontrol eder.
  • ro.sys.cp_min_free_bytes: Sağlık hizmetlisinin aradığı minimum değeri kontrol eder.
  • ro.sys.cp_commit_on_full: Sağlık hizmetlisinin cihazı yeniden başlatıp başlatmayacağını veya disk dolduğunda kontrol noktasını kaydedip devam edip etmeyeceğini kontrol eder.

Kontrol noktası API'leri

Kontrol noktası API'leri, UDC özelliği tarafından kullanılır. UDC tarafından kullanılan diğer API'ler için IVold.aidl bölümüne bakın.

void startCheckpoint(int retry)

Kontrol noktası oluşturur.

Çerçeve, güncelleme başlatmaya hazır olduğunda bu yöntemi çağırır. Kontrol noktası, userdata gibi kontrol noktası atanmış dosya sistemleri yeniden başlatıldıktan sonra R/W olarak bağlanmadan önce oluşturulur. Yeniden deneme sayısı pozitifse API, yeniden denemelerin izlenmesini yönetir ve güncelleyici, güncellemenin geri alınması gerekip gerekmediğini kontrol etmek için needsRollback'ü çağırır. Yeniden deneme sayısı -1 ise API A/B'ye ertelenir bootloader'ı dikkate alın.

Bu yöntem normal A/B güncellemesi yaparken çağrılmaz.

void commitChanges()

Değişiklikleri kaydeder.

Çerçeve, yeniden başlatma sonrasında değişiklikler hazır olduğunda bu yöntemi çağırır azımsayabilirsiniz. Bu işlev, veriler (ör. resim, video, SMS, sunucu makbuzu) userdata'ya yazılmadan ve BootComplete çağrılmadan önce çağrılır.

Etkin bir kontrol noktası güncellemesi yoksa bu yöntemin hiçbir etkisi olmaz.

abortChanges()

Yeniden başlatmaya zorlar ve kontrol noktasına geri döner. İlk yeniden başlatmadan sonraki tüm kullanıcı verisi değişikliklerini terk eder.

Çerçeve bu yöntemi yeniden başlatma işleminden sonra ancak commitChanges'ten önce çağırır. Bu yöntem çağrıldığında retry_counter azalır. Günlük girişleri oluşturulur.

bool needsRollback()

Geri alma işleminin gerekli olup olmadığını belirler.

Kontrol noktası olmayan cihazlarda false değerini döndürür. Kontrol noktası cihazlarında, kontrol noktası olmayan bir önyükleme sırasında true döndürür.

UDC'yi uygulama

Referans uygulaması

UDC'nin nasıl uygulanabileceğine dair bir örnek için dm-bow.c dosyasına bakın. Özellikle ilgili ek dokümanlar için dm-bow.txt dosyasına bakın.

Kurulum

init.hardware.rc dosyanızdaki on fs öğesinde şunlara sahip olduğunuzdan emin olun:

mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --early

init.hardware.rc dosyanızdaki on late-fs öğesinde şunlara sahip olduğunuzdan emin olun:

mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --late

fstab.hardware dosyanızda, /data öğesinin latemount olarak etiketlendiğinden emin olun.

/dev/block/bootdevice/by-name/userdata              /data              f2fs
noatime,nosuid,nodev,discard,reserve_root=32768,resgid=1065,fsync_mode=nobarrier
latemount,wait,check,fileencryption=ice,keydirectory=/metadata/vold/metadata_encryption,quota,formattable,sysfs_path=/sys/devices/platform/soc/1d84000.ufshc,reservedsize=128M,checkpoint=fs

Meta veri bölümü ekle

UDC, önyükleme dışındaki yeniden deneme sayısını ve anahtarları depolamak için bir meta veri bölümü gerektirir. Bir meta veri bölümü oluşturun ve /metadata adresinde erken ekleyin.

fstab.hardware dosyanızda, /metadata adlı dosyanın earlymount olarak etiketlendiğinden emin olun veya first_stage_mount.

/dev/block/by-name/metadata           /metadata           ext4
noatime,nosuid,nodev,discard,sync
wait,formattable,first_stage_mount

Bölümlendirmeyi tüm sıfırlarla başlatın.

Aşağıdaki satırları BoardConfig.mk hedefine ekleyin:

BOARD_USES_METADATA_PARTITION := true
BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata

Sistemleri güncelleme

F2FS sistemleri

Verileri biçimlendirmek için F2FS kullanan sistemlerde F2FS sürümünüzün kontrol noktalarını destekler. Daha fazla bilgi için Farklı dosya sistemlerindeki kontrol noktası işlevi başlıklı makaleyi inceleyin.

checkpoint=fs işaretini<fs_mgr_flags> cihaz /data konumuna takıldı.

F2FS harici sistemler

F2FS olmayan sistemler için çekirdek yapılandırmasında dm-bow etkinleştirilmelidir.

/data adresinde monte edilen cihaz için fstab'ın <fs_mgr_flags> bölümüne checkpoint=block işaretini ekleyin.

Günlükleri kontrol etme

Checkpoint API'leri çağrıldığında günlük girişleri oluşturulur.

Doğrulama

UDC uygulamanızı test etmek için VtsKernelCheckpointTest VTS grubunu çalıştırın testler.