Compare commits

1 Commits

Author SHA1 Message Date
marco.locatelli@steamware.net e55da50b7c import-vhdx.sh 2026-01-30 16:57:48 +01:00
2 changed files with 121 additions and 0 deletions
+120
View File
@@ -0,0 +1,120 @@
#!/bin/bash
# Usage: import-vhdx-dir.sh <VMID> <VMNAME> <BASE_DIR_ON_NFS> <ENR>
# If VMID is 0 or already taken, the script will pick the first available VMID.
set -euo pipefail
# -----------------------
# Inputs and defaults
# -----------------------
INPUT_VMID="${1:-0}"
VMNAME="${2:?VM name required}"
BASEDIR="${3:?Base directory required}"
ENR="${4:-}"
STORAGE="ZFS-01"
ISO_STORAGE="tscale04-nfs"
ISO_NAME="virtio-win.iso"
# -----------------------
# Helpers
# -----------------------
get_free_vmid() {
# Get sorted list of used VMIDs
mapfile -t USED < <(qm list | awk 'NR>1{print $1}' | sort -n)
local id=100
while true; do
local taken=0
for u in "${USED[@]}"; do
if [[ "$u" == "$id" ]]; then
taken=1
break
fi
done
if [[ $taken -eq 0 ]]; then
echo "$id"
return 0
fi
((id++))
done
}
is_vmid_taken() {
local vmid="$1"
qm list | awk 'NR>1{print $1}' | grep -qx "$vmid"
}
# Determine VMID (auto-pick if 0 or taken)
if [[ "$INPUT_VMID" == "0" || "$(is_vmid_taken "$INPUT_VMID"; echo $?)" -eq 0 ]]; then
VMID="$(get_free_vmid)"
echo ">>> Requested VMID '$INPUT_VMID' is invalid/taken. Using first available VMID: $VMID"
else
VMID="$INPUT_VMID"
fi
# -----------------------
# Create VM (TPM/UEFI + SATA)
# -----------------------
case "$ENR" in
ENR)
echo ">>> Creating VM $VMID ($VMNAME) with TPM KEY not enrolled..."
qm create "$VMID" --name "$VMNAME" --memory 4096 --cores 4 --machine q35 \
--bios ovmf --efidisk0 ${STORAGE}:1,efitype=4m,pre-enrolled-keys=1 \
--tpmstate0 ${STORAGE}:1,version=v2.0
;;
*)
echo ">>> Creating VM $VMID ($VMNAME) with TPM and UEFI..."
qm create "$VMID" --name "$VMNAME" --memory 4096 --cores 4 --machine q35 \
--bios ovmf --efidisk0 ${STORAGE}:1,efitype=4m,pre-enrolled-keys=0 \
--tpmstate0 ${STORAGE}:1,version=v2.0
;;
esac
# -----------------------
# Find VHDX files, sort by size (largest first), space-safe
# -----------------------
declare -a VHDX_FILES
while IFS= read -r -d '' line; do
# line format: "<size>\t<path>"
size="${line%%$'\t'*}"
path="${line#*$'\t'}"
VHDX_FILES+=( "$path" )
done < <(find "$BASEDIR" -type f -iname "*.vhdx" -printf "%s\t%p\0" | sort -z -nr -k1,1)
if [ ${#VHDX_FILES[@]} -eq 0 ]; then
echo "!!! No VHDX files found in $BASEDIR"
exit 1
fi
echo ">>> Found ${#VHDX_FILES[@]} VHDX file(s), sorted by size:"
for f in "${VHDX_FILES[@]}"; do
echo " $f"
done
# -----------------------
# Import and attach disks as SATA (largest -> sata0)
# -----------------------
DISK_INDEX=0
for VHDX in "${VHDX_FILES[@]}"; do
echo ">>> Importing disk: $VHDX -> $STORAGE"
qm importdisk "$VMID" "$VHDX" "$STORAGE" --format=raw
# Identify the last unused disk created by import (space-safe parsing)
LASTDISK="$(qm config "$VMID" | awk '/^unused[0-9]+: /{print $2}' | tail -n1)"
if [[ -z "$LASTDISK" ]]; then
echo "!!! Could not detect imported disk for $VHDX"
exit 1
fi
DISK_NAME="sata${DISK_INDEX}"
echo ">>> Attaching '$LASTDISK' as '$DISK_NAME'..."
qm set "$VMID" --${DISK_NAME} "$LASTDISK"
((DISK_INDEX++))
done
# -----------------------
# Boot order: sata0 (largest disk)
# -----------------------
echo ">>> Setting boot order to sata0..."
qm set "$VMID" --boot order=sata0
+1
View File
@@ -1,4 +1,5 @@
#!/bin/sh
WEB_JS=/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
if [ -s "$WEB_JS" ] && ! grep -q NoMoreNagging "$WEB_JS"; then
echo "Patching Web UI nag..."