website/docs/ja_JP/guide/metamodule.md
メタモジュールは、KernelSU の革命的な機能であり、モジュールシステムの重要な機能をコアデーモンからプラグイン可能なモジュールに移行します。このアーキテクチャの転換により、KernelSU の安定性とセキュリティを維持しながら、モジュールエコシステムのより大きなイノベーションの可能性を解き放ちます。
メタモジュールは、モジュールシステムのコアインフラストラクチャ機能を提供する特別なタイプの KernelSU モジュールです。システムファイルを変更する通常のモジュールとは異なり、メタモジュールは通常のモジュールのインストールとマウントの方法を制御します。
メタモジュールは、KernelSU のモジュール管理インフラストラクチャの完全なカスタマイズを可能にするプラグインベースの拡張メカニズムです。マウントとインストールのロジックをメタモジュールに委任することで、KernelSU は脆弱な検出ポイントになることを避けながら、多様な実装戦略を可能にします。
主な特徴:
従来のルートソリューションは、マウントロジックをコアに組み込んでおり、検出されやすく、進化させることが困難です。KernelSU のメタモジュールアーキテクチャは、関心の分離によってこれらの問題を解決します。
戦略的優位性:
マウントの柔軟性:
meta-overlayfs 経由)マウントを超えて:
::: warning 重要
メタモジュールがインストールされていない場合、モジュールはマウントされません。新規の KernelSU インストールでは、モジュールを機能させるためにメタモジュール(meta-overlayfs など)をインストールする必要があります。
:::
通常のモジュールと同じ方法でメタモジュールをインストールします:
meta-overlayfs.zip)をダウンロードしますmeta-overlayfs メタモジュールは、ext4 イメージサポートを備えた従来の overlayfs ベースのモジュールマウントを提供する公式リファレンス実装です。
KernelSU Manager アプリのモジュールページで、現在アクティブなメタモジュールを確認できます。アクティブなメタモジュールは、特別な指定とともにモジュールリストに表示されます。
::: danger 警告 メタモジュールをアンインストールすると、すべてのモジュールに影響します。削除後、別のメタモジュールをインストールするまで、モジュールはマウントされなくなります。 :::
アンインストール手順:
アンインストール後、モジュールが引き続き動作するようにするには、別のメタモジュールをインストールする必要があります。
一度に1つのメタモジュールのみインストールできます。2つ目のメタモジュールをインストールしようとすると、KernelSU は競合を避けるためにインストールを防止します。
メタモジュールを切り替える手順:
通常の KernelSU モジュールを開発している場合、メタモジュールについてあまり心配する必要はありません。ユーザーが互換性のあるメタモジュール(meta-overlayfs など)をインストールしていれば、モジュールは動作します。
知っておくべきこと:
system ディレクトリは、ユーザーがマウント機能を提供するメタモジュールをインストールしている場合にのみマウントされます::: tip Magisk モジュール開発に精通している場合、メタモジュールをインストールすると、Magisk 互換のマウントを提供するため、モジュールは KernelSU でも同じように動作します。 :::
メタモジュールを作成すると、KernelSU がモジュールのインストール、マウント、アンインストールを処理する方法をカスタマイズできます。
メタモジュールは、module.prop の特別なプロパティによって識別されます:
id=my_metamodule
name=My Custom Metamodule
version=1.0
versionCode=1
author=Your Name
description=Custom module mounting implementation
metamodule=1
metamodule=1(または metamodule=true)プロパティは、これをメタモジュールとしてマークします。このプロパティがない場合、モジュールは通常のモジュールとして扱われます。
メタモジュール構造:
my_metamodule/
├── module.prop (metamodule=1 を含む必要があります)
│
│ *** メタモジュール固有のフック ***
├── metamount.sh (オプション: カスタムマウントハンドラー)
├── metainstall.sh (オプション: 通常モジュールのインストールフック)
├── metauninstall.sh (オプション: 通常モジュールのクリーンアップフック)
│
│ *** 標準モジュールファイル(すべてオプション) ***
├── customize.sh (インストールカスタマイズ)
├── post-fs-data.sh (post-fs-data ステージスクリプト)
├── service.sh (late_start service スクリプト)
├── boot-completed.sh (起動完了スクリプト)
├── uninstall.sh (メタモジュール自体のアンインストールスクリプト)
├── system/ (必要に応じてシステムレス変更)
└── [その他のファイル]
メタモジュールは、特別なメタモジュールフックに加えて、すべての標準モジュール機能(ライフサイクルスクリプトなど)を使用できます。
メタモジュールは最大3つの特別なフックスクリプトを提供できます:
目的: 起動中にモジュールがマウントされる方法を制御します。
実行タイミング: post-fs-data ステージ中、モジュールスクリプトが実行される前。
環境変数:
MODDIR: メタモジュールのディレクトリパス(例: /data/adb/modules/my_metamodule)責任:
skip_mount フラグをチェックする::: danger 重要な要件
マウント操作を実行する際、ソース/デバイス名を "KSU" に設定する必要があります。これにより、マウントが KernelSU に属していることが識別されます。
例(正しい):
mount -t overlay -o lowerdir=/lower,upperdir=/upper,workdir=/work KSU /target
最新のマウント API の場合、ソース文字列を設定します:
fsconfig_set_string(fs, "source", "KSU")?;
これは、KernelSU がマウントを適切に識別して管理するために不可欠です。 :::
スクリプト例:
#!/system/bin/sh
MODDIR="${0%/*}"
# 例: シンプルなバインドマウント実装
for module in /data/adb/modules/*; do
if [ -f "$module/disable" ] || [ -f "$module/skip_mount" ]; then
continue
fi
if [ -d "$module/system" ]; then
# source=KSU でマウント(必須!)
mount -o bind,dev=KSU "$module/system" /system
fi
done
目的: 通常のモジュールのインストール方法をカスタマイズします。
実行タイミング: モジュールのインストール中、ファイルが抽出された後、インストールが完了する前。このスクリプトは、customize.sh の動作と同様に、組み込みインストーラーによってソースされます(実行されるのではありません)。
環境変数と関数:
このスクリプトは、組み込みの install.sh からすべての変数と関数を継承します:
MODPATH、TMPDIR、ZIPFILE、ARCH、API、IS64BIT、KSU、KSU_VER、KSU_VER_CODE、BOOTMODE などui_print <msg> - コンソールにメッセージを出力abort <msg> - エラーを出力してインストールを終了set_perm <target> <owner> <group> <permission> [context] - ファイルパーミッションを設定set_perm_recursive <directory> <owner> <group> <dirpermission> <filepermission> [context] - 再帰的にパーミッションを設定install_module - 組み込みモジュールインストールプロセスを呼び出すユースケース:
install_module を呼び出す)注意: このスクリプトは、メタモジュール自体をインストールする際には呼び出されません。
目的: 通常のモジュールがアンインストールされるときにリソースをクリーンアップします。
実行タイミング: モジュールのアンインストール中、モジュールディレクトリが削除される前。
環境変数:
MODULE_ID: アンインストールされるモジュールの IDユースケース:
スクリプト例:
#!/system/bin/sh
# 通常のモジュールをアンインストールするときに呼び出される
MODULE_ID="$1"
IMG_MNT="/data/adb/metamodule/mnt"
# イメージからモジュールファイルを削除
if [ -d "$IMG_MNT/$MODULE_ID" ]; then
rm -rf "$IMG_MNT/$MODULE_ID"
fi
起動実行順序を理解することは、メタモジュール開発にとって重要です:
post-fs-data ステージ:
1. 共通の post-fs-data.d スクリプトを実行
2. モジュールをプルーン、restorecon、sepolicy.rule をロード
3. メタモジュールの post-fs-data.sh を実行(存在する場合)
4. 通常のモジュールの post-fs-data.sh を実行
5. system.prop をロード
6. メタモジュールの metamount.sh を実行
└─> すべてのモジュールをシステムレスにマウント
7. post-mount.d ステージが実行される
- 共通の post-mount.d スクリプト
- メタモジュールの post-mount.sh(存在する場合)
- 通常のモジュールの post-mount.sh
service ステージ:
1. 共通の service.d スクリプトを実行
2. メタモジュールの service.sh を実行(存在する場合)
3. 通常のモジュールの service.sh を実行
boot-completed ステージ:
1. 共通の boot-completed.d スクリプトを実行
2. メタモジュールの boot-completed.sh を実行(存在する場合)
3. 通常のモジュールの boot-completed.sh を実行
重要なポイント:
metamount.sh は、すべての post-fs-data スクリプト(メタモジュールと通常のモジュールの両方)の後に実行されますpost-fs-data.sh、service.sh、boot-completed.sh)は、常に通常のモジュールスクリプトの前に実行されます.d ディレクトリの共通スクリプトは、メタモジュールスクリプトの前に実行されますpost-mount ステージは、マウントが完了した後に実行されますメタモジュールがインストールされると、KernelSU はシンボリックリンクを作成します:
/data/adb/metamodule -> /data/adb/modules/<metamodule_id>
これにより、ID に関係なく、アクティブなメタモジュールにアクセスするための安定したパスが提供されます。
利点:
meta-overlayfs メタモジュールは公式のリファレンス実装です。メタモジュール開発のベストプラクティスを示しています。
meta-overlayfs はデュアルディレクトリアーキテクチャを使用します:
メタデータディレクトリ: /data/adb/modules/
module.prop、disable、skip_mount マーカーを含むコンテンツディレクトリ: /data/adb/metamodule/mnt/
modules.img)に保存meta-overlayfs がマウントハンドラーを実装する方法は次のとおりです:
#!/system/bin/sh
MODDIR="${0%/*}"
IMG_FILE="$MODDIR/modules.img"
MNT_DIR="$MODDIR/mnt"
# まだマウントされていない場合は ext4 イメージをマウント
if ! mountpoint -q "$MNT_DIR"; then
mkdir -p "$MNT_DIR"
mount -t ext4 -o loop,rw,noatime "$IMG_FILE" "$MNT_DIR"
fi
# デュアルディレクトリサポートのための環境変数を設定
export MODULE_METADATA_DIR="/data/adb/modules"
export MODULE_CONTENT_DIR="$MNT_DIR"
# マウントバイナリを実行
# (実際のマウントロジックは Rust バイナリにあります)
"$MODDIR/meta-overlayfs"
Overlayfs マウント:
/data/adb/modules/.rw/ を介した読み書きレイヤーサポートソース識別:
// meta-overlayfs/src/mount.rs から
fsconfig_set_string(fs, "source", "KSU")?; // 必須!
これにより、すべてのオーバーレイマウントに対して dev=KSU が設定され、適切な識別が可能になります。
メタモジュールを開発する際:
skip_mount と disable をサポートしますecho またはロギングを使用しますリリース前に:
ユーザー向け: マウントが必要なモジュールを使用したい場合のみ。スクリプトを実行するだけでシステムファイルを変更しないモジュールのみを使用する場合は、メタモジュールは必要ありません。
モジュール開発者向け: いいえ、通常どおりモジュールを開発します。モジュールがマウントを必要とする場合にのみ、ユーザーはメタモジュールが必要です。
上級ユーザー向け: マウント動作をカスタマイズしたい場合、または代替マウント実装を作成したい場合のみ。
いいえ。一度に1つのメタモジュールのみインストールできます。これにより、競合が防止され、予測可能な動作が保証されます。
モジュールはマウントされなくなります。デバイスは正常に起動しますが、別のメタモジュールをインストールするまで、モジュールの変更は適用されません。
いいえ。ほとんどのモジュールと互換性のある標準の overlayfs マウントを提供します。異なる動作が必要な場合は、独自のメタモジュールを作成できます。