Kullanıcı Verileri Kontrol Noktası

Android 10, Android kablosuz (OTA) güncellemesi başarısız olduğunda Android'in önceki durumuna geri dönmesine olanak tanıyan Kullanıcı Verileri 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, erken başlatma sırasında bu sorunu çözse de kullanıcı verileri bölümü (/data üzerine monte edilmiş) değiştirildiğinde geri alma işlemi desteklenmez.

UDC, cihazın değiştirildikten sonra bile kullanıcı verileri bölümünü geri döndürmesini sağlar. UDC özelliği, dosya sisteminde kontrol noktası özellikleri, dosya sistemi kontrol noktalarını desteklemediğinde alternatif bir uygulama, önyükleyici A/B mekanizmasıyla entegrasyon (A/B olmayan güncellemeleri de destekler) ve anahtar sürümü bağlama ile anahtar geri alma önleme desteği sayesinde bunu başarır.

Kullanıcıya etkisi

UDC özelliği, OTA güncellemesi başarısız olduğunda daha az kullanıcı verilerini kaybettiği için kullanıcıların OTA güncelleme deneyimini iyileştirir. Bu, güncelleme işlemi sırasında sorun yaşayan kullanıcılardan gelen destek çağrılarının sayısını azaltabilir. 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ış 4.20 Linux çekirdeğine kontrol noktası işlevini ekler ve Android 10 çalıştıran cihazlar tarafından desteklenen tüm ortak çekirdeklere geri taşır.

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 sistemi arasında yer alır. Bir bölüm bağlandığında, dosya sisteminin tüm boş bloklarda trim komutları vermesine neden olan bir trim işlemi gerçekleştirilir. dm_bow bu kırpmaları yakalar ve bunları ücretsiz bir blok listesi oluşturmak için kullanır. Okuma ve yazma işlemleri daha sonra cihaza değiştirilmeden gönderilir. Ancak yazma işlemine izin verilmeden önce geri yükleme için gereken veriler ücretsiz bir bloğa yedeklenir.

Kontrol noktası süreci

checkpoint=fs/block işaretli bir bölüm bağlandığında Android, cihazın mevcut kontrol noktalarını geri yüklemesine izin vermek için sürücüde restoreCheckpoint işlevini çağırır. Ardından init, cihazı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. Bu koşullardan biri geçerliyse Android, bağlama işaretleri eklemek veya dm_bow cihazı oluşturmak için createCheckpoint işlevini çağırır.

Bölüm bağlandıktan sonra, kırpma işlemleri için kontrol noktası kodu çağrılır. Önyükleme işlemi normal şekilde devam eder. LOCKED_BOOT_COMPLETE konumunda Android, mevcut kontrol noktasını işlemek için commitCheckpoint işlevini çağırır ve güncelleme normal şekilde devam eder.

KeyMint (eski adıyla Keymaster) anahtarlarını yönetme

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

Sağlığı izleme

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

Sağlık hizmetinin yapılandırılabilen aşağıdaki davranışları vardır:

  • ro.sys.cp_msleeptime: Cihazın disk kullanımını ne sıklıkta kontrol edeceğini belirler.
  • ro.sys.cp_min_free_bytes: Sağlık hizmetinin aradığı minimum değeri kontrol eder.
  • ro.sys.cp_commit_on_full: Sağlık hizmetinin, cihazı yeniden başlattığını veya disk dolu olduğunda kontrol noktasını kaydedip devam ettiğini kontrol eder.

Checkpoint 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 başlıklı makaleyi inceleyin.

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ı, yeniden başlatma işleminden sonra userdata gibi kontrol noktası oluşturulmuş dosya sistemleri R/W olarak monte edilmeden önce oluşturulur. Yeniden deneme sayısı pozitifse API, izleme yeniden denemelerini işler ve güncelleyici, güncellemenin geri alınmasının gerekip gerekmediğini kontrol etmek için needsRollback işlevini çağırır. Yeniden deneme sayısı -1 ise API, A/B önyükleyicisinin kararına uyar.

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

void commitChanges()

Değişiklikleri işler.

Çerçeve, değişiklikler kaydedilmeye hazır olduğunda yeniden başlatma işleminden sonra bu yöntemi çağırır. Bu, veriler (ör. resimler, videolar, SMS, sunucuya alma makbuzu) userdata'ya yazılmadan ve BootComplete'dan önce çağrılır.

Etkin bir kontrol noktalı güncelleme yoksa bu yöntemin etkisi olmaz.

abortChanges()

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

Çerçeve, bu yöntemi yeniden başlatmadan sonra ancak commitChanges'dan önce çağırır. Bu yöntem çağrıldığında retry_counter değeri azaltılı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 başlatma sırasında true değerini döndürür.

UDC'yi uygulama

Referans uygulama

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 bölümünde şunların bulunduğundan emin olun:

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

init.hardware.rc dosyanızdaki on late-fs bölümünde şunların bulunduğundan 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ü ekleme

UDC, önyükleyici olmayan yeniden deneme sayısını ve anahtarları depolamak için bir meta veri bölümü gerektirir. Meta veri bölümü oluşturun ve /metadata konumunda erken bağlayın.

fstab.hardware dosyanızda /metadata öğesinin 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ü sıfırlarla başlatın.

BoardConfig.mk dosyasına aşağıdaki satırları 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ı desteklediğinden emin olun. Daha fazla bilgi için Farklı dosya sistemlerinde kontrol noktası işlevi başlıklı makaleyi inceleyin.

/data konumuna bağlanan cihaz için fstab dosyasının <fs_mgr_flags> bölümüne checkpoint=fs işaretini ekleyin.

Non-F2FS sistemler

F2FS olmayan sistemlerde dm-bow, çekirdek yapılandırmasında etkinleştirilmelidir.

/data konumuna bağlanan cihaz için fstab dosyasının <fs_mgr_flags> bölümüne checkpoint=block işaretini ekleyin.

Günlükleri kontrol etme

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

Doğrulama

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