Triển khai phân vùng mô-đun GKI

Bạn có thể cập nhật GKI và các mô-đun GKI độc lập với phần còn lại của phân vùng vì các mô-đun GKI nằm trên một phân vùng động riêng biệt trong hình ảnh siêu dữ liệu có tên là system_dlkm. Các mô-đun GKI được Google ký bằng cặp khoá thời gian tạo nhân và chỉ tương thích với GKI mà chúng được tạo. Không có tính ổn định ABI giữa GKI và các mô-đun GKI; để các mô-đun tải chính xác trong thời gian chạy, GKI và các mô-đun GKI phải được tạo và cập nhật cùng nhau.

Triển khai tính năng hỗ trợ phân vùng system_dklm

Phân vùng system_dlkm nằm trong siêu phân vùng dưới dạng một phân vùng động khác. Phân vùng này có thể chứa:

  • Các mô-đun nhân được Google ký tại thời gian tạo
  • depmod cấu phần phần mềm

Bản dựng system_dlkm

Việc tạo system_dlkm cũng tương tự như việc tạo các phân vùng động khác. Thực hiện các bước sau để thêm system_dlkm vào bản dựng:

  1. Trong BoardConfig.mk, hãy thêm các mục sau:

    BOARD_USES_SYSTEM_DLKMIMAGE := true
    BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE)
    TARGET_COPY_OUT_SYSTEM_DLKM := system_dlkm
    
  2. Trong danh sách phân vùng, hãy thêm system_dlkm: BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm

  3. (Không bắt buộc) Đối với các thiết bị A/B và A/B ảo, hãy thêm dòng sau vào tệp device.mk cho thiết bị của bạn:

    AB_OTA_PARTITIONS += system_dlkm
    

Xác định các mô-đun hạt nhân cần sao chép vào system_dlkm

Để các mô-đun tải thành công trong thời gian chạy, bạn phải tạo GKI và các mô-đun GKI cùng nhau. Do đó, bạn phải xác định các mô-đun hạt nhân trong bản dựng GKI cho cấu trúc mục tiêu và cung cấp mô-đun đó làm nguồn cho phân vùng system_dlkm trong quá trình tạo nền tảng.

Dành cho Android 13

Chỉ định BOARD_SYSTEM_DLKM_SRC đến một thư mục chứa các tệp đối tượng hạt nhân mô-đun GKI bắt buộc cho thiết bị làm đầu vào cho hệ thống bản dựng để tạo phân vùng system_dlkm. Ví dụ:

Cung cấp nguồn mô-đun GKI trong một thư mục và trỏ BOARD_SYSTEM_DLKM_SRC đến thư mục đó. Ví dụ:

  BOARD_SYSTEM_DLKM_SRC := kernel/prebuilts/5.10/arm64/system_dlkm_staging

Tại thời điểm tạo bản dựng, các mô-đun có trong BOARD_SYSTEM_DLKM_SRC sẽ được cài đặt trong $ANDROID_PRODUCT_OUT/system_dlkm.

Đối với Android 14

Chúng tôi đã đơn giản hoá việc triển khai bằng cách sử dụng các macro (BOARD_*_KERNEL_MODULES) cho các phân vùng *_dlkm khác. Danh sách các mô-đun GKI bắt buộc cho thiết bị phải được tham chiếu bằng macro BOARD_SYSTEM_KERNEL_MODULES. Tại thời điểm tạo bản dựng, các mô-đun này được cài đặt trong $ANDROID_PRODUCT_OUT/system_dlkm. Mọi mô-đun trong phân vùng vendor_dlkm có các phần phụ thuộc vào các mô-đun trong phân vùng system_dlkm sẽ tạo ra các tham chiếu chính xác trong tệp modules.dep cho phân vùng vendor_dlkm. Do các phần phụ thuộc trên nhiều phân vùng được biểu thị bằng modules.dep, khi một mô-đun nhà cung cấp được tải, mọi mô-đun GKI bắt buộc sẽ tự động được tải.

Ví dụ: để cài đặt tất cả các mô-đun GKI trên phân vùng system_dlkm cho hạt nhân GKI arm64 5.15 từ các bản dựng sẵn:

 BOARD_SYSTEM_KERNEL_MODULES := $(wildcard kernel/prebuilts/5.15/arm64/*.ko)

Gắn system_dlkm trong thời gian chạy

Tuỳ thuộc vào hệ thống tệp đang được dùng làm hệ thống tệp chỉ đọc, hãy thêm nội dung sau vào fstab để gắn phân vùng system_dlkm trong thời gian chạy:

ext4 dưới dạng hệ thống tệp chỉ có thể đọc

  system_dlkm /system_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb

erofs dưới dạng hệ thống tệp chỉ có thể đọc

  system_dlkm /system_dlkm erofs ro wait,logical,first_stage_mount,slotselect,avb

Gắn phân vùng và tải mô-đun

Trong quá trình first_stage_init, phân vùng system_dlkm được gắn trong /system_dlkm dưới dạng hệ thống tệp chỉ đọc. Khi quá trình gắn kết thành công, các đường liên kết tượng trưng tại /system/lib/modules trỏ đến /system_dlkm/lib/modules sẽ có sẵn.

Sau đó, một quy trình của nhà cung cấp (chẳng hạn như tập lệnh .rc) có thể tải các mô-đun kernel dựa trên thứ tự được chỉ định trong modules.load. Quy trình của nhà cung cấp phải sử dụng đường liên kết tượng trưng /system/lib/modules để tải các mô-đun. Nếu cần, quy trình của nhà cung cấp cũng có thể tải các mô-đun vào lúc khác.

SELinux

Mọi tệp trong phân vùng system_dlkm đều được gắn nhãn bằng ngữ cảnh tệp của system_dlkm_file. Để tải tệp mô-đun GKI trong phân vùng system_dlkm, quy trình của nhà cung cấp chịu trách nhiệm tải các mô-đun cần có sepolicy trong miền của nhà cung cấp.

Ví dụ: dlkm_loader mà Cuttlefish dùng để tải các mô-đun GKI có các quyền sau trong tệp chính sách tại shared/sepolicy/vendor/dlkm_loader.te:

allow dlkm_loader self:capability sys_module;
allow dlkm_loader system_dlkm_file:dir r_dir_perms;
allow dlkm_loader system_dlkm_file:file r_file_perms;
allow dlkm_loader system_dlkm_file:system module_load;

Xác thực phân vùng system-dlkm

Google cung cấp một trường hợp kiểm thử VTS GKI để xác minh phân vùng system_dlkm. Để gọi kiểm thử theo cách thủ công, hãy dùng lệnh atest sau:

  atest -c vts_dlkm_partition_test