จุดตรวจข้อมูลผู้ใช้

Android 10 เปิดตัว User Data Checkpoint (UDC) ซึ่งช่วยให้ Android สามารถย้อนกลับไปสู่สถานะก่อนหน้าได้เมื่อการอัปเดต Android over-the-air (OTA) ล้มเหลว เมื่อใช้ UDC หากการอัปเดต Android OTA ล้มเหลว อุปกรณ์สามารถย้อนกลับไปสู่สถานะก่อนหน้าได้อย่างปลอดภัย แม้ว่า การอัปเดต A/B จะช่วยแก้ปัญหานี้สำหรับการบูตก่อนกำหนด แต่การย้อนกลับไม่ได้รับการสนับสนุนเมื่อมีการแก้ไขพาร์ติชันข้อมูลผู้ใช้ (ติดตั้งบน /data )

UDC ช่วยให้อุปกรณ์สามารถคืนค่าพาร์ติชั่นข้อมูลผู้ใช้ได้แม้ว่าจะได้รับการแก้ไขแล้วก็ตาม คุณลักษณะ UDC ช่วยให้บรรลุผลสำเร็จด้วยความสามารถของจุดตรวจสอบกับระบบไฟล์ การใช้งานทางเลือกเมื่อระบบไฟล์ไม่รองรับจุดตรวจสอบ การผสานรวมกับกลไก A/B ของ bootloader ในขณะเดียวกันก็รองรับการอัปเดตที่ไม่ใช่ A/B และรองรับการเชื่อมโยงเวอร์ชันคีย์ และการป้องกันการย้อนกลับของคีย์

ผลกระทบต่อผู้ใช้

คุณลักษณะ UDC ปรับปรุงประสบการณ์การอัปเดต OTA สำหรับผู้ใช้ เนื่องจากผู้ใช้สูญเสียข้อมูลน้อยลงเมื่อการอัปเดต OTA ล้มเหลว วิธีนี้จะช่วยลดจำนวนการโทรขอรับการสนับสนุนจากผู้ใช้ที่ประสบปัญหาในระหว่างกระบวนการอัปเดต อย่างไรก็ตาม เมื่อการอัปเดต OTA ล้มเหลว ผู้ใช้อาจสังเกตเห็นว่าอุปกรณ์รีบูตหลายครั้ง

มันทำงานอย่างไร

ฟังก์ชั่นจุดตรวจในระบบไฟล์ต่างๆ

สำหรับระบบไฟล์ F2FS นั้น UDC จะเพิ่มฟังก์ชันจุดตรวจสอบให้กับเคอร์เนลอัปสตรีม 4.20 Linux และแบ็คพอร์ตไปยังเคอร์เนลทั่วไปทั้งหมดที่รองรับโดยอุปกรณ์ที่ใช้ Android 10

สำหรับระบบไฟล์อื่นๆ UDC จะใช้อุปกรณ์เสมือนตัวทำแผนที่อุปกรณ์ที่เรียกว่า dm_bow สำหรับการทำงานของจุดตรวจสอบ dm_bow อยู่ระหว่างอุปกรณ์และระบบไฟล์ เมื่อติดตั้งพาร์ติชัน จะมีการตัดแต่งพาร์ติชัน ทำให้ระบบไฟล์ออกคำสั่งตัดแต่งบนบล็อกที่ว่างทั้งหมด dm_bow สกัดกั้นส่วนตัดแต่งเหล่านี้ และใช้มันเพื่อตั้งค่ารายการบล็อกอิสระ จากนั้นการอ่านและการเขียนจะถูกส่งไปยังอุปกรณ์โดยไม่มีการแก้ไข แต่ก่อนที่จะอนุญาตให้เขียนได้ ข้อมูลที่จำเป็นสำหรับการกู้คืนจะถูกสำรองข้อมูลไว้ในบล็อกที่ว่าง

กระบวนการจุดตรวจ

