Mengimplementasikan partisi modul GKI

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

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 waktu pembuatan Google
  • depmod artefak

Versi system_dlkm

Membuat system_dlkm adalah proses yang serupa dengan membuat 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. Di 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 di file device.mk untuk perangkat Anda:

    AB_OTA_PARTITIONS += system_dlkm
    

Identifikasi modul kernel yang akan disalin ke system_dlkm

Agar modul berhasil dimuat saat runtime, GKI dan modul GKI harus dibangun 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 ke sistem build untuk membuat partisi system_dlkm. Contoh:

Sediakan 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 di BOARD_SYSTEM_DLKM_SRC diinstal di $ANDROID_PRODUCT_OUT/system_dlkm.

Untuk Android 14

Kami telah menyederhanakan penerapan dengan makro (BOARD_*_KERNEL_MODULES) yang digunakan untuk partisi *_dlkm lainnya. Daftar modul GKI yang diperlukan untuk perangkat harus dirujuk oleh makro BOARD_SYSTEM_KERNEL_MODULES. Pada waktu build, modul ini diinstal di $ANDROID_PRODUCT_OUT/system_dlkm. Modul apa pun di partisi vendor_dlkm yang memiliki dependensi pada modul di partisi system_dlkm akan menghasilkan referensi yang benar dalam file modules.dep untuk partisi vendor_dlkm. Karena dependensi lintas partisi yang diwakili 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 prebuilt:

 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 di 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 ditentukan 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 di 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 system-dlkm

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

  atest -c vts_dlkm_partition_test