Termux — мощная среда для работы с Linux-приложениями на Android. Однако многие задачи (учебные курсы по ОС, тестирование ПО, воспроизведение окружений, сборка софта под «настоящую» Linux-систему) требуют запуска именно целой виртуальной машины с полноценной ОС. Один из самых практичных путей — эмуляция Linux с помощью QEMU внутри Termux.
В этой статье покажем, как подготовить Termux, собрать и настроить QEMU, создать загрузочные диски для ARM и x86 и организовать обмен файлами с файловой системой Android. Материал ориентирован на технически грамотных пользователей и системных инженеров.
Важные оговорки
1) Техническая реализуемость зависит от архитектуры вашего устройства (arm64/armeabi-v7a) и ресурсов (RAM/CPU).
2) Эмуляция x86 на ARM обычно работает существенно медленнее, чем нативные сценарии; для учебных/тестовых задач этого часто достаточно.
3) Запуск образов зависит от выбранного ядра/загрузчика и выбранного пути (UEFI/BIOS). В примерах ниже мы используем подход, который чаще всего применим на практике в среде без полноценной графической подсистемы.
4) Все команды выполняйте на свой риск. Не забывайте регулярно делать резервные копии образов дисков.
Что понадобится
Минимальный набор:
- Android-устройство с Termux
- Пакеты build/runtime для QEMU
- Root не требуется для большинства сценариев, но некоторые функции могут работать ограниченно
- Linux-образ (rootfs) и/или kernel, initrd (по выбранной модели запуска)
С точки зрения совместимости чаще всего применяются rootfs образа (ext4) и подход с ядром+rootfs. Для x86/ARM можно использовать совместимые ядра из образов Debian/Ubuntu/Arch либо собственные.
Подготовка Termux: репозитории и базовые пакеты
Начните с обновления окружения и установки необходимых пакетов. В Termux обычно удобно использовать proot/CLI-инструменты, но в нашей задаче важны инструменты сборки и эмуляции.
pkg update && pkg upgrade -y
pkg install -y git wget curl tar xz-utils bzip2 unzip
pkg install -y qemu-utils clang cmake ninja make pkg-config
pkg install -y qemu-system-x86_64 qemu-system-aarch64Примечание: состав пакетов в Termux может отличаться по версии репозиториев. Если какой-либо пакет отсутствует, используйте ближайшие аналоги из доступных пакетов Termux.
Организация рабочей директории
Разнесите файлы по логичным папкам: ядро/образ, диски, конфиги. Пример:
mkdir -p ~/vm/qemu/{images,rootfs,kernel,configs,logs}Далее мы будем складывать туда нужные артефакты.
Интеграция с файловой системой Android
Termux работает в песочнице приложения, но у него есть доступ к внутреннему хранилищу через смонтированные точки, обычно это /sdcard и/или внутренние директории приложения в /data/data/com.termux/files. Для виртуальных машин важно иметь способ обмена файлами.
Рекомендуемые способы:
- Симлинки/копирование: простой и предсказуемый вариант для статичных файлов.
- Передача файлов через shared folder: в QEMU можно организовать передачу через виртуальные устройства/сеть (например, scp по SSH внутри гостя).
- Сеть гостя: обычно самый удобный путь — поднимаем SSH в гостевой ОС и копируем через сеть.
В этой статье акцент сделаем на сетевой обмен, потому что он меньше зависит от формата образов и позволяет работать с изменяющимися данными.
Сценарий 1: ARM VM (aarch64) — быстрый путь к загрузке
Ниже — практичный шаблон, который можно адаптировать под выбранный Linux-дистрибутив. Общая логика:
- Подготовить ext4-диск (или qcow2)
- Смонтировать диск и распаковать rootfs
- Запустить QEMU с нужным машинным типом и параметрами ядра
- Настроить сеть и вход в систему
Шаг 1. Создание диска под гостевую ОС
Создадим виртуальный диск формата raw (обычно удобен для простых сценариев):
qemu-img create -f raw ~/vm/qemu/images/arm-rootfs.img 8GТеперь нужно отформатировать его в ext4 и заселить rootfs. Форматирование:
mkfs.ext4 -F ~/vm/qemu/images/arm-rootfs.imgСоздайте временную точку монтирования и распакуйте rootfs.
mkdir -p ~/vm/qemu/rootfs/arm-mnt
mount -o loop ~/vm/qemu/images/arm-rootfs.img ~/vm/qemu/rootfs/arm-mnt
# Пример: распаковка заранее скачанного rootfs TAR
# tar -xpf /path/to/arm-rootfs.tar -C ~/vm/qemu/rootfs/arm-mnt
umount ~/vm/qemu/rootfs/arm-mntКак получить rootfs: берите готовые rootfs из официальных проектов (Debian/Ubuntu/Arch), совместимые с aarch64. Главное — чтобы в rootfs были /sbin, /bin, /lib*, /etc, и имелся init (например systemd или sysvinit) в зависимости от дистрибутива.
Шаг 2. Подготовка ядра и параметров загрузки
В QEMU ядро обычно указывается как файл Image или vmlinuz. Скопируйте совместимое ядро для aarch64 в папку:
ls -la ~/vm/qemu/kernelДопустим, ядро лежит как:
~/vm/qemu/kernel/ImageПараметры ядра для минимальной загрузки обычно включают:
- root=device (устройство блочного диска)
- rootfstype=ext4
- rw
- console=ttyAMA0 (или аналог под конкретную архитектуру)
Пример запуска будет зависеть от модели QEMU, но для UART-консоли часто используют console=ttyAMA0 для ARM.
Шаг 3. Запуск QEMU для ARM (aarch64)
Команда может отличаться в зависимости от доступных binutils и установленной сборки QEMU. Ниже — типовой шаблон:
qemu-system-aarch64
-M virt
-cpu cortex-a57
-m 2048
-smp 2
-nographic
-kernel ~/vm/qemu/kernel/Image
-append "root=/dev/vda rw rootfstype=ext4 console=ttyAMA0 loglevel=3"
-drive file=~/vm/qemu/images/arm-rootfs.img,format=raw,if=virtio
-netdev user,id=net0,hostfwd=tcp::2222-:22
-device virtio-net-device,netdev=net0Что означает:
-nographic— консоль в Termux (удобно для сервера без GUI)-netdev user+hostfwd— проброс порта: ваш хост (Termux) сможет обращаться к SSH гостя черезlocalhost:2222virtio-net-deviceиif=virtio— ускоряют работу по сравнению с e1000
После запуска вы увидите загрузочные сообщения. Если загрузка доходит до login, проверьте, что SSH установлен и запущен.
Шаг 4. Доступ к гостю и копирование файлов
Если внутри гостя поднят SSH (например, sshd), вы сможете подключиться с Termux:
ssh -p 2222 username@127.0.0.1Для копирования:
scp -P 2222 ./file.txt username@127.0.0.1:/home/username/Это и есть базовая интеграция: файлы живут в Android (в ваших директориях Termux), а QEMU-гость получает доступ через сеть.
Сценарий 2: x86 VM (x86_64) — эмуляция для тестов
Запуск x86 в QEMU на ARM возможен, но ресурсоёмок. Для него также понадобится kernel и rootfs, совместимые с x86_64.
Шаг 1. Диск для x86_64
qemu-img create -f raw ~/vm/qemu/images/x86-rootfs.img 8G
mkfs.ext4 -F ~/vm/qemu/images/x86-rootfs.img
mkdir -p ~/vm/qemu/rootfs/x86-mnt
mount -o loop ~/vm/qemu/images/x86-rootfs.img ~/vm/qemu/rootfs/x86-mnt
# tar -xpf /path/to/x86_64-rootfs.tar -C ~/vm/qemu/rootfs/x86-mnt
umount ~/vm/qemu/rootfs/x86-mntШаг 2. Ядро и параметры
Для x86 обычно указывается параметр консоли на последовательный порт. В зависимости от QEMU/ядра может быть вариант:
console=ttyS0root=/dev/sdaили/dev/vdaв зависимости от того, чем вы монтируете диск (ahci/virtio)
Если используется virtio-диск, в госте часто будет /dev/vda.
Шаг 3. Запуск x86_64 в QEMU
Пример с консолью в Termux, nographic и virtio-диском:
qemu-system-x86_64
-m 2048
-smp 2
-nographic
-kernel ~/vm/qemu/kernel/bzImage
-append "root=/dev/vda rw rootfstype=ext4 console=ttyS0 loglevel=3"
-drive file=~/vm/qemu/images/x86-rootfs.img,format=raw,if=virtio
-netdev user,id=net0,hostfwd=tcp::2223-:22
-device virtio-net-device,netdev=net0После загрузки доступ к SSH:
ssh -p 2223 username@127.0.0.1Если консоль не показывает загрузку, проверьте:
- правильность ядра (x86_64)
- параметры root device (
/dev/vdavs/dev/sda) - наличие драйверов virtio в initramfs (если оно требуется)
Частые проблемы и как их быстро диагностировать
1) Гость не грузится до конца
Смотрите консоль QEMU (если используется -nographic). Типовые причины:
- неверный путь к ядру
- несовпадение архитектуры ядра и rootfs
- неверные параметры
-append(root устройство, консоль) - нет нужных модулей (например, для virtio/nvme/net)
Решение: сначала добейтесь загрузки на “минимально рабочем” конфиге (например, virtio-диск и корректная консоль), затем усложняйте.
2) Виртуальная сеть не работает
Проверки:
- в госте установлен и запущен SSH
- в госте корректный IP (для user-mode сети часто DHCP выдаёт адрес)
- ваш порт проброшен правильно: для ARM —
2222, для x86 —2223
При необходимости добавьте в QEMU -device и параметры под вашу модель карты сети (например, virtio-net).
3) Низкая производительность
Особенно для x86 на ARM:
- уменьшайте
-mи-smp - используйте virtio устройства
- по возможности тестируйте нативные варианты (ARM guest на ARM host)
Улучшение сценария: “персистентность” и снимки
Если вам важно сохранять изменения между запусками, рассмотрите qcow2 и снимки. Для простого теста можно перейти с raw на qcow2:
qemu-img create -f qcow2 ~/vm/qemu/images/arm-rootfs.qcow2 8GДальше логика такая же: форматируете внутри гостя или монтируете образ (в зависимости от модели). Снимки удобны для “быстрых откатов” при экспериментах с конфигами.
Локальная сеть и обмен (без обхода блокировок)
Если требуется более гибкая сетевое взаимодействие между хостом Termux и гостем, обычно используют user-mode с пробросом портов, как в примерах. Если же вы хотите развернуть локальную сеть для нескольких сервисов, можно дополнить запуск дополнительными параметрами QEMU (netdev/tap) — однако это зависит от возможностей вашего Android-устройства и настроек сети. Для большинства случаев хватает hostfwd и SSH.
Безопасность: учетные записи и минимизация рисков
При работе с виртуальной машиной не используйте “root” без необходимости. Рекомендуется:
- создать отдельного пользователя
- включить ключи для SSH вместо пароля
- ограничить доступ к портам проброса (firewall на хосте Termux/Android обычно ограничен, поэтому полагайтесь в первую очередь на модель подключения)
Также регулярно обновляйте гостевую систему внутри VM.
Заключение
Эмуляция полной Linux‑системы с QEMU в Termux — реальный и практичный способ получить “настоящую” среду для разработки, обучения и тестирования. Для ARM‑гостей путь обычно проще и быстрее, а для x86‑гостей приходится учитывать нагрузку и внимательнее подбирать ядро и параметры загрузки. Интеграция с файловой системой Android в большинстве рабочих сценариев удобно решается через сетевой обмен (SSH/SCP) между Termux и гостевой ОС.
Хотите ускорить настройку под ваш конкретный телефон/планируемый дистрибутив или получить готовый рецепт (образы, конфиги, диагностика)? Обратитесь в РыбинскЛАБ — поможем с внедрением и сопровождением Termux/QEMU-окружений.