เมื่อติดตั้งพาร์ติชันที่มีเครื่องหมาย checkpoint=fs/block แล้ว Android จะเรียก restoreCheckpoint บนไดรฟ์เพื่อให้อุปกรณ์สามารถกู้คืนจุดตรวจสอบปัจจุบันได้ จากนั้น init จะเรียกใช้ฟังก์ชัน needsCheckpoint เพื่อตรวจสอบว่าอุปกรณ์อยู่ในสถานะ bootloader A/B หรือได้ตั้งค่าจำนวนการลองอัปเดตใหม่หรือไม่ หากเป็นจริง Android จะเรียก createCheckpoint เพื่อเพิ่มแฟล็กเมานต์หรือสร้างอุปกรณ์ dm_bow

หลังจากติดตั้งพาร์ติชันแล้ว รหัสจุดตรวจสอบจะถูกเรียกให้ออกข้อมูลภายนอกข้อมูลรถ กระบวนการบู๊ตจะดำเนินต่อไปตามปกติ ที่ LOCKED_BOOT_COMPLETE การโทรของ Android commitCheckpoint เพื่อยืนยันจุดตรวจสอบปัจจุบันและการอัปเดตจะดำเนินต่อไปตามปกติ

จัดการคีย์คีย์มาสเตอร์

คีย์คีย์มาสเตอร์ใช้สำหรับการเข้ารหัสอุปกรณ์หรือวัตถุประสงค์อื่น ในการจัดการคีย์เหล่านี้ Android จะชะลอการโทรลบคีย์จนกว่าจุดตรวจสอบจะกระทำ

ติดตามสุขภาพ

ภูตสุขภาพจะตรวจสอบว่ามีพื้นที่ดิสก์เพียงพอที่จะสร้างจุดตรวจสอบ health daemon อยู่ใน cp_healthDaemon ใน Checkpoint.cpp

Health daemon มีพฤติกรรมต่อไปนี้ที่สามารถกำหนดค่าได้:

  • ro.sys.cp_msleeptime : ควบคุมความถี่ที่อุปกรณ์ตรวจสอบการใช้งานดิสก์
  • ro.sys.cp_min_free_bytes : ควบคุมค่าต่ำสุดที่ daemon สุขภาพค้นหา
  • ro.sys.cp_commit_on_full : ควบคุมว่า health daemon จะรีบูตอุปกรณ์หรือยืนยันจุดตรวจสอบและดำเนินการต่อเมื่อดิสก์เต็ม

Checkpoint API

Checkpoint API ถูกใช้โดยคุณสมบัติ UDC สำหรับ API อื่นๆ ที่ใช้โดย UDC โปรดดูที่ IVold.aidl

โมฆะ startCheckpoint (ลอง int ใหม่)

จะสร้างจุดตรวจ.

เฟรมเวิร์กเรียกเมธอดนี้เมื่อพร้อมที่จะเริ่มการอัพเดต จุดตรวจสอบจะถูกสร้างขึ้นก่อนที่ระบบไฟล์จุดตรวจสอบ เช่น ข้อมูลผู้ใช้ จะถูกเมาท์ R/W หลังจากรีบูต หากจำนวนการลองใหม่เป็นค่าบวก API จะจัดการการติดตามการลองใหม่ และผู้อัปเดตจะเรียก needsRollback เพื่อตรวจสอบว่าจำเป็นต้องย้อนกลับการอัปเดตหรือไม่ หากจำนวนการลองใหม่คือ -1 API จะเลื่อนไปตามการพิจารณาของ A/B bootloader

วิธีการนี้จะไม่ถูกเรียกเมื่อทำการอัปเดต A/B ปกติ

โมฆะกระทำการเปลี่ยนแปลง ()

ยอมรับการเปลี่ยนแปลง

เฟรมเวิร์กเรียกเมธอดนี้หลังจากรีบูตเมื่อการเปลี่ยนแปลงพร้อมที่จะคอมมิต สิ่งนี้ถูกเรียกก่อนที่ข้อมูล (เช่น รูปภาพ วิดีโอ SMS ใบเสร็จรับเงินของเซิร์ฟเวอร์) จะถูกเขียนลงในข้อมูลผู้ใช้และก่อน BootComplete

