We detected you are likely not from a Russian-speaking region. Would you like to switch to the international version of the site?

  Назад к списку статей

Создание собственного дистрибутива Linux‑подсистемы для Termux: ядро, init‑скрипты и пакетный менеджер

Termux предоставляет пользователям Android полноценную консольную среду, но в большинстве случаев это лишь набор готовых пакетов из репозитория pkg. Для продвинутых задач может потребоваться собственный дистрибутив — собственное ядро, система и менеджер пакетов, полностью адаптированные под ограничения Android. В этой статье мы пошагово разберём, как собрать ядро, написать init-скрипты и реализовать минимальный пакетный менеджер.

Подготовка среды

Для начала необходимо установить базовые инструменты разработки в Termux:

pkg update && pkg upgrade -y
pkg install git clang make ncurses-dev wget proot tar -y

Также понадобится android-ndk для кросс‑компиляции ядра. Его удобно загрузить напрямую:

wget https://dl.google.com/android/repository/android-ndk-r27b-linux.zip -O ndk.zip
unzip ndk.zip -d $HOME/ndk
export NDK_ROOT=$HOME/ndk/android-ndk-r27b
export PATH=$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH

Убедитесь, что переменные NDK_ROOT и PATH добавлены в ~/.bashrc.

Сборка ядра Linux для Android

Мы будем использовать официальную ветку ядра android-12.0, адаптированную под ARM64. Скачайте исходники:

git clone https://android.googlesource.com/kernel/common.git
cd common
git checkout android-12.0

Сконфигурируйте ядро под архитектуру вашего устройства:

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-android21- menuconfig

В меню General setup включите поддержку CONFIG_PROOT (если требуется) и отключите всё, что требует драйверов, недоступных в пользовательском пространстве. После сохранения конфигурации запустите сборку:

make -j$(nproc) ARCH=arm64 CROSS_COMPILE=aarch64-linux-android21-

Полученный образ ядра будет находиться в arch/arm64/boot/Image.gz. Для дальнейшего использования его достаточно распаковать в директорию $HOME/termux-distro/kernel:

mkdir -p $HOME/termux-distro/kernel
cp arch/arm64/boot/Image.gz $HOME/termux-distro/kernel/

Создание init‑скриптов

Termux запускает пользовательскую файловую систему через proot. Чтобы имитировать обычный процесс загрузки Linux, необходимо написать простой init-скрипт, который будет монтировать необходимые файловые системы и запускать systemd (или runit). Ниже пример минимального init-скрипта:

#!/data/data/com.termux/files/usr/bin/sh

# Монтируем pseudo‑файловые системы
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t tmpfs tmpfs /run

# Создаём базовые директории
mkdir -p /dev/pts /dev/shm
mount -t devpts devpts /dev/pts
mount -t tmpfs shm /dev/shm

# Запускаем основной процесс (systemd)
exec /sbin/init

Сохраните скрипт как $HOME/termux-distro/init.sh и сделайте его исполняемым:

chmod +x $HOME/termux-distro/init.sh

Для запуска дистрибутива используйте proot с указанием ядра и init‑скрипта:

proot --kernel=$HOME/termux-distro/kernel/Image.gz \
      --init=$HOME/termux-distro/init.sh \
      -0 -r $HOME/termux-distro/rootfs \
      /bin/bash

Обратите внимание, что в Termux нет привилегий root, поэтому --kernel работает лишь в режиме эмуляции (через qemu‑aarch64-static), что уже включено в proot при наличии соответствующего бинарника.

Разработка собственного пакетного менеджера

Для полного контроля над дистрибутивом удобно создать лёгкий менеджер пакетов. Ниже представлен простейший скрипт myapt, использующий tar‑архивы и SHA256‑контрольные суммы.

#!/data/data/com.termux/files/usr/bin/sh

REPO_URL="https://example.com/termux-distro"
PKG_DIR="/var/lib/myapt"
CACHE_DIR="/var/cache/myapt"

ensure_dirs() {
    mkdir -p "$PKG_DIR" "$CACHE_DIR"
}

install_pkg() {
    PKG_NAME=$1
    echo "Downloading $PKG_NAME..."
    wget "$REPO_URL/$PKG_NAME.tar.gz" -O "$CACHE_DIR/$PKG_NAME.tar.gz"
    wget "$REPO_URL/$PKG_NAME.sha256" -O "$CACHE_DIR/$PKG_NAME.sha256"
    echo "Verifying checksum..."
    cd "$CACHE_DIR" && sha256sum -c "$PKG_NAME.sha256"
    if [ $? -ne 0 ]; then
        echo "Checksum mismatch! Abort."
        exit 1
    fi
    echo "Extracting..."
    tar -xzf "$CACHE_DIR/$PKG_NAME.tar.gz" -C "$PKG_DIR"
    echo "$PKG_NAME installed."
}

list_pkgs() {
    echo "Available packages:"
    wget -qO- "$REPO_URL/index.txt"
}

case "$1" in
    install)
        ensure_dirs
        install_pkg "$2"
        ;;
    list)
        list_pkgs
        ;;
    *)
        echo "Usage: $0 {install|list} [package]"
        ;;
esac

Сохраните скрипт как /usr/local/bin/myapt, сделайте исполняемым и добавьте /usr/local/bin в PATH. Теперь вы можете размещать в репозитории простые tar.gz-пакеты с метаданными и управлять ими через myapt.

Тестирование и отладка

После сборки ядра, создания init‑скрипта и установки менеджера пакетов, запустите дистрибутив и проверьте базовые функции:

# Запуск дистрибутива
proot --kernel=$HOME/termux-distro/kernel/Image.gz \
      --init=$HOME/termux-distro/init.sh -0 -r $HOME/termux-distro/rootfs /bin/bash

# Внутри среды
root@termux:~# myapt list
root@termux:~# myapt install hello-world
root@termux:~# hello-world

Если какие‑то монтирования не проходят, проверьте вывод dmesg и убедитесь, что proot запущен с параметром --syscalls=allow для доступа к необходимым системным вызовам.

Заключение

Создание собственного дистрибутива Linux‑подсистемы для Termux — задача, требующая понимания кросс‑компиляции, работы init‑систем и управления пакетами. Приведённый набор шагов позволяет собрать ядро, написать минимальный init-скрипт и реализовать лёгкий менеджер пакетов, полностью контролируемый пользователем. Такой подход открывает двери к кастомным окружениям, оптимизированным под конкретные задачи, будь то научные вычисления, разработка или обучение.

Если вам нужен профессиональный аудит, настройка кастомных дистрибутивов или автоматизация сборки — команда RybinskLab готова помочь. Мы предоставляем услуги по разработке под Android, интеграции Linux‑подсистем, а также поддержке и сопровождению ваших проектов.

* Текст статьи подготовлен и структурирован с использованием технологий искусственного интеллекта. Проверен экспертом РыбинскЛАБ.

Поделиться знанием:

Нужна профессиональная помощь?

Меня зовут Усачёв Денис Евгеньевич. Я оказываю ИТ-услуги в Рыбинске и Ярославской области: настройка серверов, безопасность, автоматизация бизнеса. Запомните информация развлекательный ознакомительный носит, не нарушайте закон!

Связаться со мной
Поддержать проект