Điểm kiểm tra dữ liệu người dùng

Android 10 giới thiệu Điểm kiểm tra dữ liệu người dùng (UDC), cho phép Android quay trở lại trạng thái trước đó khi cập nhật Android qua mạng (OTA) không thành công. Với UDC, nếu cập nhật Android OTA không thành công, thiết bị có thể quay trở lại trạng thái trước đó một cách an toàn. Mặc dù các bản cập nhật A/B giải quyết vấn đề này khi khởi động sớm nhưng việc khôi phục không được hỗ trợ khi phân vùng dữ liệu người dùng (được gắn trên /data ) bị sửa đổi.

UDC cho phép thiết bị hoàn nguyên phân vùng dữ liệu người dùng ngay cả sau khi được sửa đổi. Tính năng UDC thực hiện điều này với khả năng điểm kiểm tra đối với hệ thống tệp, một cách triển khai thay thế khi hệ thống tệp không hỗ trợ điểm kiểm tra, tích hợp với cơ chế A/B của bộ nạp khởi động đồng thời hỗ trợ các bản cập nhật không phải A/B và hỗ trợ liên kết phiên bản khóa và ngăn chặn việc khôi phục phím.

Tác động của người dùng

Tính năng UDC cải thiện trải nghiệm cập nhật OTA cho người dùng vì ít người dùng bị mất dữ liệu hơn khi cập nhật OTA không thành công. Điều này có thể giảm số lượng cuộc gọi hỗ trợ từ người dùng gặp sự cố trong quá trình cập nhật. Tuy nhiên, khi cập nhật OTA không thành công, người dùng có thể nhận thấy thiết bị khởi động lại nhiều lần.

Làm thế nào nó hoạt động

Chức năng điểm kiểm tra trong các hệ thống tập tin khác nhau

Đối với hệ thống tệp F2FS, UDC bổ sung chức năng điểm kiểm tra cho nhân Linux 4.20 ngược dòng và chuyển ngược nó sang tất cả các nhân phổ biến được thiết bị chạy Android 10 hỗ trợ.

Đối với các hệ thống tệp khác, UDC sử dụng thiết bị ảo trình ánh xạ thiết bị có tên là dm_bow cho chức năng điểm kiểm tra. dm_bow nằm giữa thiết bị và hệ thống tập tin. Khi một phân vùng được gắn kết, một phần cắt được đưa ra khiến hệ thống tệp đưa ra các lệnh cắt trên tất cả các khối trống. dm_bow chặn các phần cắt này và sử dụng chúng để thiết lập danh sách chặn miễn phí. Sau đó, việc đọc và ghi sẽ được gửi đến thiết bị mà không bị sửa đổi, nhưng trước khi cho phép ghi, dữ liệu cần thiết để khôi phục sẽ được sao lưu vào một khối trống.

Quy trình kiểm tra điểm

Khi một phân vùng có checkpoint=fs/block được gắn, Android sẽ gọi restoreCheckpoint trên ổ đĩa để cho phép thiết bị khôi phục mọi điểm kiểm tra hiện tại. init sau đó gọi hàm needsCheckpoint để xác định xem thiết bị có đang ở trạng thái A/B của bộ nạp khởi động hay đã đặt số lần thử lại cập nhật hay không. Nếu một trong hai điều trên đúng, Android gọi createCheckpoint để thêm cờ gắn kết hoặc xây dựng thiết bị dm_bow .

Sau khi phân vùng được gắn kết, mã điểm kiểm tra sẽ được gọi để đưa ra các phần cắt. Quá trình khởi động sau đó tiếp tục như bình thường. Tại LOCKED_BOOT_COMPLETE , Android gọi commitCheckpoint để xác nhận điểm kiểm tra hiện tại và quá trình cập nhật vẫn tiếp tục như bình thường.

Quản lý khóa keymaster

Khóa Keymaster được sử dụng để mã hóa thiết bị hoặc các mục đích khác. Để quản lý các khóa này, Android sẽ trì hoãn các lệnh gọi xóa khóa cho đến khi điểm kiểm tra được cam kết.

Theo dõi sức khỏe

Trình nền tình trạng sẽ xác minh rằng có đủ dung lượng ổ đĩa để tạo điểm kiểm tra. Daemon sức khỏe nằm ở cp_healthDaemon trong Checkpoint.cpp .

