#!/bin/bash set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_ROOT="$SCRIPT_DIR/.." VM_DIR="$PROJECT_ROOT/.nogit/vm" ISO_PATH="$PROJECT_ROOT/.nogit/iso/ecoos.iso" DISK_PATH="$VM_DIR/test-disk.qcow2" MONITOR_SOCK="$VM_DIR/qemu-monitor.sock" SERIAL_SOCK="$VM_DIR/serial.sock" SERIAL_LOG="$VM_DIR/serial.log" PID_FILE="$VM_DIR/qemu.pid" # Create VM directory if not exists mkdir -p "$VM_DIR" # Check if ISO exists if [ ! -f "$ISO_PATH" ]; then echo "ERROR: ISO not found at $ISO_PATH" echo "Run 'pnpm run build' first to create the ISO" exit 1 fi # Create test disk if not exists if [ ! -f "$DISK_PATH" ]; then echo "Creating test disk (20GB)..." qemu-img create -f qcow2 "$DISK_PATH" 20G fi # Check if already running if [ -f "$PID_FILE" ]; then PID=$(cat "$PID_FILE") if kill -0 "$PID" 2>/dev/null; then echo "QEMU already running (PID: $PID)" echo "Run 'pnpm run test:stop' to stop it first" exit 1 fi fi echo "Starting QEMU with EcoOS ISO..." # Check if KVM is available KVM_OPTS="" if [ -e /dev/kvm ] && [ -r /dev/kvm ] && [ -w /dev/kvm ]; then KVM_OPTS="-enable-kvm -cpu host" echo "Using KVM acceleration" else echo "KVM not available, using software emulation (slower)" fi # Start QEMU headless with VNC and serial console > "$SERIAL_LOG" # Clear old log qemu-system-x86_64 \ $KVM_OPTS \ -m 4G \ -smp 2 \ -bios /usr/share/qemu/OVMF.fd \ -drive file="$ISO_PATH",media=cdrom \ -drive file="$DISK_PATH",format=qcow2,if=virtio \ -vga qxl \ -display none \ -vnc :0 \ -serial unix:"$SERIAL_SOCK",server,nowait \ -monitor unix:"$MONITOR_SOCK",server,nowait \ -nic user,model=virtio-net-pci,hostfwd=tcp::3006-:3006,hostfwd=tcp::2222-:22 \ -daemonize \ -pidfile "$PID_FILE" echo "" echo "=== EcoOS Test VM Started ===" echo "PID: $(cat $PID_FILE)" echo "VNC: localhost:5900" echo "Serial Log: $SERIAL_LOG" echo "Management UI: http://localhost:3006" echo "" echo "Commands:" echo " pnpm run test:screenshot - Take screenshot" echo " pnpm run test:stop - Stop VM" echo " tail -f $SERIAL_LOG - Watch serial console" echo " socat - UNIX-CONNECT:$SERIAL_SOCK - Interactive serial"