cat > "$HOME/run-debian13-x11.sh" <<'SCRIPT'
#!/data/data/com.termux/files/usr/bin/bash
set -euo pipefail
VM="/sdcard/QEMU/lvm"
DISK="$VM/debian13.qcow2"
TEST_DISK="$VM/debian13-virgl-x11.qcow2"
VARS="$VM/edk2-vars-debian13.fd"
TEST_VARS="$VM/edk2-vars-debian13-x11.fd"
UEFI="$VM/edk2-aarch64-code.fd"
XDISPLAY=":1"
XLOG="$HOME/termux-x11-qemu.log"
PROBE_LOG="$HOME/qemu-x11-probe.log"
QEMU_LOG="$HOME/qemu-debian13-x11.log"
MODE="${1:-3d}"
die() {
echo "ОШИБКА: $*" >&2
exit 1
}
echo "================================="
echo " Debian 13 / KVM / Termux:X11"
echo " Режим: $MODE"
echo "================================="
# Проверка режима запуска
case "$MODE" in
3d)
GPU_ARGS=(
-device virtio-gpu-gl-pci
-display sdl,gl=es
)
;;
2d)
GPU_ARGS=(
-device virtio-gpu-pci
-display sdl,gl=off
)
;;
*)
die "Используй: 3d или 2d"
;;
esac
# Проверка программ
for cmd in qemu-system-aarch64 qemu-img; do
command -v "$cmd" >/dev/null 2>&1 ||
die "Не найдена команда $cmd"
done
# Termux:X11 требует Android-приложение
# и отдельный пакет внутри Termux.
if ! command -v termux-x11 >/dev/null 2>&1; then
echo "Устанавливаем пакет Termux:X11..."
pkg install -y x11-repo termux-x11-nightly
fi
# Проверка исходных файлов
for file in "$DISK" "$VARS" "$UEFI"; do
[ -s "$file" ] ||
die "Файл отсутствует: $file"
done
# Не запускать второй QEMU одновременно
if pgrep -f '[q]emu-system-aarch64' >/dev/null 2>&1; then
die "QEMU уже работает. Выключи предыдущую VM."
fi
# Проверка графических возможностей
if [ "$MODE" = "3d" ]; then
qemu-system-aarch64 -device help 2>&1 |
grep -q 'virtio-gpu-gl-pci' ||
die "Отсутствует virtio-gpu-gl-pci"
fi
qemu-system-aarch64 -display help 2>&1 |
grep -q 'sdl' ||
die "QEMU собран без SDL"
echo
echo "[1/4] Запуск Termux:X11"
export DISPLAY="$XDISPLAY"
export SDL_VIDEODRIVER=x11
export SDL_VIDEO_FORCE_EGL=1
export EGL_PLATFORM=x11
unset WAYLAND_DISPLAY
# Используем существующий сервер, если он
# уже запущен на дисплее :1.
if [ ! -S "$TMPDIR/.X11-unix/X1" ]; then
nohup termux-x11 :1 > "$XLOG" 2>&1 &
echo "Запущен X11-сервер :1"
else
echo "X11-сервер :1 уже работает"
fi
# Открыть Android-приложение Termux:X11
am start --user 0 \
-n com.termux.x11/com.termux.x11.MainActivity \
>/dev/null 2>&1 || {
echo "Открой приложение Termux:X11 вручную."
}
# Ожидание X11
for i in $(seq 1 40); do
[ -S "$TMPDIR/.X11-unix/X1" ] && break
sleep 0.25
done
[ -S "$TMPDIR/.X11-unix/X1" ] ||
die "X11-сервер не создал сокет. Лог: $XLOG"
echo
echo "[2/4] Проверка графического бэкенда"
# Проверяем создание SDL/EGL-контекста
# без подключения диска Debian.
qemu-system-aarch64 \
-machine virt,accel=kvm,gic-version=3 \
-cpu host \
-smp 1 \
-m 512 \
-nodefaults \
"${GPU_ARGS[@]}" \
-monitor none \
-serial none \
-S \
> "$PROBE_LOG" 2>&1 &
PROBE_PID=$!
sleep 4
if kill -0 "$PROBE_PID" 2>/dev/null; then
kill "$PROBE_PID" 2>/dev/null || true
wait "$PROBE_PID" 2>/dev/null || true
echo "Предварительная проверка пройдена."
else
wait "$PROBE_PID" 2>/dev/null || true
echo "Графический бэкенд завершился с ошибкой."
cat "$PROBE_LOG"
die "Debian не запускался."
fi
echo
echo "[3/4] Подготовка экспериментального диска"
# Создаём отдельный QCOW2-слой.
# Оригинальный Debian остаётся неизменным.
if [ ! -e "$TEST_DISK" ]; then
qemu-img create \
-f qcow2 \
-F qcow2 \
-b "$DISK" \
"$TEST_DISK"
else
qemu-img info "$TEST_DISK" |
grep -Fq "$DISK" ||
die "Экспериментальный диск имеет другой backing file"
fi
# Отдельная копия переменных UEFI
if [ ! -e "$TEST_VARS" ]; then
cp "$VARS" "$TEST_VARS"
fi
[ -s "$TEST_VARS" ] ||
die "Файл UEFI-переменных отсутствует"
echo
echo "[4/4] Запуск Debian 13"
echo
echo "KVM: включён"
echo "CPU: 4 vCPU"
echo "RAM: 4096 MiB"
echo "Графика: $MODE"
echo "Экран: Termux:X11 :1"
echo "SSH: 127.0.0.1:2223"
echo "Лог: $QEMU_LOG"
echo
set +e
qemu-system-aarch64 \
-machine virt,accel=kvm,gic-version=3 \
-cpu host \
-smp 4 \
-m 4096 \
"${GPU_ARGS[@]}" \
-device qemu-xhci \
-device usb-tablet \
-device usb-kbd \
-drive if=pflash,format=raw,readonly=on,file="$UEFI" \
-drive if=pflash,format=raw,file="$TEST_VARS" \
-drive if=none,format=qcow2,id=os,file="$TEST_DISK" \
-device virtio-blk-pci,drive=os,bootindex=1 \
-netdev user,id=net0,hostfwd=tcp:127.0.0.1:2223-:22 \
-device virtio-net-pci,netdev=net0 \
-serial stdio \
-D "$VM/qemu-debug-debian13-x11.log" \
-d guest_errors,unimp,cpu_reset \
-monitor tcp:127.0.0.1:4446,server,nowait \
-qmp tcp:127.0.0.1:4447,server=on,wait=off \
-no-reboot \
2>&1 | tee "$QEMU_LOG"
RC=${PIPESTATUS[0]}
echo
echo "QEMU завершился с кодом: $RC"
echo "Лог: $QEMU_LOG"
exit "$RC"
SCRIPT
chmod +x "$HOME/run-debian13-x11.sh"
bash "$HOME/run-debian13-x11.sh"