cat > "$HOME/run-debian13-virgl.sh" <<'SCRIPT'
#!/data/data/com.termux/files/usr/bin/bash
set -euo pipefail
VM="/sdcard/QEMU/lvm"
BASE_DISK="$VM/debian13.qcow2"
TEST_DISK="$VM/debian13-virgl-test.qcow2"
BASE_VARS="$VM/edk2-vars-debian13.fd"
TEST_VARS="$VM/edk2-vars-debian13-virgl.fd"
UEFI="$VM/edk2-aarch64-code.fd"
PROBE_LOG="$HOME/x620-virgl-probe.log"
die() {
echo
echo "ОШИБКА: $*" >&2
exit 1
}
echo "=================================="
echo " Samsung SM-X620 / Debian 13"
echo " KVM + VirGL experimental launcher"
echo "=================================="
# Проверка программ
for cmd in qemu-system-aarch64 qemu-img; do
command -v "$cmd" >/dev/null 2>&1 ||
die "Не найдена команда: $cmd"
done
# Проверка файлов
for file in "$BASE_DISK" "$BASE_VARS" "$UEFI"; do
[ -s "$file" ] ||
die "Файл отсутствует или пуст: $file"
done
# Не запускать вторую VM поверх работающей
if pgrep -f '[q]emu-system-aarch64' >/dev/null 2>&1; then
die "QEMU уже запущен. Сначала выключи текущую VM."
fi
# Проверка поддержки VirGL
qemu-system-aarch64 -device help 2>&1 |
grep -q 'virtio-gpu-gl-pci' ||
die "QEMU не поддерживает virtio-gpu-gl-pci"
qemu-system-aarch64 -display help 2>&1 |
grep -q 'egl-headless' ||
die "QEMU не поддерживает egl-headless"
echo
echo "[1/4] Поиск графического устройства Samsung"
GPU_NODE=""
for sysnode in /sys/class/drm/renderD*; do
[ -e "$sysnode" ] || continue
node="/dev/dri/${sysnode##*/}"
driver="$(readlink -f "$sysnode/device/driver" 2>/dev/null || true)"
if [[ "$driver" == */sgpu ]]; then
if [ -r "$node" ] && [ -w "$node" ]; then
GPU_NODE="$node"
break
fi
fi
done
if [ -n "$GPU_NODE" ]; then
echo "Найден SGPU: $GPU_NODE"
DISPLAY_OPT="egl-headless,rendernode=$GPU_NODE"
else
echo "SGPU render node не определён."
echo "Пробуем автоматический выбор QEMU."
DISPLAY_OPT="egl-headless"
fi
echo
echo "[2/4] Проверка EGL без запуска Debian"
# Пробная VM не использует диск или UEFI.
# -S: процессор остановлен, гостевая ОС не запускается.
qemu-system-aarch64 \
-machine virt,accel=kvm,gic-version=3 \
-cpu host \
-smp 1 \
-m 512 \
-nodefaults \
-device virtio-gpu-gl-pci \
-display "$DISPLAY_OPT" \
-vnc 127.0.0.1:99 \
-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 "Предварительная проверка EGL пройдена."
else
wait "$PROBE_PID" 2>/dev/null || true
echo
echo "EGL/VirGL не удалось инициализировать."
echo "Лог:"
cat "$PROBE_LOG"
echo
echo "Основная VM не запускалась."
echo "Исходный диск не изменён."
exit 1
fi
echo
echo "[3/4] Подготовка экспериментальных файлов"
# Отдельный QCOW2-слой.
# Исходный диск используется только как backing file.
if [ ! -e "$TEST_DISK" ]; then
qemu-img create \
-f qcow2 \
-F qcow2 \
-b "$BASE_DISK" \
"$TEST_DISK"
else
echo "Экспериментальный диск уже существует."
qemu-img info "$TEST_DISK" |
grep -Fq "backing file: $BASE_DISK" ||
die "Существующий экспериментальный диск имеет другой backing file"
fi
# Отдельная копия переменных UEFI
if [ ! -e "$TEST_VARS" ]; then
cp "$BASE_VARS" "$TEST_VARS"
fi
[ -s "$TEST_VARS" ] ||
die "Экспериментальные UEFI-переменные повреждены"
echo
echo "[4/4] Запуск Debian 13"
echo
echo "CPU: KVM, 4 vCPU"
echo "RAM: 4096 MiB"
echo "GPU: virtio-gpu-gl-pci"
echo "Display: $DISPLAY_OPT"
echo "VNC: 127.0.0.1:5901"
echo "SSH: 127.0.0.1:2223"
echo "Monitor: 127.0.0.1:4446"
echo "QMP: 127.0.0.1:4447"
echo
exec qemu-system-aarch64 \
-machine virt,accel=kvm,gic-version=3 \
-cpu host \
-smp 4 \
-m 4096 \
-device virtio-gpu-gl-pci \
-display "$DISPLAY_OPT" \
-vnc 127.0.0.1:1 \
-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-virgl.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
SCRIPT
chmod +x "$HOME/run-debian13-virgl.sh"
bash "$HOME/run-debian13-virgl.sh"