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

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

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

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

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

วิธีการทำงาน

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

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

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

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

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

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

จัดการคีย์ KeyMint (เดิมชื่อ Keymaster)

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

ตรวจสอบสถานะ

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

Daemon สถานะมีลักษณะการทำงานต่อไปนี้ที่กำหนดค่าได้

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

Checkpoint APIs

ฟีเจอร์ UDC ใช้ Checkpoint APIs ดู API อื่นๆ ที่ UDC ใช้ได้ที่ IVold.aidl

void startCheckpoint(int retry)

สร้างจุดตรวจสอบ

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

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

void commitChanges()

ยืนยันการเปลี่ยนแปลง

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

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

abortChanges()

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

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

bool needsRollback()

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

ในอุปกรณ์ที่ไม่มีจุดตรวจสอบ ระบบจะแสดงผล 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

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

/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 ต้องมีพาร์ติชันข้อมูลเมตาเพื่อจัดเก็บจำนวนครั้งที่ลองใหม่และคีย์ที่ไม่ใช่บูตโหลดเดอร์ ตั้งค่าพาร์ติชันข้อมูลเมตาและติดตั้งพาร์ติชันดังกล่าวในช่วงแรกที่ /metadata

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

/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=fs ลงในส่วน <fs_mgr_flags> ของ fstab สำหรับ อุปกรณ์ที่ติดตั้งที่ /data

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

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

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

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

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

การตรวจสอบ

หากต้องการทดสอบการติดตั้งใช้งาน UDC ให้เรียกใช้ชุดการทดสอบ VTS ของ VtsKernelCheckpointTest