หากไม่มีการอัปเดตจุดตรวจสอบที่ใช้งานอยู่ วิธีการนี้จะไม่มีผลใดๆ

ยกเลิกการเปลี่ยนแปลง()

บังคับให้รีบูตและกลับสู่จุดตรวจ ละทิ้งการแก้ไขข้อมูลผู้ใช้ทั้งหมดตั้งแต่การรีบูตครั้งแรก

กรอบงานเรียกวิธีนี้หลังจากรีบูต แต่ก่อน commitChanges retry_counter จะลดลงเมื่อมีการเรียกใช้เมธอดนี้ รายการบันทึกถูกสร้างขึ้น

บูลต้องการย้อนกลับ ()

กำหนดว่าจำเป็นต้องมีการย้อนกลับหรือไม่

บนอุปกรณ์ที่ไม่ใช่จุดตรวจสอบ ให้คืนค่า false บนอุปกรณ์จุดตรวจสอบ ให้คืน true ระหว่างการบูตที่ไม่ใช่จุดตรวจสอบ

ปรับใช้ UDC

การดำเนินการอ้างอิง

สำหรับตัวอย่างวิธีการนำ UDC ไปใช้งาน โปรดดูที่ dm-bow.c หากต้องการเอกสารเพิ่มเติมเกี่ยวกับคุณลักษณะนี้ โปรดดูที่ dm-bow.txt

ติดตั้ง

ใน on fs ในไฟล์ init.hardware.rc ตรวจสอบให้แน่ใจว่าคุณมี:

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

ใน on late-fs ในไฟล์ init.hardware.rc ของคุณ ตรวจสอบให้แน่ใจว่าคุณมี:

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

ในไฟล์ fstab.hardware ตรวจสอบให้แน่ใจว่า /data ถูกแท็กเป็น latemount

/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

เพิ่มพาร์ติชันข้อมูลเมตา

UDC ต้องใช้พาร์ติชันข้อมูลเมตาเพื่อจัดเก็บจำนวนและคีย์การลองซ้ำของ nonbootloader ตั้งค่าพาร์ติชันข้อมูลเมตาและติดตั้งไว้ที่ /metadata ก่อน

ในไฟล์ fstab.hardware ตรวจสอบให้แน่ใจว่า /metadata ถูกแท็กเป็น earlymount หรือ first_stage_mount

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

เตรียมใช้งานพาร์ติชันให้เป็นศูนย์ทั้งหมด

เพิ่มบรรทัดต่อไปนี้ใน BoardConfig.mk :

BOARD_USES_METADATA_PARTITION := true
BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata

อัพเดทระบบ

ระบบ F2FS

สำหรับระบบที่ใช้ F2FS เพื่อจัดรูปแบบข้อมูล ตรวจสอบให้แน่ใจว่า F2FS เวอร์ชันของคุณรองรับจุดตรวจสอบ สำหรับข้อมูลเพิ่มเติม โปรดดูที่ ฟังก์ชันการทำงานของ Checkpoint ในระบบไฟล์ต่างๆ

เพิ่มแฟล็ checkpoint=fs ไปยังส่วน <fs_mgr_flags> ของ fstab สำหรับอุปกรณ์ที่ติดตั้งที่ /data

ระบบที่ไม่ใช่ F2FS

สำหรับระบบที่ไม่ใช่ F2FS ต้องเปิดใช้งาน dm-bow ในการกำหนดค่าเคอร์เนล

เพิ่ม checkpoint=block flag ให้กับส่วน <fs_mgr_flags> ของ fstab สำหรับอุปกรณ์ที่ติดตั้งที่ /data

ตรวจสอบบันทึก

รายการบันทึกจะถูกสร้างขึ้นเมื่อมีการเรียก Checkpoint API

การตรวจสอบ

หากต้องการทดสอบการใช้งาน UDC ของคุณ ให้รันชุดการทดสอบ VtsKernelCheckpointTest