Virtualisierung

Mehrere VMs per Skript von VMware nach Proxmox migrieren

3 min Lesezeit

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:

  1. Export der VM aus VMware mit ovftool als OVF (Beschreibung plus VMDK-Dateien) nach TEMP_DIR.
  2. Import in Proxmox mit qm importovf unter der nächsten freien VMID.
  3. BIOS auf UEFI (ovmf) oder Legacy (seabios) setzen.
  4. Bei Windows-Gästen die Festplatten von SCSI auf SATA umstellen, weil Windows ohne VirtIO-Treiber nicht von VirtIO SCSI bootet.
  5. Netzwerkkarte hinzufügen, denn qm importovf übernimmt keine Netzwerkkonfiguration.
  6. 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_DIR muss genug Platz für die komplette VM haben. /tmp ist 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 Beispiel vi://user@vcenter/Datacenter/vm/VM-Name.
  • Die VM muss für den Export ausgeschaltet sein.
Bash
#!/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

Tippe, um alle Artikel zu durchsuchen.

Nachricht schreiben

Die Daten nutze ich nur, um dir zu antworten. Mehr dazu im Datenschutz.