#!/bin/bash source ~/.bashrc # Fix Floppy Boot Issue - Remove Floppy and Set Correct Boot Order set -e # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } log_step() { echo -e "${BLUE}[STEP]${NC} $1" } # Load environment variables if [ -f .env ]; then set -a source <(grep -v '^#' .env | grep -v '^$' | sed 's/#.*$//' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//' | grep '=') set +a fi PVE_USERNAME="${PVE_USERNAME:-root@pam}" PVE_PASSWORD="${PVE_ROOT_PASS:-}" PROXMOX_URL="https://192.168.1.206:8006" PROXMOX_NODE="pve" # Get authentication ticket get_ticket() { local response=$(curl -k -s -d "username=$PVE_USERNAME&password=$PVE_PASSWORD" \ "$PROXMOX_URL/api2/json/access/ticket") local ticket=$(echo "$response" | grep -o '"ticket":"[^"]*' | cut -d'"' -f4) local csrf=$(echo "$response" | grep -o '"CSRFPreventionToken":"[^"]*' | cut -d'"' -f4) if [ -z "$ticket" ] || [ -z "$csrf" ]; then log_error "Failed to authenticate with Proxmox" return 1 fi echo "$ticket|$csrf" } # Fix floppy boot issue fix_floppy_boot() { local auth=$1 local vmid=$2 local name=$3 local ticket=$(echo "$auth" | cut -d'|' -f1) local csrf=$(echo "$auth" | cut -d'|' -f2) log_step "Fixing boot order for $name (ID: $vmid)..." # Stop VM log_info "Stopping VM..." curl -k -s -X POST \ -H "Cookie: PVEAuthCookie=$ticket" \ -H "CSRFPreventionToken: $csrf" \ "$PROXMOX_URL/api2/json/nodes/$PROXMOX_NODE/qemu/$vmid/status/stop" > /dev/null 2>&1 sleep 2 # Remove floppy drive if it exists log_info "Removing floppy drive (if exists)..." curl -k -s -X PUT \ -H "Cookie: PVEAuthCookie=$ticket" \ -H "CSRFPreventionToken: $csrf" \ -d "floppy0=none" \ "$PROXMOX_URL/api2/json/nodes/$PROXMOX_NODE/qemu/$vmid/config" > /dev/null 2>&1 || true # Delete floppy device curl -k -s -X DELETE \ -H "Cookie: PVEAuthCookie=$ticket" \ -H "CSRFPreventionToken: $csrf" \ "$PROXMOX_URL/api2/json/nodes/$PROXMOX_NODE/qemu/$vmid/config/floppy0" > /dev/null 2>&1 || true # Set boot order explicitly: CD-ROM first, then disk, skip floppy log_info "Setting boot order: CD-ROM first, then disk..." # Method 1: Set boot order with explicit device order curl -k -s -X PUT \ -H "Cookie: PVEAuthCookie=$ticket" \ -H "CSRFPreventionToken: $csrf" \ -d "boot=order=ide2;scsi0" \ "$PROXMOX_URL/api2/json/nodes/$PROXMOX_NODE/qemu/$vmid/config" > /dev/null 2>&1 || true # Method 2: Set bootdisk to CD-ROM curl -k -s -X PUT \ -H "Cookie: PVEAuthCookie=$ticket" \ -H "CSRFPreventionToken: $csrf" \ -d "bootdisk=ide2" \ "$PROXMOX_URL/api2/json/nodes/$PROXMOX_NODE/qemu/$vmid/config" > /dev/null 2>&1 || true # Method 3: Disable floppy in BIOS curl -k -s -X PUT \ -H "Cookie: PVEAuthCookie=$ticket" \ -H "CSRFPreventionToken: $csrf" \ -d "bios=ovmf" \ "$PROXMOX_URL/api2/json/nodes/$PROXMOX_NODE/qemu/$vmid/config" > /dev/null 2>&1 || true # Start VM log_info "Starting VM..." curl -k -s -X POST \ -H "Cookie: PVEAuthCookie=$ticket" \ -H "CSRFPreventionToken: $csrf" \ "$PROXMOX_URL/api2/json/nodes/$PROXMOX_NODE/qemu/$vmid/status/start" > /dev/null 2>&1 log_info "✓ Boot order fixed for $name" echo "" } main() { echo "=========================================" echo "Fix Floppy Boot Issue" echo "=========================================" echo "" if [ -z "$PVE_PASSWORD" ]; then log_error "PVE_ROOT_PASS not set in .env" exit 1 fi # Authenticate auth=$(get_ticket) if [ $? -ne 0 ]; then exit 1 fi # Fix all VMs for vmid in 100 101 102 103; do case $vmid in 100) name="cloudflare-tunnel" ;; 101) name="k3s-master" ;; 102) name="git-server" ;; 103) name="observability" ;; esac fix_floppy_boot "$auth" "$vmid" "$name" done log_info "=========================================" log_info "Floppy Boot Issue Fixed" log_info "=========================================" echo "" log_info "VMs should now boot from CD-ROM." log_info "If still booting from floppy, remove floppy via Web UI:" log_info " Hardware tab → Remove floppy drive → Set boot order" } main "$@"