diff --git a/.gitignore b/.gitignore index 38ad5e29..92c2694a 100644 --- a/.gitignore +++ b/.gitignore @@ -40,8 +40,6 @@ requirements.txt /.gitconfig /actions-runner /cmd_output.txt -/.dev-iso/ -/.dev-configs/ -/.dev-logs/ +/.dev/ node_modules/ uv.lock diff --git a/scripts/dev_vm.sh b/scripts/dev_vm.sh index 6347e110..0d1cad06 100755 --- a/scripts/dev_vm.sh +++ b/scripts/dev_vm.sh @@ -4,17 +4,17 @@ # auto-mounted, `archinstall` wrapped to clear logs and run `python -m archinstall`), # then launches QEMU. Source lives on the host, guest mounts it read-only - no rebuild loop. # -# Host artifacts (created in repo root, all git-ignored): -# .dev-iso/ generated dev ISO (mkarchiso output) -# .dev-disk.qcow2 VM disk image (qemu-img) -# .dev-ovmf-vars.fd persistent UEFI NVRAM (copied from OVMF_VARS) -# .dev-configs/ optional, user-created - shared rw to guest as /root/cfg -# .dev-logs/ auto-created - shared rw to guest as /var/log/archinstall +# Host artifacts (all under .dev/ in repo root, git-ignored): +# .dev/iso/ generated dev ISO (mkarchiso output) +# .dev/disk.qcow2 VM disk image (qemu-img) +# .dev/ovmf-vars.fd persistent UEFI NVRAM (copied from OVMF_VARS) +# .dev/configs/ optional, user-created - shared rw to guest as /root/cfg +# .dev/logs/ auto-created - shared rw to guest as /var/log/archinstall # # Inside the guest after boot: # /root/archinstall-dev project source (9p ro, host edits appear live) -# /root/cfg .dev-configs share (9p rw, mounted only if folder exists) -# /var/log/archinstall .dev-logs share (9p rw, host can tail install.log live) +# /root/cfg .dev/configs share (9p rw, mounted only if folder exists) +# /var/log/archinstall .dev/logs share (9p rw, host can tail install.log live) # archinstall wrapper around `python -m archinstall`; clears the # log directory on every invocation # @@ -29,6 +29,12 @@ # ./scripts/dev_vm.sh clean | c - remove disk, NVRAM, ISO, logs # ./scripts/dev_vm.sh -h - show this help # +# Firmware mode (default is UEFI 64-bit): +# --bios - legacy BIOS boot (SeaBIOS, no OVMF) +# +# Flag can be combined with a command: +# ./scripts/dev_vm.sh --bios rebuild +# # Env overrides: # SCREEN_W, SCREEN_H - virtio-vga resolution (default 1280x720) # @@ -39,43 +45,52 @@ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" -CONFIGS_DIR="$PROJECT_DIR/.dev-configs" -LOGS_DIR="$PROJECT_DIR/.dev-logs" -ISO_DIR="$PROJECT_DIR/.dev-iso" -DISK="$PROJECT_DIR/.dev-disk.qcow2" -OVMF_VARS="$PROJECT_DIR/.dev-ovmf-vars.fd" +DEV_DIR="$PROJECT_DIR/.dev" +CONFIGS_DIR="$DEV_DIR/configs" +LOGS_DIR="$DEV_DIR/logs" +ISO_DIR="$DEV_DIR/iso" +DISK="$DEV_DIR/disk.qcow2" +OVMF_VARS="$DEV_DIR/ovmf-vars.fd" DISK_SIZE="30G" RAM="4G" CPUS="4" SCREEN_W="${SCREEN_W:-1280}" SCREEN_H="${SCREEN_H:-720}" -ARG="${1:-default}" + +err() { echo "ERROR: $*" >&2; exit 1; } + +# Parse flags and command from arguments +FW_MODE="uefi64" +ARG="default" +for arg in "$@"; do + case "$arg" in + --bios) + FW_MODE="bios" + ;; + *) + ARG="$arg" + ;; + esac +done # OVMF firmware - probed at runtime across common distro paths OVMF_CODE="" OVMF_VARS_ORIG="" -err() { echo "ERROR: $*" >&2; exit 1; } - probe_ovmf() { - local pairs=( - "/usr/share/edk2/x64/OVMF_CODE.4m.fd:/usr/share/edk2/x64/OVMF_VARS.4m.fd" - "/usr/share/edk2-ovmf/x64/OVMF_CODE.fd:/usr/share/edk2-ovmf/x64/OVMF_VARS.fd" - "/usr/share/edk2/ovmf/OVMF_CODE.fd:/usr/share/edk2/ovmf/OVMF_VARS.fd" - "/usr/share/OVMF/OVMF_CODE_4M.fd:/usr/share/OVMF/OVMF_VARS_4M.fd" - "/usr/share/OVMF/OVMF_CODE.fd:/usr/share/OVMF/OVMF_VARS.fd" - ) - local pair code vars - for pair in "${pairs[@]}"; do - code="${pair%%:*}" - vars="${pair##*:}" - if [ -f "$code" ] && [ -f "$vars" ]; then - OVMF_CODE="$code" - OVMF_VARS_ORIG="$vars" - return 0 - fi - done - err "OVMF firmware not found. Install 'edk2-ovmf' (Arch), 'ovmf' (Debian/Ubuntu), or 'edk2-ovmf' (Fedora)." + if [ -f /usr/share/edk2/x64/OVMF_CODE.4m.fd ] && [ -f /usr/share/edk2/x64/OVMF_VARS.4m.fd ]; then + OVMF_CODE="/usr/share/edk2/x64/OVMF_CODE.4m.fd" + OVMF_VARS_ORIG="/usr/share/edk2/x64/OVMF_VARS.4m.fd" + return 0 + fi + echo ">>> OVMF firmware not found. Installing edk2-ovmf (sudo needed for UEFI support)..." + sudo pacman --noconfirm -S edk2-ovmf + if [ -f /usr/share/edk2/x64/OVMF_CODE.4m.fd ] && [ -f /usr/share/edk2/x64/OVMF_VARS.4m.fd ]; then + OVMF_CODE="/usr/share/edk2/x64/OVMF_CODE.4m.fd" + OVMF_VARS_ORIG="/usr/share/edk2/x64/OVMF_VARS.4m.fd" + return 0 + fi + err "x64 OVMF not found at /usr/share/edk2/x64/ even after installing edk2-ovmf." } check_host_deps() { @@ -182,8 +197,8 @@ cat <