Kullanıcı Verileri Kontrol Noktası

Android 10, bir Android kablosuz (OTA) güncellemesi başarısız olduğunda Android'in önceki durumuna geri dönmesine olanak tanıyan Kullanıcı Veri Kontrol Noktasını (UDC) sunar. UDC ile Android OTA güncellemesi başarısız olursa cihaz güvenli bir şekilde önceki durumuna geri dönebilir. A/B güncellemeleri bu sorunu erken önyükleme için çözse de, kullanıcı veri bölümü ( /data üzerine kurulu) değiştirildiğinde geri alma desteklenmez.

UDC, cihazın değiştirildikten sonra bile kullanıcı verileri bölümünü geri döndürmesine olanak tanır. UDC özelliği bunu dosya sistemindeki kontrol noktası yetenekleriyle, dosya sistemi kontrol noktalarını desteklemediğinde alternatif bir uygulamayla, önyükleyici A/B mekanizmasıyla entegrasyonla ve A/B olmayan güncellemeleri de desteklerken ve anahtar sürüm bağlama desteğiyle gerçekleştirir. ve anahtar geri alma önleme.

Kullanıcı etkisi

UDC özelliği, bir OTA güncellemesi başarısız olduğunda daha az kullanıcı verilerini kaybettiğinden kullanıcıların OTA güncelleme deneyimini geliştirir. Bu, güncelleme işlemi sırasında sorunlarla karşılaşan kullanıcılardan gelen destek çağrılarının sayısını azaltabilir. Ancak bir OTA güncellemesi başarısız olduğunda kullanıcılar cihazın birden çok kez yeniden başlatıldığını fark edebilir.

Nasıl çalışır

Farklı dosya sistemlerinde denetim noktası işlevselliği

F2FS dosya sistemi için UDC, kontrol noktası işlevini yukarı akış 4.20 Linux çekirdeğine ekler ve bunu Android 10 çalıştıran cihazlar tarafından desteklenen tüm ortak çekirdeklere destekler.

Diğer dosya sistemlerinde UDC, denetim noktası işlevselliği için dm_bow adı verilen bir aygıt eşleyici sanal aygıtı kullanır. dm_bow cihaz ile dosya sistemi arasında bulunur. Bir bölüm monte edildiğinde, dosya sisteminin tüm boş bloklarda trim komutları vermesine neden olan bir trim verilir. dm_bow bu kesimleri yakalar ve bunları ücretsiz bir engellenenler listesi oluşturmak için kullanır. Okuma ve yazma işlemleri daha sonra cihaza değiştirilmeden gönderilir, ancak yazmaya izin verilmeden önce geri yükleme için gereken veriler boş bir bloğa yedeklenir.

Kontrol noktası süreci

checkpoint=fs/block bayrağına sahip bir bölüm bağlandığında Android, cihazın mevcut herhangi bir kontrol noktasını geri yüklemesine izin vermek için sürücüdeki restoreCheckpoint çağırır. init daha sonra aygıtın önyükleyici A/B durumunda olup olmadığını veya güncelleme yeniden deneme sayısını ayarlayıp ayarlamadığını belirlemek için needsCheckpoint işlevini çağırır. Bunlardan herhangi biri doğruysa Android, bağlama bayrakları eklemek veya bir dm_bow aygıtı oluşturmak için createCheckpoint çağırır.

Bölüm takıldıktan sonra, kesimleri düzenlemek için denetim noktası kodu çağrılır. Önyükleme işlemi daha sonra normal şekilde devam eder. LOCKED_BOOT_COMPLETE konumunda Android, mevcut kontrol noktasını işlemek için commitCheckpoint çağırır ve güncelleme normal şekilde devam eder.

Anahtar yöneticisi anahtarlarını yönet

Keymaster anahtarları cihaz şifrelemesi veya başka amaçlar için kullanılır. Bu anahtarları yönetmek için Android, kontrol noktası taahhüt edilene kadar anahtar silme çağrılarını geciktirir.

