Mengimplementasikan partisi modul GKI

Modul GKI dan GKI dapat diupdate secara terpisah dari partisi lainnya karena modul GKI berada di partisi dinamis yang terpisah dalam super image yang disebut system_dlkm. Modul GKI ditandatangani oleh Google menggunakan pasangan kunci build-time kernel dan hanya kompatibel dengan GKI yang digunakan untuk mem-build-nya. Tidak ada stabilitas ABI antara modul GKI dan GKI; agar modul dimuat dengan benar selama runtime, modul GKI dan GKI harus dibuat dan diupdate bersama.

Menerapkan dukungan partisi system_dklm

Partisi system_dlkm terletak di partisi super sebagai partisi dinamis lainnya. Partisi ini dapat berisi:

  • Modul kernel yang ditandatangani saat build Google
  • depmod artefak

Versi system_dlkm

Mem-build system_dlkm adalah proses yang mirip dengan mem-build partisi dinamis lainnya. Lakukan langkah-langkah berikut untuk menambahkan system_dlkm ke build Anda:

  1. Di BoardConfig.mk, tambahkan entri berikut:

    BOARD_USES_SYSTEM_DLKMIMAGE := true
    BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE)
    TARGET_COPY_OUT_SYSTEM_DLKM := system_dlkm
    
  2. Dalam daftar partisi, tambahkan system_dlkm: BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm

  3. (Opsional) Untuk perangkat A/B dan A/B virtual, tambahkan baris berikut dalam file device.mk untuk perangkat Anda:

    AB_OTA_PARTITIONS += system_dlkm
    

Mengidentifikasi modul kernel yang akan disalin ke system_dlkm

Agar modul berhasil dimuat saat runtime, modul GKI dan GKI harus di-build bersama. Oleh karena itu, Anda harus mengidentifikasi modul kernel dalam build GKI untuk arsitektur target dan menyediakannya sebagai sumber untuk partisi system_dlkm selama build platform.

Untuk Android 13

Arahkan BOARD_SYSTEM_DLKM_SRC ke folder yang berisi file objek kernel modul GKI yang diperlukan untuk perangkat sebagai input bagi sistem build untuk menghasilkan partisi system_dlkm. Contoh:

Berikan sumber modul GKI dalam folder dan arahkan BOARD_SYSTEM_DLKM_SRC ke folder tersebut. Contoh:

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

Pada waktu build, modul yang tercantum dalam BOARD_SYSTEM_DLKM_SRC akan diinstal di $ANDROID_PRODUCT_OUT/system_dlkm.

Untuk Android 14

Kami telah menyederhanakan implementasi dengan makro (BOARD_*_KERNEL_MODULES) yang digunakan untuk partisi *_dlkm lainnya. Daftar modul GKI yang diperlukan untuk perangkat harus direferensikan oleh makro BOARD_SYSTEM_KERNEL_MODULES. Pada waktu build, modul ini diinstal di $ANDROID_PRODUCT_OUT/system_dlkm. Setiap modul dalam partisi vendor_dlkm yang memiliki dependensi pada modul dalam partisi system_dlkm akan menghasilkan referensi yang benar dalam file modules.dep untuk partisi vendor_dlkm. Karena dependensi lintas partisi yang direpresentasikan oleh modules.dep, saat modul vendor dimuat, modul GKI yang diperlukan akan dimuat secara otomatis.

Misalnya, untuk menginstal semua modul GKI di partisi system_dlkm untuk kernel arm64 GKI 5.15 dari yang telah dibuat sebelumnya:

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

Memasang system_dlkm saat runtime

Bergantung pada sistem file yang digunakan sebagai sistem file hanya baca, tambahkan kode berikut dalam fstab untuk memasang partisi system_dlkm saat runtime:

ext4 sebagai sistem file hanya baca

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

erofs sebagai sistem file hanya baca

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

Pemasangan partisi dan pemuatan modul

Selama first_stage_init, partisi system_dlkm dipasang di /system_dlkm sebagai sistem file hanya baca. Jika pemasangan berhasil, link simbolis di /system/lib/modules yang mengarah ke /system_dlkm/lib/modules akan tersedia.

Proses vendor, seperti skrip .rc, kemudian dapat memuat modul kernel berdasarkan urutan yang ditetapkan dalam modules.load. Proses vendor harus menggunakan link simbolis /system/lib/modules untuk memuat modul. Jika perlu, proses vendor juga dapat memuat modul di lain waktu.

SELinux

Setiap file dalam partisi system_dlkm diberi label dengan konteks file system_dlkm_file. Untuk memuat file modul GKI di partisi system_dlkm, proses vendor yang bertanggung jawab untuk memuat modul memerlukan sepolicy di domain vendor.

Misalnya, dlkm_loader yang digunakan oleh Cuttlefish untuk memuat modul GKI memiliki izin berikut dalam file kebijakan di 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;

Memvalidasi partisi sistem-dlkm

Google menyediakan kasus pengujian GKI VTS untuk memverifikasi partisi system_dlkm. Untuk memanggil pengujian secara manual, gunakan perintah atest berikut:

  atest -c vts_dlkm_partition_test