diff --git a/run.sh b/run.sh index 32c57e0..5f4fa6f 100755 --- a/run.sh +++ b/run.sh @@ -19,8 +19,11 @@ readonly ISO_PATH="${SCRIPT_DIR}/output/knel-football-secure.iso" readonly VM_NAME="knel-football-test" readonly VM_RAM="2048" readonly VM_CPUS="2" -readonly VM_DISK_SIZE="10G" -readonly VM_DISK_PATH="/tmp/${VM_NAME}.qcow2" +readonly VM_DISK_SIZE="10" +readonly LIBVIRT_URI="qemu:///system" +readonly VM_DISK_PATH="/var/lib/libvirt/images/${VM_NAME}.qcow2" +VM_ISO_PATH="/var/lib/libvirt/images/$(basename "$ISO_PATH")" +readonly VM_ISO_PATH # Colors for output readonly RED='\033[0;31m' @@ -51,15 +54,15 @@ vm_check_prerequisites() { return 1 fi - # Check actual libvirt access (not just group membership) - if ! virsh list &> /dev/null; then - log_error "Cannot connect to libvirt" + # Check system libvirt access (required for virt-manager visibility) + if ! virsh -c "$LIBVIRT_URI" list &> /dev/null; then + log_error "Cannot connect to system libvirt ($LIBVIRT_URI)" log_error "Ensure libvirtd is running and you have access" log_error "Try: sudo usermod -aG libvirt \$USER && logout/login" return 1 fi - # Check for qemu-img command + # Check for qemu-img command (required for disk creation) if ! command -v qemu-img &> /dev/null; then log_error "qemu-img command not found" log_error "Install qemu: sudo apt install qemu-utils" @@ -73,40 +76,41 @@ vm_check_prerequisites() { return 1 fi + # Check if libvirt images directory exists + if [[ ! -d "/var/lib/libvirt/images" ]]; then + log_error "Libvirt images directory not found" + log_error "Ensure libvirt is properly installed: sudo apt install libvirt-daemon-system" + return 1 + fi + log_info "All prerequisites satisfied" return 0 } -# Create VM disk image -vm_create_disk() { - log_info "Creating disk image: $VM_DISK_PATH" - rm -f "$VM_DISK_PATH" - qemu-img create -f qcow2 "$VM_DISK_PATH" "$VM_DISK_SIZE" -} - -# Create and start VM +# Create and start VM using virsh define (virt-install requires storage pools) vm_create() { - # Define libvirt session URI (use session for user-mode, avoids sudo) - local LIBVIRT_URI="qemu:///session" - log_info "Creating VM: $VM_NAME (libvirt: $LIBVIRT_URI)" - # Destroy existing VM if present (in session libvirt) + # Destroy existing VM if present virsh -c "$LIBVIRT_URI" destroy "$VM_NAME" 2>/dev/null || true virsh -c "$LIBVIRT_URI" undefine "$VM_NAME" --nvram 2>/dev/null || true - # Create disk - vm_create_disk + # Copy ISO to system storage (libvirt needs access) + log_info "Copying ISO to libvirt storage (may require sudo)..." + if ! sudo cp -f "$ISO_PATH" "$VM_ISO_PATH" 2>/dev/null; then + log_error "Failed to copy ISO. Run this command from terminal to enter sudo password." + return 1 + fi + sudo chown libvirt-qemu:libvirt-qemu "$VM_ISO_PATH" 2>/dev/null || true + sudo chmod 644 "$VM_ISO_PATH" 2>/dev/null || true - # Find UEFI firmware with Secure Boot support (REQUIRED) + # Find UEFI firmware with Secure Boot support local uefi_code="" local uefi_vars="" - - # Prefer Secure Boot enabled firmware for fw_dir in /usr/share/OVMF /usr/share/qemu; do if [[ -f "$fw_dir/OVMF_CODE_4M.secboot.fd" ]]; then uefi_code="$fw_dir/OVMF_CODE_4M.secboot.fd" - uefi_vars="$fw_dir/OVMF_VARS_4M.ms.fd" + uefi_vars="$fw_dir/OVMF_VARS_4M.fd" break elif [[ -f "$fw_dir/OVMF_CODE_4M.fd" ]]; then uefi_code="$fw_dir/OVMF_CODE_4M.fd" @@ -120,44 +124,40 @@ vm_create() { done if [[ -z "$uefi_code" || ! -f "$uefi_code" ]]; then - log_error "UEFI firmware with Secure Boot (OVMF) not found" + log_error "UEFI firmware (OVMF) not found" log_error "Install required: sudo apt install ovmf" - log_error "UEFI with Secure Boot is REQUIRED for KNEL-Football testing" return 1 fi - # Create copy of OVMF_VARS for this VM (Secure Boot state stored here) - local vm_vars="/tmp/${VM_NAME}_VARS.fd" - cp "$uefi_vars" "$vm_vars" - - if [[ "$uefi_code" == *".secboot.fd" ]]; then - log_info "Using UEFI firmware with Secure Boot: $uefi_code" - else - log_warn "Using UEFI firmware WITHOUT Secure Boot: $uefi_code" - log_warn "For full Secure Boot testing, install: sudo apt install ovmf" - fi - - # Determine secure boot setting + # Determine if Secure Boot is available local secure_boot="no" - if [[ "$uefi_code" == *".secboot.fd" ]]; then + if [[ "$uefi_code" == *"secboot"* ]]; then secure_boot="yes" + log_info "Using UEFI with Secure Boot: $uefi_code" + else + log_warn "Using UEFI WITHOUT Secure Boot: $uefi_code" fi - # Use persisted XML template + # Pre-create disk image + log_info "Creating disk image: $VM_DISK_PATH" + sudo rm -f "$VM_DISK_PATH" 2>/dev/null || true + if ! sudo qemu-img create -f qcow2 "$VM_DISK_PATH" "${VM_DISK_SIZE}G"; then + log_error "Failed to create disk image" + return 1 + fi + sudo chown libvirt-qemu:libvirt-qemu "$VM_DISK_PATH" 2>/dev/null || true + sudo chmod 644 "$VM_DISK_PATH" 2>/dev/null || true + + # Use XML template for VM definition local template="${SCRIPT_DIR}/vm/template.xml" if [[ ! -f "$template" ]]; then log_error "VM template not found: $template" return 1 fi - # Generate dynamic values + # Generate UUID local vm_uuid - if command -v uuidgen &> /dev/null; then - vm_uuid=$(uuidgen) - else - vm_uuid=$(cat /proc/sys/kernel/random/uuid) - fi - local mac_address="52:54:00:$(od -An -N3 -tx1 /dev/urandom | tr ' ' ':' | cut -c2-13)" + vm_uuid=$(cat /proc/sys/kernel/random/uuid) # Create VM XML from template local vm_xml="/tmp/${VM_NAME}.xml" @@ -167,55 +167,58 @@ vm_create() { -e "s|@VM_CPUS@|${VM_CPUS}|g" \ -e "s|@SECURE_BOOT@|${secure_boot}|g" \ -e "s|@UEFI_CODE@|${uefi_code}|g" \ - -e "s|@UEFI_VARS@|${vm_vars}|g" \ + -e "s|@UEFI_VARS_TEMPLATE@|${uefi_vars}|g" \ -e "s|@VM_DISK@|${VM_DISK_PATH}|g" \ - -e "s|@ISO_PATH@|${ISO_PATH}|g" \ - -e "s|@MAC_ADDRESS@|${mac_address}|g" \ + -e "s|@ISO_PATH@|${VM_ISO_PATH}|g" \ "$template" > "$vm_xml" - # Define and START the VM + log_info "Defining VM from XML..." + + # Define the VM if ! virsh -c "$LIBVIRT_URI" define "$vm_xml"; then log_error "Failed to define VM from XML" + cat "$vm_xml" return 1 fi + # Start the VM + log_info "Starting VM..." if ! virsh -c "$LIBVIRT_URI" start "$VM_NAME"; then log_error "Failed to start VM" return 1 fi + # Verify VM is running + sleep 2 + if virsh -c "$LIBVIRT_URI" domstate "$VM_NAME" 2>/dev/null | grep -q "running"; then + log_info "VM created and STARTED successfully" + else + log_warn "VM created but may not be running - check virt-manager" + fi + # Get VNC display info local vnc_display - vnc_display=$(virsh -c "$LIBVIRT_URI" vncdisplay "$VM_NAME" 2>/dev/null) + vnc_display=$(virsh -c "$LIBVIRT_URI" vncdisplay "$VM_NAME" 2>/dev/null || echo "unknown") - log_info "VM created and STARTED successfully" log_info "VNC display: $vnc_display" log_info "" - log_info "To connect in virt-manager:" - log_info " 1. Open virt-manager" - log_info " 2. File → Add Connection" - log_info " 3. Enter URI: qemu:///session" - log_info " 4. Connect and double-click '$VM_NAME'" + log_info "Open virt-manager - VM '$VM_NAME' should be visible under QEMU/KVM" } # Connect to VM console vm_console() { - local LIBVIRT_URI="qemu:///session" log_info "Connecting to VM console..." virsh -c "$LIBVIRT_URI" console "$VM_NAME" } # Get VM status vm_status() { - local LIBVIRT_URI="qemu:///session" log_info "VM Status for: $VM_NAME" virsh -c "$LIBVIRT_URI" dominfo "$VM_NAME" 2>/dev/null || log_error "VM not running" } # Check if VM is running vm_is_running() { - local LIBVIRT_URI="qemu:///session" - # Check virsh session if virsh -c "$LIBVIRT_URI" domstate "$VM_NAME" 2>/dev/null | grep -q "running"; then return 0 fi @@ -224,7 +227,6 @@ vm_is_running() { # Capture boot screenshot vm_capture_screen() { - local LIBVIRT_URI="qemu:///session" local output_dir="${SCRIPT_DIR}/tmp/vm-screenshots" mkdir -p "$output_dir" @@ -236,11 +238,10 @@ vm_capture_screen() { # Destroy VM and cleanup vm_destroy() { - local LIBVIRT_URI="qemu:///session" log_info "Destroying VM: $VM_NAME" virsh -c "$LIBVIRT_URI" destroy "$VM_NAME" 2>/dev/null || true virsh -c "$LIBVIRT_URI" undefine "$VM_NAME" --nvram 2>/dev/null || true - rm -f "$VM_DISK_PATH" "/tmp/${VM_NAME}_VARS.fd" "/tmp/${VM_NAME}.xml" + sudo rm -f "$VM_DISK_PATH" "$VM_ISO_PATH" "/tmp/${VM_NAME}.xml" log_info "Cleanup complete" } diff --git a/vm/template.xml b/vm/template.xml index ab31872..cec6d3b 100644 --- a/vm/template.xml +++ b/vm/template.xml @@ -7,7 +7,7 @@ hvm @UEFI_CODE@ - @UEFI_VARS@ + @@ -39,7 +39,6 @@ -