原文:
https://r00t.dk/post/2022/06/19/convert_esxi_to_proxmox_ve_7_script/
参考PROXMOX说明:
https://pve.proxmox.com/wiki/Migration_of_servers_to_Proxmox_VE#VMware
先准备原材料,下载OVF工具:
https://developer.vmware.com/web/tool/4.4.0/ovf
执行脚本 import_esxi.sh 如下:
#!/bin/bash EXE=/tank/tools/ovftool/ovftool RED='\033[0;31m' NC='\033[0m' # No Color TYPE="" TEMP="/tmp" HOSTNAME="" USERNAME="root" VMNAME="" DESTINATION="" VMX="" VMID="" CONFIRM="" CLEAN="" LOG="" CheckArguments() { while [[ $# -gt 0 ]]; do case $1 in --online) TYPE="ONLINE" shift ;; --offline) TYPE="OFFLINE" shift # past argument ;; --temp) TEMP="$2" shift # past argument shift # past value ;; --vmx) VMX="$2" shift # past argument shift # past value ;; --hostname) HOSTNAME="$2" shift # past argument shift # past value ;; --vmid) VMID="$2" shift # past argument shift # past value ;; --username) USERNAME="$2" shift # past argument shift # past value ;; --destination) DESTINATION="$2" shift # past argument shift # past value ;; --yes) CONFIRM="YES" shift # past argument ;; --log) LOG="$2" shift # past argument shift ;; --clean) CLEAN="YES" shift # past argument ;; --*) echo "Unknown option $1" exit 1 ;; esac done } Write() { echo -e "$1" } Usage() { echo -e "${NC}" cat << EOT ESXi -> Proxmox helper script Simplifies import/export into a single command Usage: $1 <arguments> Arguments: --online : For direct online import from ESXi --offline : For import of vmdk from filesystem --temp <path> : Where to store temporary files before import into proxmox - defaults to /tmp if not provided --vmx <vmx> : Full path to vmx file --hostname <hostname> : hostname for esxi server --username <username> : username for esxi - defaults to root if not provided --vmname <vmname> : Name of VM as its presented in ESXi - if name contains spaces enclose it in quotes --destination <storage id> : ID of destination storage inside proxmox --vmid <vmid> : Destination ID of vm when its imported. Must be unique --yes : Assume yes to all questions --log <path> : Full path to log file - if none is provided, no logging is done --clean : Delete ovf file after import into proxmox Examples: $0 --offline --temp /tmp --vmx '/mnt/data/esxi/my\ vm/my\ vm.vmx' --destination vms --vmid 300 $0 --online --temp /tmp --hostname vms.root.dom --username john --vmname 'my vm' --destination vms --vmid 300 EOT } if [ ! -f $EXE ] then Write "$EXE does not exist" exit 2 fi if [ "$#" -eq "0" ] then Write "${RED}Missing arguments" Usage $0 exit 1 fi CheckArguments $@ MISSINGARGS="" if [ "$TYPE" == "" ] then MISSINGARGS="\n--offline or --online" fi if [ "$DESTINATION" == "" ] then MISSINGARGS+="\n--destination" fi if [ "$VMID" == "" ] then MISSINGARGS+="\n--vmid" fi if [ "$MISSINGARGS" != "" ] then Write "Missing required arguments:" Write "$MISSINGARGS" exit 3 fi if [ "$TYPE" == "OFFLINE" ] then Write "" Write "Ready to import" Write "-------------------------------------------------------------" Write "Temporary storage : '$TEMP'" Write "VM Storage : '$DESTINATION'" Write "VMX Path : '$VMX'" Write "Destination VM ID : '$VMID'" Write "-------------------------------------------------------------" VMXFILE=$(basename $VMX) VMNAME=$(basename -s .vmx $VMX) # echo "Source vmx:$VMXFILE" # echo "Source name:$VMNAME" if [ "$CONFIRM" == "" ] then Write "" read -p "Export vm to ovf format? (y/n)" -n 1 -r REPLY Write "" if [ "$REPLY" != "y" -a "$REPLY" != "Y" ] then exit 10 fi fi Write "Exporting $VMNAME to $TEMP" Write "Eecuting '$EXE $VMX $TEMP'" ARGS="" if [ "$LOG" != "" ] then ARGS="--X:logLevel=verbose --X:logFile=$LOG" fi $EXE $ARGS --noNvramFile --lax $VMX $TEMP Write "" Write "Export complete" Write "OVF file should be located in folder $TEMP/$VMNAME/" Write "" if [ "$CONFIRM" == "" ] then Write "VM $VMID is ready to be imported from ($TEMP/$VMNAME/$VMNAME.ovf)" Write "" read -p "Import VM $VMID to proxmox? (y/n)" -n 1 -r REPLY Write "" if [ "$REPLY" != "y" -a "$REPLY" != "Y" ] then exit 10 fi fi Write "Importing VM '$VMID' ($TEMP/$VMNAME/$VMNAME.ovf) to storage '$DESTINATION'" Write "" qm importovf $VMID $TEMP/$VMNAME/$VMNAME.ovf $DESTINATION if [ "$CLEAN" == "YES" ] then rm -rf $TEMP/$VMNAME fi fi exit 0
使用方法:
./import_esxi.sh --offline --temp /tmp --vmx '/mnt/data/esxi/my\ vm/my\ vm.vmx' --destination vms --vmid 300 ./import_esxi.sh --online --temp /tmp --hostname vms.root.dom --username john --vmname 'my vm' --destination vms --vmid 300