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‑подсистем, а также поддержке и сопровождению ваших проектов.