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

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

Эмуляция полной Linux‑системы с QEMU в Termux: настройка виртуальных машин ARM и x86, интеграция с файловой системой Android

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-дистрибутив. Общая логика:

  1. Подготовить ext4-диск (или qcow2)
  2. Смонтировать диск и распаковать rootfs
  3. Запустить QEMU с нужным машинным типом и параметрами ядра
  4. Настроить сеть и вход в систему

Шаг 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:2222
  • virtio-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=ttyS0
  • root=/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/vda vs /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-окружений.

* Текст статьи подготовлен и структурирован с использованием технологий искусственного интеллекта. Проверен и доработан перед публикацией.

Нужна помощь с настройкой Termux, Linux и серверов?

Я оказываю ИТ-услуги: настройка серверов, автоматизация, безопасность, помощь с Linux и инфраструктурой. Материалы сайта — только в ознакомительных и образовательных целях.

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