website/docs/zh_TW/guide/metamodule.md
元模組是 KernelSU 的一項革命性功能,它將關鍵的模組系統能力從核心守護程序轉移到可插拔模組中。這種架構轉變在保持 KernelSU 穩定性和安全性的同時,為模組生態系統釋放了更大的創新潛力。
元模組是一種特殊類型的 KernelSU 模組,為模組系統提供核心基礎設施功能。與修改系統檔案的常規模組不同,元模組控制常規模組的安裝和掛載方式。
元模組是一種基於外掛的擴充機制,允許完全自訂 KernelSU 的模組管理基礎設施。透過將掛載和安裝邏輯委託給元模組,KernelSU 避免成為脆弱的檢測點,同時支援多樣化的實作策略。
主要特徵:
傳統的 Root 解決方案將掛載邏輯內建在核心中,這使得它們更容易被檢測且難以演進。KernelSU 的元模組架構透過關注點分離解決了這些問題。
策略優勢:
掛載靈活性:
meta-overlayfs)超越掛載:
::: warning 重要
如果沒有安裝元模組,模組將不會被掛載。新安裝的 KernelSU 需要安裝元模組(如 meta-overlayfs)才能使模組正常運作。
:::
像安裝常規模組一樣安裝元模組:
meta-overlayfs.zip)meta-overlayfs 元模組是官方參考實作,提供傳統的基於 overlayfs 的模組掛載,支援 ext4 映像。
您可以在 KernelSU Manager 應用程式的模組頁面中檢視目前活動的元模組。活動的元模組將顯示在模組清單中,並帶有特殊標識。
::: danger 警告 解除安裝元模組會影響所有模組。移除後,模組將不再被掛載,直到您安裝另一個元模組。 :::
解除安裝步驟:
解除安裝後,如果您希望模組繼續運作,應該安裝另一個元模組。
一次只能安裝一個元模組。如果您嘗試安裝第二個元模組,KernelSU 將阻止安裝以避免衝突。
切換元模組的步驟:
如果您正在開發常規 KernelSU 模組,您不需要太擔心元模組。只要使用者安裝了相容的元模組(如 meta-overlayfs),您的模組就能正常運作。
您需要知道的:
system 目錄只有在使用者安裝了提供掛載功能的元模組時才會被掛載::: tip 如果您熟悉 Magisk 模組開發,您的模組在安裝元模組後將在 KernelSU 中以相同方式運作,因為它提供了 Magisk 相容的掛載。 :::
建立元模組允許您自訂 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/ (無系統修改,如果需要)
└── [任何其他檔案]
除了特殊的元模組鉤子外,元模組可以使用所有標準模組功能(生命週期腳本等)。
元模組可以提供最多三個特殊鉤子腳本:
目的: 控制啟動期間模組的掛載方式。
執行時機: 在 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")?; // 必需!
這為所有 overlay 掛載設定 dev=KSU,實現正確識別。
開發元模組時:
skip_mount 和 disableecho 或日誌記錄進行除錯發布前:
對於使用者: 僅當您想使用需要掛載的模組時。如果您只使用執行腳本而不修改系統檔案的模組,則不需要元模組。
對於模組開發者: 不需要,您正常開發模組。僅當您的模組需要掛載時,使用者才需要元模組。
對於進階使用者: 僅當您想自訂掛載行為或建立替代掛載實作時。
不可以。一次只能安裝一個元模組。這可以防止衝突並確保可預測的行為。
模組將不再被掛載。您的裝置將正常啟動,但模組修改將不會套用,直到您安裝另一個元模組。
不是。它提供與大多數模組相容的標準 overlayfs 掛載。如果您需要不同的行為,可以建立自己的元模組。