website/docs/ru_RU/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%/*}"
# Пример: Простая реализация bind mount
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 для всех overlay монтирований, обеспечивая правильную идентификацию.
При разработке метамодулей:
skip_mount и disableecho или логирование для отладкиПеред выпуском:
Для пользователей: Только если вы хотите использовать модули, требующие монтирования. Если вы используете только модули, которые запускают скрипты без изменения системных файлов, вам не нужен метамодуль.
Для разработчиков модулей: Нет, вы разрабатываете модули как обычно. Пользователям нужен метамодуль только если ваш модуль требует монтирования.
Для продвинутых пользователей: Только если вы хотите настроить поведение монтирования или создать альтернативные реализации монтирования.
Нет. Одновременно может быть установлен только один метамодуль. Это предотвращает конфликты и обеспечивает предсказуемое поведение.
Модули больше не будут монтироваться. Ваше устройство будет загружаться нормально, но модификации модулей не будут применяться, пока вы не установите другой метамодуль.
Нет. Он обеспечивает стандартное монтирование overlayfs, совместимое с большинством модулей. Вы можете создать свой собственный метамодуль, если вам нужно другое поведение.