#!/bin/bash # Create base VM for archsetup testing - Manual Installation # Author: Craig Jennings # License: GNU GPLv3 # # This script creates a VM booted from Arch ISO, then waits for you to # manually install Arch using archinstall. set -e # Get script directory SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" # Source utilities source "$SCRIPT_DIR/lib/logging.sh" source "$SCRIPT_DIR/lib/vm-utils.sh" # Configuration VM_NAME="archsetup-base" VM_CPUS="${VM_CPUS:-4}" VM_RAM="${VM_RAM:-8192}" # MB VM_DISK="${VM_DISK:-50}" # GB VM_IMAGES_DIR="$PROJECT_ROOT/vm-images" ISO_URL="https://mirrors.kernel.org/archlinux/iso/latest/archlinux-x86_64.iso" ISO_PATH="$VM_IMAGES_DIR/arch-latest.iso" DISK_PATH="$VM_IMAGES_DIR/archsetup-base.qcow2" # Initialize logging LOGFILE="$PROJECT_ROOT/test-results/create-base-vm-$(date +'%Y%m%d-%H%M%S').log" init_logging "$LOGFILE" section "Creating Base VM for ArchSetup Testing" # Verify prerequisites step "Checking prerequisites" check_libvirt || fatal "libvirt not running" check_libvirt_group || fatal "User not in libvirt group" check_kvm || fatal "KVM not available" success "Prerequisites satisfied" # Create vm-images directory mkdir -p "$VM_IMAGES_DIR" # Download Arch ISO if needed section "Preparing Arch Linux ISO" if [ -f "$ISO_PATH" ]; then info "Arch ISO exists: $ISO_PATH" # Check if ISO is older than 30 days if [ $(find "$ISO_PATH" -mtime +30 | wc -l) -gt 0 ]; then warn "ISO is older than 30 days" info "Downloading latest version..." rm -f "$ISO_PATH" else success "Using existing ISO" fi fi if [ ! -f "$ISO_PATH" ]; then step "Downloading latest Arch ISO" info "URL: $ISO_URL" info "This may take several minutes..." if wget --progress=dot:giga -O "$ISO_PATH" "$ISO_URL" 2>&1 | tee -a "$LOGFILE"; then success "ISO downloaded" else fatal "ISO download failed" fi fi # Remove existing VM and disk if vm_exists "$VM_NAME"; then warn "VM $VM_NAME already exists - destroying it" if vm_is_running "$VM_NAME"; then virsh destroy "$VM_NAME" >> "$LOGFILE" 2>&1 fi virsh undefine "$VM_NAME" --nvram >> "$LOGFILE" 2>&1 || true fi [ -f "$DISK_PATH" ] && rm -f "$DISK_PATH" # Create and start VM section "Creating and Starting VM" info "Creating VM: $VM_NAME" info " CPUs: $VM_CPUS | RAM: ${VM_RAM}MB | Disk: ${VM_DISK}GB" virt-install \ --connect qemu:///system \ --name "$VM_NAME" \ --memory "$VM_RAM" \ --vcpus "$VM_CPUS" \ --disk path="$DISK_PATH",size="$VM_DISK",format=qcow2,bus=virtio \ --cdrom "$ISO_PATH" \ --os-variant archlinux \ --network network=default,model=virtio \ --graphics vnc,listen=127.0.0.1 \ --console pty,target.type=serial \ --boot uefi \ --noreboot \ --check path_in_use=off \ --filesystem type=mount,mode=mapped,source="$PROJECT_ROOT/scripts",target=host-scripts \ >> "$LOGFILE" 2>&1 & VIRT_INSTALL_PID=$! progress "Waiting for VM to boot from ISO" sleep 30 # Check if VM started if ! vm_is_running "$VM_NAME"; then wait $VIRT_INSTALL_PID EXIT_CODE=$? fatal "VM failed to start (exit code: $EXIT_CODE)" fi success "VM started successfully" # Display manual installation instructions section "Manual Installation Required" cat << 'EOF' [i] [i] Base VM is running from Arch ISO [i] [i] NEXT STEPS - Complete installation manually: [i] [i] 1. Open virt-viewer (should already be open): [i] virt-viewer --connect qemu:///system archsetup-base [i] [i] 2. Login as 'root' (no password) [i] [i] 3. Run: archinstall [i] [i] 4. Configure with these settings: [i] - Hostname: archsetup-test [i] - Root password: archsetup [i] - Profile: minimal [i] - Network: dhcpcd (or NetworkManager) [i] - Additional packages: openssh git vim sudo iperf3 mtr traceroute bind net-tools sshfs [i] - Enable: sshd, dhcpcd (or NetworkManager) [i] [i] 5. After archinstall completes: [i] - Chroot into /mnt: arch-chroot /mnt [i] - Edit /etc/ssh/sshd_config: [i] sed -i 's/#PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config [i] sed -i 's/#PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config [i] - Set up shared folder mount (9p filesystem): [i] mkdir -p /mnt/host-scripts [i] echo 'host-scripts /mnt/host-scripts 9p trans=virtio,version=9p2000.L,rw 0 0' >> /etc/fstab [i] - Exit chroot: exit [i] - Poweroff: poweroff [i] [i] 6. After VM powers off, run: [i] ./scripts/testing/finalize-base-vm.sh [i] [i] Log file: $LOGFILE [i] EOF info "Waiting for VM to power off..." info "(This script will exit when you manually power off the VM)" # Wait for virt-install to finish (VM powers off) wait $VIRT_INSTALL_PID || true success "VM has powered off" info "" info "Next step: Run ./scripts/testing/finalize-base-vm.sh"