Virtualisierung
Mehrere VMs per Skript von VMware nach Proxmox migrieren
Mit dem folgenden Skript migrierst du mehrere virtuelle Maschinen von VMware nach Proxmox VE.
Das Skript arbeitet für jede VM in VM_NAMES diese Schritte ab:
- Export der VM aus VMware mit
ovftoolals OVF (Beschreibung plus VMDK-Dateien) nachTEMP_DIR. - Import in Proxmox mit
qm importovfunter der nächsten freien VMID. - BIOS auf UEFI (
ovmf) oder Legacy (seabios) setzen. - Bei Windows-Gästen die Festplatten von SCSI auf SATA umstellen, weil Windows ohne VirtIO-Treiber nicht von VirtIO SCSI bootet.
- Netzwerkkarte hinzufügen, denn
qm importovfübernimmt keine Netzwerkkonfiguration. - VM starten und optional die exportierten Dateien löschen.
Passe vor dem Start die Variablen im oberen Teil an deine Umgebung an. UEFI und WINDOWS gelten für alle VMs in einem Durchlauf. Migriere gemischte VMs deshalb in getrennten Durchläufen.
Hinweise
TEMP_DIRmuss genug Platz für die komplette VM haben./tmpist dafür oft zu klein oder liegt im Arbeitsspeicher.- Bei einem einzelnen ESXi-Host lautet die Quelle
vi://root@host/VM-Name. Bei vCenter brauchst du den vollständigen Pfad, zum Beispielvi://user@vcenter/Datacenter/vm/VM-Name. - Die VM muss für den Export ausgeschaltet sein.
#!/bin/bash
# Liste der VM-Namen
VM_NAMES=("VM_Name_1" "VM_Name_2" "VM_Name_3")
SOURCE_SERVER="root@source_server_ip"
TARGET_STORAGE="local-lvm" # Zielspeicher in Proxmox
TEMP_DIR="/var/tmp/vmware-export" # Verzeichnis mit genug Platz für den Export
DELETE_TEMP_FILE=true # false, wenn die exportierten Dateien erhalten bleiben sollen
UEFI=true # true für UEFI-VMs, false für Legacy-BIOS
WINDOWS=true # true für Windows-Gäste: Festplatten auf SATA, Netzwerkkarte e1000
BRIDGE="vmbr0" # Netzwerk-Bridge in Proxmox
mkdir -p "$TEMP_DIR"
for VM_NAME in "${VM_NAMES[@]}"; do
echo "Verarbeite VM: $VM_NAME"
EXPORT_DIR="$TEMP_DIR/$VM_NAME"
# Schritt 1: VM aus VMware als OVF exportieren
echo "Schritt 1: Exportieren der VM von VMware mit ovftool"
ovftool "vi://$SOURCE_SERVER/$VM_NAME" "$EXPORT_DIR/$VM_NAME.ovf" || { echo "Export fehlgeschlagen: $VM_NAME"; continue; }
# Schritt 2: Unter der nächsten freien VMID in Proxmox importieren
VMID=$(pvesh get /cluster/nextid)
echo "Schritt 2: Importieren der VM in Proxmox mit VMID $VMID"
qm importovf "$VMID" "$EXPORT_DIR/$VM_NAME.ovf" "$TARGET_STORAGE" || { echo "Import fehlgeschlagen: $VM_NAME"; continue; }
# Schritt 3: BIOS auf UEFI oder Legacy setzen
if [[ $UEFI == true ]]; then
echo "Schritt 3: Setzen des BIOS auf UEFI"
qm set "$VMID" --bios ovmf
else
echo "Schritt 3: Setzen des BIOS auf Legacy (nicht UEFI)"
qm set "$VMID" --bios seabios
fi
# Schritt 4: Windows-Gäste von SCSI auf SATA umstellen (Disks und Bootreihenfolge, nicht die Zeile scsihw)
if [[ $WINDOWS == true ]]; then
echo "Schritt 4: Festplatten auf SATA umstellen"
sed -i -E '/^scsihw:/! s/\bscsi([0-9]+)/sata\1/g' "/etc/pve/qemu-server/$VMID.conf"
NIC_MODEL="e1000"
else
NIC_MODEL="virtio"
fi
# Schritt 5: Netzwerkkarte hinzufügen
echo "Schritt 5: Netzwerkkarte $NIC_MODEL an $BRIDGE hinzufügen"
qm set "$VMID" --net0 "$NIC_MODEL,bridge=$BRIDGE"
# Schritt 6: VM starten
echo "Schritt 6: Starten der VM"
qm start "$VMID"
# Optional: exportierte Dateien löschen
if [[ $DELETE_TEMP_FILE == true ]]; then
echo "Bereinigen temporärer Dateien"
rm -rf "$EXPORT_DIR"
fi
echo "Migration der VM $VM_NAME abgeschlossen mit VMID $VMID"
done