#!/bin/bash # dev-vm.sh — Launch a QEMU VM for development and testing # Usage: ./hack/dev-vm.sh [path-to-iso-or-img] [--shell] [--debug] set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" VERSION="$(cat "$PROJECT_ROOT/VERSION")" DEFAULT_ISO="$PROJECT_ROOT/output/kubesolo-os-${VERSION}.iso" DEFAULT_IMG="$PROJECT_ROOT/output/kubesolo-os-${VERSION}.img" IMAGE="${1:-}" EXTRA_APPEND="" SERIAL_OPTS="-serial stdio" # Parse flags shift || true for arg in "$@"; do case "$arg" in --shell) EXTRA_APPEND="$EXTRA_APPEND kubesolo.shell" ;; --debug) EXTRA_APPEND="$EXTRA_APPEND kubesolo.debug" ;; esac done # Auto-detect image if [ -z "$IMAGE" ]; then if [ -f "$DEFAULT_ISO" ]; then IMAGE="$DEFAULT_ISO" elif [ -f "$DEFAULT_IMG" ]; then IMAGE="$DEFAULT_IMG" else echo "ERROR: No image found. Run 'make iso' or 'make disk-image' first." echo " Or specify path: $0 " exit 1 fi fi echo "==> Launching QEMU with: $IMAGE" echo " Press Ctrl+A, X to exit" echo "" # Create a temporary data disk for persistence testing DATA_DISK=$(mktemp /tmp/kubesolo-data-XXXXXX.img) dd if=/dev/zero of="$DATA_DISK" bs=1M count=1024 2>/dev/null mkfs.ext4 -q -L KSOLODATA "$DATA_DISK" 2>/dev/null cleanup() { rm -f "$DATA_DISK"; } trap cleanup EXIT COMMON_OPTS=( -m 2048 -smp 2 -nographic -net nic,model=virtio -net user,hostfwd=tcp::6443-:6443,hostfwd=tcp::2222-:22 -drive "file=$DATA_DISK,format=raw,if=virtio" ) # Enable KVM if available if [ -w /dev/kvm ] 2>/dev/null; then COMMON_OPTS+=(-enable-kvm) echo " KVM acceleration: enabled" else echo " KVM acceleration: not available (using TCG)" fi case "$IMAGE" in *.iso) qemu-system-x86_64 \ "${COMMON_OPTS[@]}" \ -cdrom "$IMAGE" \ -boot d \ -append "console=ttyS0,115200n8 kubesolo.data=/dev/vda $EXTRA_APPEND" ;; *.img) qemu-system-x86_64 \ "${COMMON_OPTS[@]}" \ -drive "file=$IMAGE,format=raw,if=virtio" ;; *) echo "ERROR: Unrecognized image format: $IMAGE" exit 1 ;; esac