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

Android 10 ra mắt Điểm kiểm tra dữ liệu người dùng (UDC), cho phép Android khôi phục về trạng thái trước đó khi Android qua mạng không dây Không cập nhật được (OTA). Với UDC, nếu bản cập nhật Android OTA không thành công, thiết bị có thể khôi phục về trạng thái trước đó một cách an toàn. Mặc dù Bản cập nhật A/B giải quyết sự cố này để khởi động sớm, 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) được 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 sửa đổi. Tính năng UDC thực hiện điều này bằng cách sử dụng các chức năng điểm kiểm tra để hệ thống tệp, phương thức 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 trình tải 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 phím và khôi phục phím phòng ngừa.

Tác động đối với người dùng

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

Cách hoạt động

Chức năng của điểm kiểm tra trong nhiều hệ thống tệp

Đối với hệ thống tệp F2FS, UDC thêm chức năng điểm kiểm tra vào luồng ngược 4.20 Nhân Linux và điều chỉnh cho phiên bản cũ cho tất cả các nhân phổ biến mà thiết bị hỗ trợ chạy Android 10.

Đối với các hệ thống tệp khác, UDC sử dụng một thiết bị ảo trình liên kết 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à tệp hệ thống. Khi phân vùng được gắn kết, quá trình cắt sẽ được phát hành, khiến hệ thống tệp đưa ra lệnh cắt trên tất cả các khối miễn phí. dm_bow chặn những phần cắt và sử dụng này để thiết lập danh sách chặn miễn phí. Sau đó, hoạt động đọc và ghi sẽ được gửi đến thiết bị chưa sửa đổi, nhưng trước khi cho phép ghi, dữ liệu cần thiết để khôi phục được sao lưu lên tới khối miễn phí.

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

Khi một phân vùng có 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 hiện tại . Sau đó, init sẽ gọi hàm needsCheckpoint để xác định xem thiết bị đang ở trạng thái A/B trình tải khởi động hoặc đã đặt lại lượt cập nhật số lượng. Nếu đúng, Android sẽ gọi createCheckpoint để thêm giá trị gắn kết gắn cờ hoặc tạo một thiết bị dm_bow.

Sau khi gắn phân vùng, mã điểm kiểm tra sẽ được gọi để xử lý vấn đề cắt bỏ. Sau đó, quá trình khởi động sẽ 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à bản cập nhật sẽ tiếp tục như bình thường.

Quản lý khoá keymaster

Khoá Keymaster được dùng để mã hoá thiết bị hoặc các mục đích khác. Để quản lý các đề xuất này Android sẽ trì hoãn các lệnh gọi xoá phím cho đến khi điểm kiểm tra được cam kết.

Theo dõi tình trạng sức khoẻ

Trình nền sức khoẻ xác minh rằng có đủ dung lượng ổ đĩa để tạo . Daemon sức khoẻ nằm trong cp_healthDaemon trong Checkpoint.cpp.

Daemon sức khoẻ có các hành vi sau đây có thể được định 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à trình nền sức khoẻ tìm kiếm.
  • ro.sys.cp_commit_on_full: Kiểm soát việc trình nền sức khoẻ có khởi động lại thiết bị hay không hoặc xác nhận và tiếp tục khi ổ đĩa đầy.

API Checkpoint

Tính năng UDC sử dụng các API của điểm kiểm tra. Đối với các API khác mà UDC sử dụng, hãy xem IVold.aidl.

vô hiệu startCheckpoint(thử lại int)

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

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

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

trống cam kếtChanges()

Xác nhận nội dung thay đổi.

Khung sẽ gọi phương thức này sau khi khởi động lại khi các thay đổi đã sẵn sàng cam kết. Lệnh này được gọi trước dữ liệu (như ảnh, video, SMS, máy chủ tiếp nhận dữ liệu) được ghi vào dữ liệu người dùng và trước BootComplete.

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

huỷ bỏ()

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

Khung sẽ 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ập nhật ký là tạo.

bool cầnRollback()

Xác định xem có bắt buộc khôi phục hay không.

Trên các thiết bị không có điểm kiểm tra, hàm sẽ trả về false. Trên thiết bị ở điểm kiểm tra, trả về true trong khi khởi động không ở điểm kiểm tra.

Triển khai UDC

Cách triển khai tệp đối chiếu

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

Thiết lập

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

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

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

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

Trong tệp fstab.hardware, 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 phân vùng siêu dữ liệu để lưu trữ số lần thử lại trình tải không khởi động và khoá. Thiết lập một phân vùng siêu dữ liệu và gắn sớm phân vùng đó tại /metadata.

Trong tệp fstab.hardware, 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 động phân vùng thành tất cả các giá trị bằng 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 những hệ thống sử dụng F2FS để định dạng dữ liệu, hãy đảm bảo rằng bạn dùng phiên bản F2FS hỗ trợ điểm kiểm tra. Để biết thêm thông tin, hãy xem bài viết Chức năng của điểm kiểm tra trong hệ thống tệp khác nhau.

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

Các hệ thống không phải F2FS

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

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

Kiểm tra nhật ký

Mục nhập nhật ký được tạo khi gọi Checkpoint API.

Xác nhận kết quả

Để kiểm thử việc triển khai UDC, hãy chạy tập hợp VTS VtsKernelCheckpointTest kiểm thử.