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

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

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

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

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

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

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

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

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

กระบวนการเช็คพอยท์

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

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

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

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

ตรวจสอบประสิทธิภาพ

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

เดรัมความปลอดภัยมีพฤติกรรมต่อไปนี้ที่กำหนดค่าได้

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

Checkpoint API

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

void startCheckpoint(int retry)

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

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

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

เป็นโมฆะ CommissionChanges()

ดำเนินการเปลี่ยนแปลง

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

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

abortChanges()

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

เฟรมเวิร์กเรียกใช้เมธอดนี้หลังจากรีบูต แต่ก่อน 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

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

เริ่มต้นพาร์ติชันเป็นค่า 0 ทั้งหมด

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

BOARD_USES_METADATA_PARTITION := true
BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata

อัปเดตระบบ

ระบบ F2FS

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

เพิ่ม Flag checkpoint=fs ลงในส่วน <fs_mgr_flags> ของ fstab สําหรับอุปกรณ์ที่ต่อเชื่อมที่ /data

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

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

เพิ่ม Flag checkpoint=block ลงในส่วน <fs_mgr_flags> ของ fstab สําหรับอุปกรณ์ที่ต่อเชื่อมที่ /data

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

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

การตรวจสอบความถูกต้อง

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