Sağlığı izleyin

Bir sağlık arka plan programı, bir denetim noktası oluşturmak için yeterli disk alanı olduğunu doğrular. Sağlık arka plan programı Checkpoint.cpp cp_healthDaemon bulunur.

Sistem durumu 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ıkla kontrol ettiğini kontrol eder.
  • ro.sys.cp_min_free_bytes : Sistem durumu arka plan programının aradığı minimum değeri kontrol eder.
  • ro.sys.cp_commit_on_full : Sistem durumu arka plan programının cihazı yeniden başlatıp başlatmayacağını veya denetim noktasını tamamlayıp disk dolduğunda devam edip etmeyeceğini kontrol eder.

Denetim Noktası API'leri

Denetim Noktası API'leri UDC özelliği tarafından kullanılır. UDC tarafından kullanılan diğer API'ler için bkz. IVold.aidl .

void startCheckpoint(int yeniden deneme)

Bir kontrol noktası oluşturur.

Çerçeve, bir güncellemeyi başlatmaya hazır olduğunda bu yöntemi çağırır. Denetim noktası, kullanıcı verileri gibi denetim noktalı dosya sistemlerinin yeniden başlatma sonrasında R/W bağlanmasından önce oluşturulur. Yeniden deneme sayısı pozitifse API, yeniden denemeleri izlemeyi yönetir ve güncelleyici, güncellemenin geri alınmasının gerekli olup olmadığını kontrol etmek için needsRollback çağrısını yapar. Yeniden deneme sayısı -1 ise API, A/B önyükleyicinin kararına göre hareket eder.

Normal bir A/B güncellemesi yapılırken bu yöntem çağrılmaz.

void commitChanges()

Değişiklikleri taahhüt eder.

Çerçeve, yeniden başlatmanın ardından değişiklikler uygulanmaya hazır olduğunda bu yöntemi çağırır. Bu, verilerin (resimler, video, SMS, alınan sunucunun alınması gibi) kullanıcı verilerine yazılmasından önce ve BootComplete önce çağrılır.

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

Değişiklikleri iptal et()

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

Çerçeve, yeniden başlatmanın ardından ancak commitChanges önce bu yöntemi çağırır. Bu yöntem çağrıldığında retry_counter azalır. Günlük girişleri oluşturulur.

bool'un Rollback()'e ihtiyacı var

Geri almanın gerekli olup olmadığını belirler.

Denetim noktası olmayan cihazlarda false değerini döndürür. Denetim noktası aygıtlarında, denetim noktası olmayan önyükleme sırasında true değerini döndürür.

UDC'yi uygulayın

Referans uygulaması

UDC'nin nasıl uygulanabileceğine dair bir örnek için bkz. dm-bow.c . Özelliklere ilişkin ek belgeler için bkz. dm-bow.txt .

Kurmak

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

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

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

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

fstab.hardware dosyanızda /data 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ükleyici olmayan yeniden deneme sayısını ve anahtarlarını depolamak için bir meta veri bölümü gerektirir. Bir meta veri bölümü oluşturun ve bunu /metadata konumuna önceden bağlayın.

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

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

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

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

BOARD_USES_METADATA_PARTITION := true
BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata

Sistemleri güncelle

F2FS sistemleri

Verileri biçimlendirmek için F2FS kullanan sistemlerde F2FS sürümünüzün denetim noktalarını desteklediğinden emin olun. Daha fazla bilgi için bkz. Farklı dosya sistemlerinde Denetim Noktası işlevi .

/data konumuna bağlanan aygıt için fstab'ın <fs_mgr_flags> bölümüne checkpoint=fs bayrağını ekleyin.

F2FS olmayan sistemler

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

/data konumuna bağlanan aygıt için fstab'ın <fs_mgr_flags> bölümüne checkpoint=block bayrağını ekleyin.

Günlükleri kontrol edin

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 testleri kümesini çalıştırın.