Mengimplementasikan partisi modul GKI

Modul GKI dan GKI dapat diupdate secara terpisah dari partisi lainnya karena modul GKI berada di partisi dinamis terpisah dalam image super disebut system_dlkm. Modul GKI ditandatangani oleh Google menggunakan kernel pasangan kunci {i>build-time<i} dan hanya kompatibel dengan GKI yang dibuatnya. Tidak ada stabilitas ABI antara modul GKI dan GKI; untuk memuat modul dengan benar selama runtime, modul GKI dan GKI harus dibangun dan diupdate secara bersamaan.

Menerapkan dukungan partisi system_dklm

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

  • Modul kernel yang ditandatangani waktu build Google
  • depmod artefak

Versi system_dlkm

Mem-build system_dlkm adalah proses yang mirip dengan mem-build dinamis lainnya partisi. 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 di kolom 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 dibangun secara bersamaan. Oleh karena itu, Anda harus mengidentifikasi modul kernel dalam build GKI untuk arsitektur target dan menyediakannya sebagai sumber untuk partisi system_dlkm selama pembangunan platform.

Untuk Android 13

Arahkan BOARD_SYSTEM_DLKM_SRC ke folder yang berisi modul GKI yang diperlukan file objek kernel untuk perangkat sebagai input bagi sistem build untuk menghasilkan 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 dalam BOARD_SYSTEM_DLKM_SRC akan diinstal di $ANDROID_PRODUCT_OUT/system_dlkm.

Untuk Android 14

Kami telah menyederhanakan penerapan dengan makro (BOARD_*_KERNEL_MODULES) sedang digunakan untuk partisi *_dlkm. 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. Modul apa pun di Partisi vendor_dlkm yang memiliki dependensi pada modul di system_dlkm menghasilkan referensi yang benar dalam file modules.dep untuk Partisi vendor_dlkm. Karena dependensi lintas partisi yang direpresentasikan oleh modules.dep, jika modul vendor dimuat, modul GKI apa pun yang diperlukan dimuat secara otomatis.

Misalnya, untuk menginstal semua modul GKI di partisi system_dlkm untuk GKI Kernel arm64 5.15 dari bawaan:

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

Pasang system_dlkm saat runtime

Tergantung 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. Pada pemasangan yang berhasil, simbolik link di /system/lib/modules yang mengarah ke /system_dlkm/lib/modules adalah yang 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 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 akses 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. Kepada panggil pengujian secara manual, gunakan perintah atest berikut:

  atest -c vts_dlkm_partition_test