Daemon sức khỏe có các hành vi sau đây có thể được cấu hình:

  • ro.sys.cp_msleeptime : Kiểm soát tần suất thiết bị kiểm tra mức sử dụng đĩa.
  • ro.sys.cp_min_free_bytes : Kiểm soát giá trị tối thiểu mà health daemon tìm kiếm.
  • ro.sys.cp_commit_on_full : Kiểm soát xem trình nền tình trạng có khởi động lại thiết bị hay xác nhận điểm kiểm tra và tiếp tục khi đĩa đầy hay không.

API điểm kiểm tra

API điểm kiểm tra được sử dụng bởi tính năng UDC. Đối với các API khác được UDC sử dụng, hãy xem IVold.aidl .

void startCheckpoint(int thử lại)

Tạo một điểm kiểm tra.

Khung này gọi phương thức này khi nó sẵn sàng bắt đầu cập nhật. Điểm kiểm tra được tạo trước khi các hệ thống tệp có điểm kiểm tra như dữ liệu người dùng được gắn R/W sau khi khởi động lại. Nếu số lần thử lại là dương thì API sẽ xử lý việc theo dõi số lần thử lại và trình cập nhật gọi needsRollback để kiểm tra xem có cần khôi phục bản cập nhật hay không. Nếu số lần thử lại là -1 thì API sẽ tuân theo phán đoán của bộ tải khởi động A/B.

Phương pháp này không được gọi khi thực hiện cập nhật A/B thông thường.

void cam kếtChanges()

Cam kết những thay đổi.

Khung này gọi phương thức này sau khi khởi động lại khi các thay đổi đã sẵn sàng được thực hiện. Điều này được gọi trước khi dữ liệu (chẳng hạn như hình ảnh, video, SMS, biên nhận của máy chủ) được ghi vào userdata và trước BootComplete .

Nếu không có bản cập nhật điểm kiểm tra hoạt động nào tồn tại thì phương pháp này không có hiệu lực.

hủy bỏChanges()

Buộc khởi động lại và quay trở lại điểm kiểm tra. Bỏ qua tất cả các sửa đổi dữ liệu người dùng kể từ lần khởi động lại đầu tiên.

Khung công tác gọi phương thức này sau khi khởi động lại nhưng trước commitChanges . retry_counter bị giảm khi phương thức này được gọi. Các mục nhật ký được tạo ra.

nhu cầu boolRollback()

Xác định xem có cần khôi phục hay không.

Trên các thiết bị không có điểm kiểm tra, trả về false . Trên các thiết bị điểm kiểm tra, trả về true trong quá trình khởi động không có điểm kiểm tra.

Triển khai UDC

Thực hiện tham khảo

Để biết ví dụ về cách triển khai UDC, hãy xem dm-bow.c . Để biết thêm tài liệu về tính năng này, hãy xem dm-bow.txt .

Cài đặt

Trong on fs trong tệp init.hardware.rc của bạn, hãy đảm bảo bạn có:

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

on late-fs trong tệp init.hardware.rc của bạn, hãy đảm bảo bạn có:

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

Trong tệp fstab.hardware của bạn, hãy đảm bảo /data được gắn thẻ là 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

Thêm phân vùng siêu dữ liệu

UDC yêu cầu một phân vùng siêu dữ liệu để lưu trữ số lần thử lại và khóa của bộ tải không khởi động. Thiết lập phân vùng siêu dữ liệu và gắn kết sớm nó tại /metadata .

Trong tệp fstab.hardware của bạn, hãy đảm bảo /metadata được gắn thẻ là earlymount hoặc first_stage_mount .

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

Khởi tạo phân vùng cho tất cả các số 0.

Thêm các dòng sau vào BoardConfig.mk :

BOARD_USES_METADATA_PARTITION := true
BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata

Cập nhật hệ thống

Hệ thống F2FS

Đối với các hệ thống sử dụng F2FS để định dạng dữ liệu, hãy đảm bảo rằng phiên bản F2FS của bạn hỗ trợ điểm kiểm tra. Để biết thêm thông tin, hãy xem Chức năng điểm kiểm tra trong các hệ thống tệp khác nhau .

Thêm cờ checkpoint=fs vào phần <fs_mgr_flags> của fstab cho thiết bị được gắn tại /data .

Hệ thống không phải F2FS

Đối với các hệ thống không phải F2FS, dm-bow phải được bật trong cấu hình kernel.

Thêm cờ checkpoint=block vào phần <fs_mgr_flags> của fstab cho thiết bị được gắn tại /data .

Kiểm tra nhật ký

Các mục nhật ký được tạo khi API điểm kiểm tra được gọi.

Thẩm định

Để kiểm tra việc triển khai UDC của bạn, hãy chạy bộ kiểm tra VTS VtsKernelCheckpointTest .