ベンダー / ODM DLKM パーティション

Android 11 では、汎用カーネル イメージ(GKI)とベンダー ブート パーティションという概念が導入されています。ベンダー ブート パーティションは、GKI と互換性のあるカーネル モジュールを格納し、第 1 ステージの init により読み込まれます。Android 11 より前のリリースでは、カーネル モジュールはベンダー パーティションと ODM パーティションに格納され、ベンダー プロセスによって読み込まれます。

Android 11 以降では、カーネルとすべてのカーネル モジュールを、他のパーティションから独立して更新できます。ベンダー パーティションに格納されたカーネル モジュールの更新を(ベンダー パーティションを更新せずに)有効にするには、すべてのベンダー パーティション モジュールを Vendor DLKM(動的に読み込み可能なカーネル モジュール)という新しいパーティションに移動します。このパーティションは個別に更新できます。同様に、ODM パーティションに保存されているすべてのカーネル モジュールを ODM DLKM という新しいパーティションに移動できます。このパーティションも個別に更新できます。

パーティションの場所

vendor_dlkm パーティションと odm_dlkm パーティションは、別の動的パーティションとして super パーティションに配置されています。

/vendor/lib/modules の vendor_dlkm の内容

  • ベンダー カーネル モジュール
  • modprobe 構成ファイル
  • modules.load ファイル

/odm/lib/modules の odm_dlkm の内容

  • ODM カーネル モジュール
  • modprobe 構成ファイル
  • modules.load ファイル

カーネル モジュールの構成ファイルの詳細については、カーネル モジュールのサポートをご覧ください。

ビルドサポート

vendor_dlkmodm_dlkm をビルドするプロセスは、他の動的パーティションをビルドするプロセスと同様です。

vendor_dlkm ビルドの例

以下の例のように vendor_dlkm をビルドします。

BoardConfig.mk

BOARD_USES_VENDOR_DLKMIMAGE := true
BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_COPY_OUT_VENDOR_DLKM := vendor_dlkm
BOARD_<GROUP_NAME>_PARTITION_LIST += vendor_dlkm

<GROUP_NAME> は、所定の更新グループの適切な名前に置き換えます。更新グループは、ベンダー パーティションが属するグループである必要があります。

A/B デバイスと仮想 A/B デバイスの場合: device.mk

AB_OTA_PARTITIONS += vendor_dlkm

fstab

次のように vendor_dlkm のエントリを fstab に追加します。デバイスに応じてフラグを変更します。CL の CF に vendor_dlkm を追加するを例として使用します。

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

odm_dlkm ビルドの例

以下の例のように odm_dlkm をビルドします。

BoardConfig.mk

BOARD_USES_ODM_DLKIMAGE := true
BOARD_ODM_DLKIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_COPY_OUT_ODM_DLKM := odm_dlkm
BOARD_<group_name>_PARTITION_LIST += odm_dlkm

A/B デバイスと仮想 A/B デバイスの場合: device.mk

AB_OTA_PARTITIONS += odm_dlkm

fstab

次のように odm_dlkm のエントリを fstab に追加します。デバイスに応じてフラグを変更します。CL の CF に odm_dlkm を追加するを例として使用します。

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

カーネル モジュールをパーティションにコピーする

vendor_dlkm パーティションにコピーするカーネル モジュールを選択するには、そのパーティションを BOARD_VENDOR_KERNEL_MODULES にリストします。

modules.load の内容をオーバーライドする場合は、BOARD_VENDOR_KERNEL_MODULES_LOAD で指定します。

ビルド時に、BOARD_VENDOR_KERNEL_MODULES にリストされているモジュールが $ANDROID_PRODUCT_OUT/vendor_dlkm/lib/modules にインストールされます。/vendor_dlkm/lib/modules へのシンボリック リンクが /vendor/lib/modules に作成されます。

同様に、odm_dlkm パーティションにコピーするカーネル モジュールを選択するには、そのパーティションを BOARD_ODM_KERNEL_MODULES にリストします。プラットフォーム ビルドは、これらのモジュールに対して depmod を実行し、depmod 出力ファイルをイメージにコピーします。ビルドにより modules.load ファイルが作成され、イメージに格納されます。このファイルには、BOARD_ODM_KERNEL_MODULES にリストされているすべてのモジュールが含まれています。

modules.load の内容をオーバーライドする場合は、BOARD_ODM_KERNEL_MODULES_LOAD で指定します。

ビルド時に、BOARD_ODM_KERNEL_MODULES にリストされているモジュールが $ANDROID_PRODUCT_OUT/odm_dlkm/lib/modules にインストールされます。/odm_dlkm/lib/modules へのシンボリック リンクが /odm/lib/modules に作成されます。

ベンダー モジュールと ODM カーネル モジュールには、常に /vendor/lib/modules/odm/lib/modules を使用します。

/vendor_dlkm/lib/modules は使用しないでください。vendor_dlkm パーティションのないデバイスでこれを行うと、BOARD_VENDOR_KERNEL_MODULES が直接 /vendor/lib/modules にインストールされます。/vendor_dlkm/lib/modules は存在しないため、問題が発生します。

/odm_dlkm/lib/modules は使用しないでくださいodm_dlkm パーティションのないデバイスでこれを行うと、BOARD_ODM_KERNEL_MODULES が直接 /odm/lib/modules にインストールされます。/odm_dlkm/lib/modules は存在しないため、問題が発生します。

パーティションのマウントとモジュールの読み込み

first_stage_init の間に、vendor_dlkm パーティションと odm_dlkm パーティションはそれぞれ /vendor_dlkm パーティションと /odm_dlkm パーティションにマウントされます。これが行われた時点で、/vendor/lib/modules/odm/lib/modules のシンボリック リンクが利用可能になります。

その後、ベンダー プロセス(「.rc」スクリプトなど)は modules.load で指定された順序に基づいてカーネル モジュールを読み込めるようになります。そのベンダー プロセスは、必要に応じて後でモジュールを読み込むこともできます。

ベンダー ブート パーティション(ベンダー RAM ディスクを含む)の作成に関するドキュメントについては、カーネル モジュールのサポートをご覧ください。