GKI と GKI モジュールは、パーティションの残りの部分とは別に更新できます。これは、GKI モジュールが system_dlkm と呼ばれるスーパー イメージの別の動的パーティションに存在するためです。GKI モジュールは、カーネルビルド時間の鍵ペアを使用して Google によって署名され、ビルドされた GKI とのみ互換性があります。GKI と GKI モジュールの間に ABI の安定性はありません。実行時にモジュールを正しく読み込むには、GKI と GKI モジュールを一緒にビルドして更新する必要があります。
system_dlkm パーティションのサポートを実装する
system_dlkm パーティションは、別の動的パーティションとして super パーティションに配置されています。このパーティションには次のものを含めることができます。
- Google ビルド時の署名済みカーネル モジュール
depmodのアーティファクト
system_dlkm をビルドする
system_dlkm をビルドするプロセスは、他の動的パーティションをビルドするプロセスと同様です。ビルドに system_dlkm を追加する手順は次のとおりです。
BoardConfig.mkに、次のエントリを追加します。BOARD_USES_SYSTEM_DLKMIMAGE := true BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE) TARGET_COPY_OUT_SYSTEM_DLKM := system_dlkmパーティション リストに
system_dlkm:BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkmを追加します。(省略可)A/B デバイスと仮想 A/B デバイスの場合は、デバイスの
device.mkファイルに次の行を追加します。AB_OTA_PARTITIONS += system_dlkm
system_dlkm にコピーするカーネル モジュールを特定する
ランタイムにモジュールを正常に読み込むには、GKI と GKI モジュールを一緒にビルドする必要があります。したがって、ターゲット アーキテクチャの GKI ビルド内のカーネル モジュールを特定し、プラットフォームのビルド中に system_dlkm パーティションのソースとして指定する必要があります。
Android 13 の場合
system_dlkm パーティションを生成するビルド システムへの入力として、デバイスに必要な GKI モジュール カーネル オブジェクト ファイルを含むフォルダを BOARD_SYSTEM_DLKM_SRC が指すようにします。次に例を示します。
GKI モジュールのソースをフォルダに追加し、そのフォルダを BOARD_SYSTEM_DLKM_SRC が指すようにします。次に例を示します。
BOARD_SYSTEM_DLKM_SRC := kernel/prebuilts/5.10/arm64/system_dlkm_staging
ビルド時に、BOARD_SYSTEM_DLKM_SRC にリストされているモジュールが $ANDROID_PRODUCT_OUT/system_dlkm にインストールされます。
Android 14 の場合
他の *_dlkm パーティションに使用されているマクロ(BOARD_*_KERNEL_MODULES)により、実装を効率化しました。デバイスに必要な GKI モジュールのリストは、BOARD_SYSTEM_KERNEL_MODULES マクロで参照する必要があります。ビルド時に、これらのモジュールが $ANDROID_PRODUCT_OUT/system_dlkm にインストールされます。system_dlkm パーティション内のモジュールと依存関係を持つ vendor_dlkm パーティション内のモジュールはすべて、vendor_dlkm パーティションの modules.dep ファイル内に正しい参照を生成します。modules.dep で表されるこのクロス パーティションの依存関係により、ベンダー モジュールが読み込まれると、必要な GKI モジュールが自動的に読み込まれます。
たとえば、ビルド済みの GKI arm64 カーネル 5.15 の system_dlkm パーティションに、すべての GKI モジュールをインストールするには、次のようにします。
BOARD_SYSTEM_KERNEL_MODULES := $(wildcard kernel/prebuilts/5.15/arm64/*.ko)
実行時に system_dlkm をマウントする
読み取り専用のファイル システムとして使用されているファイル システムに応じて、fstab に以下を追加して、実行時に system_dlkm パーティションをマウントします。
ext4 が読み取り専用のファイル システムの場合
system_dlkm /system_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb
erofs が読み取り専用のファイル システムの場合
system_dlkm /system_dlkm erofs ro wait,logical,first_stage_mount,slotselect,avb
パーティションのマウントとモジュールの読み込み
first_stage_init の間に、system_dlkm パーティションが読み取り専用ファイル システムとして /system_dlkm にマウントされます。マウントが正常に完了すると、/system_dlkm/lib/modules を指す /system/lib/modules のシンボリック リンクが使用可能になります。
ベンダー プロセス(.rc スクリプトなど)は、その後、modules.load で指定された順序に基づいてカーネル モジュールを読み込むことができます。ベンダー プロセスでは、シンボリック リンク /system/lib/modules を使用してモジュールを読み込む必要があります。必要に応じて、ベンダー プロセスは後でモジュールを読み込むこともできます。
SELinux
system_dlkm パーティション内のすべてのファイルには、system_dlkm_file のファイル コンテキストでラベル付けされます。system_dlkm パーティションの GKI モジュール ファイルを読み込むには、モジュールの読み込みを担当するベンダー プロセスに、ベンダー ドメインの sepolicy が必要です。
たとえば、Cuttlefish が GKI モジュールを読み込むために使用する dlkm_loader には、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;
system_dlkm パーティションを検証する
Google では、system_dlkm パーティションを検証するための GKI VTS テストケースを用意しています。テストを手動で呼び出すには、次の atest コマンドを使用します。
atest -c vts_dlkm_partition_test