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 с помощью GitHub Actions и CI/CD

Прежде чем перейти к техническим деталям, стоит уточнить, что слово start в английском языке охватывает понятия «начало», «запуск», «внезапное движение». В словарях оно определяется как «to begin a movement, activity, or undertaking» и «a beginning of an action, journey, etc.» [merriam-webster.com](https://www.merriam-webster.com/dictionary/start), а также как «to begin or set out, as on a journey or activity» [dictionary.com](https://www.dictionary.com/browse/start). Эти определения отражают суть нашего проекта: запуск (start) автоматизированного процесса сборки и развёртывания кастомных ядер Linux в среде Termux.

Что такое Termux и зачем кастомные ядра

Termux – это эмулятор терминала и Linux‑окружения для Android, позволяющий устанавливать пакеты через pkg и apt. Для продвинутых пользователей важно иметь возможность использовать собственные ядра Linux, адаптированные под специфические задачи (например, поддержка новых драйверов, оптимизации под ARM‑архитектуру, экспериментальные патчи).

Почему CI/CD и GitHub Actions

Ручная сборка ядра занимает много времени и подвержена ошибкам. Интеграция с системой непрерывной интеграции (CI) и доставки (CD) позволяет:

  • Автоматически запускать сборку при каждом push в репозиторий.
  • Тестировать полученный образ в эмуляторе Termux.
  • Деплоить артефакт (tarball, .img) в облачное хранилище или напрямую в устройство.
  • Поддерживать версионирование и быстрый откат.

Подготовка окружения Termux

Перед тем как настроить CI, убедитесь, что в Termux установлены необходимые пакеты:

pkg update && pkg upgrade -y
pkg install git make gcc clang bc flex bison libncurses-dev openssl-dev wget curl zip unzip -y

Для сборки ядра понадобится кросс‑компилятор. В большинстве случаев под Android‑устройства достаточно clang из NDK, который можно установить через pkg install ndk-sysroot.

Структура репозитория

Рекомендуемая структура:

my-linux-kernel/
├─ .github/
│  └─ workflows/
│     └─ build.yml      # GitHub Actions workflow
├─ scripts/
│  ├─ configure.sh     # конфигурация ядра
│  └─ build.sh         # сборка ядра
├─ arch/                # исходники ядра
├─ patches/             # пользовательские патчи
└─ README.md

Создание GitHub Actions workflow

Файл .github/workflows/build.yml описывает весь процесс от checkout до загрузки артефактов:

name: Build Custom Linux Kernel

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    container:
      image: termux/termux-docker:latest   # образ с Termux‑окружением
      options: --privileged
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Install dependencies in Termux
        run: |
          apt update && apt upgrade -y
          apt install -y git make clang bc flex bison libncurses-dev openssl-dev wget curl zip unzip

      - name: Apply custom patches
        run: |
          cd ${{ github.workspace }}/patches
          for p in .patch; do git apply "$p"; done

      - name: Configure kernel
        run: |
          chmod +x scripts/configure.sh
          ./scripts/configure.sh

      - name: Build kernel
        run: |
          chmod +x scripts/build.sh
          ./scripts/build.sh

      - name: Upload artifact
        uses: actions/upload-artifact@v3
        with:
          name: custom-kernel
          path: output/.img

Обратите внимание, что мы используем Docker‑образ termux/termux-docker, который предоставляет полное Termux‑окружение внутри GitHub Actions runner.

Скрипт конфигурации (scripts/configure.sh)

#!/usr/bin/env bash
set -e

KERNEL_DIR="$(pwd)/arch"
cd "$KERNEL_DIR"

# Пример: включаем поддержку определённого драйвера
make defconfig
scripts/config --enable DRIVER_EXAMPLE

# Сохраняем .config для последующей сборки
cp .config "$GITHUB_WORKSPACE/.config"

Скрипт сборки (scripts/build.sh)

#!/usr/bin/env bash
set -e

export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-android-

make -j$(nproc)

# Пакуем образ
mkdir -p output
cp arch/arm64/boot/Image.gz output/custom-kernel-$(date +%Y%m%d).img

Тестирование образа в Termux

После того как артефакт загружен в репозиторий (или в облачное хранилище), его можно скачать на Android‑устройство и проверить:

wget https://github.com/username/my-linux-kernel/releases/download/v1.0/custom-kernel-20240220.img -O ~/custom-kernel.img
# Если у вас установлен kexec-tools в Termux
pkg install kexec-tools -y
kexec -l ~/custom-kernel.img --initrd=initrd.img --command-line="root=/dev/mmcblk0p2"
kexec -e

Для более безопасного тестирования рекомендуется использовать эмулятор QEMU внутри Termux:

pkg install qemu-system-arm -y
qemu-system-aarch64 -machine virt -cpu cortex-a53 -nographic \
  -kernel ~/custom-kernel.img -append "console=ttyAMA0 root=/dev/vda"

Лучшие практики CI/CD для кастомных ядер

  • Версионирование конфигураций: храните .config в репозитории, отмечайте изменения в commit‑ах.
  • Кеширование: используйте action actions/cache для кэша компилятора и заголовков, чтобы ускорить сборку.
  • Тестовые наборы: добавьте unit‑тесты для модулей ядра (KUnit) в workflow.
  • Безопасность: ограничьте доступ к секретам (например, токены доступа к хранилищу) только в нужных шагах.

Отладка и решение типичных проблем

Если сборка падает на этапе make, проверьте версии компилятора. Для Android‑устройств рекомендуется clang из NDK, а не системный gcc. Ошибки «undefined reference» часто указывают на несовместимость заголовков; убедитесь, что ANDROID_NDK_ROOT правильно установлен.

Заключение

Автоматизированное развертывание кастомных ядер Linux в Termux с помощью GitHub Actions и CI/CD позволяет сократить время разработки, повысить надёжность и обеспечить воспроизводимость сборок. Выстроив процесс по описанным шагам, вы получаете полностью автоматизированный pipeline, который собирает, тестирует и доставляет ядро прямо на Android‑устройство.

Команда RybinskLab предлагает профессиональные услуги по настройке CI/CD, разработке и оптимизации кастомных ядер, а также поддержку интеграции с Termux и облачными платформами. Обращайтесь к нам для ускорения вашего проекта и получения экспертных решений под ключ.

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

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

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

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

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