Skip to content

Instantly share code, notes, and snippets.

@andersevenrud
Last active February 18, 2016 16:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save andersevenrud/39d98e3758b8e532a72b to your computer and use it in GitHub Desktop.
Save andersevenrud/39d98e3758b8e532a72b to your computer and use it in GitHub Desktop.
#!/bin/bash
#
# Script for migrating a Virtual Machine VHD
# between Intel and AMD.
#
# Arguments: <vm-label> <cpu-count> <memory-size> <disk-image-path>
#
# Anders Evenrud <andersevenrud@gmail.com>
#
VM_LABEL="${1}"
VM_CPUS="${2}"
VM_MEM="${3}"
VM_DISK_IMAGE="${4}"
VM_TYPE="${5}"
VHD_UTIL="/usr/bin/vhd-util"
VM_MAX_VCPUS=$VM_CPUS
VM_STARTUP_VCPUS=$VM_CPUS
VM_MIN_STATIC_MEM=$VM_MEM
VM_MAX_STATIC_MEM=$VM_MIN_STATIC_MEM
VM_MIN_DYNAMIC_MEM=$VM_MEM
VM_MAX_DYNAMIC_MEM=$VM_MIN_DYNAMIC_MEM
VM_DISK_IMAGE_FORMAT="${VM_DISK_IMAGE#*.}"
VM_DISK_SIZE=0
VM_TEMPLATE="Other install media"
if [ -z "$VM_LABEL" ]; then
echo "Cannot create a new VM without a name/label"
exit 1
fi
if [ -z "$VM_DISK_IMAGE" ]; then
echo "Cannot create a new VM without disk image: Not specified"
exit 1
fi
if [ ! -f "$VM_DISK_IMAGE" ]; then
echo "Cannot create a new VM without disk image: Does not exist"
exit 1
fi
if [ ! -x "$VHD_UTIL" ]; then
echo "Did not find: ${VHD_UTIL}"
exit 1
fi
#
# 1: Pull some data for global variables
#
if [ -z "$VM_TYPE" ]; then
VM_TYPE="PV"
fi
# Get template UUID from label
VM_TEMPLATE=$(xe template-list | grep -C 1 "${VM_TEMPLATE}" | grep uuid | awk '{print $5}')
if [ -z "$VM_TEMPLATE" ]; then
echo "Cannot create a new VM without a valid Template"
exit 1
fi
# Figure out what SR to use
if [[ "$VM_DISK_IMAGE" == /var/run/sr-mount* ]]; then
SR_UUID=`basename $(dirname ${VM_DISK_IMAGE})`
else
# Fall back to the default SR marked "Local"
SR_UUID=$(xe sr-list | grep -C 1 "Local" | grep uuid | awk '{print $5}' | tail -n1)
if [ -z "$SR_UUID" ]; then
echo "Failed to discover Storage Record UUID"
exit 1
fi
fi
# Figure out real size of the disk using the image file
#VM_DISK_SIZE=$($VHD_UTIL read -p -n $VM_DISK_IMAGE | grep " : = " | awk '{print $5}' | sed 's/(//')
VM_DISK_SIZE=$($VHD_UTIL read -p -n $VM_DISK_IMAGE | grep "Current disk size " | awk '{print $7}' | sed 's/(//')
if [ -z "$VM_DISK_SIZE" ]; then
echo "Failed to detect size of VHD"
exit 1
fi
if [ $VM_DISK_SIZE -eq 0 ]; then
echo "Error: Detected VHD size was 0"
exit 1
fi
#NETWORK_UUID=$(xe network-list bridge=xenbr0 --minimal)
#if [ -z "$NETWORK_UUID" ]; then
# echo "Failed to discover Network UUID"
# exit 1
#fi
#
# 2: Create new VM
#
echo "Creating Virtual Machine:"
echo " Type: $VM_TYPE"
echo " Label: $VM_LABEL"
echo " CPUs: $VM_MAX_VCPUS"
echo " Memory: $VM_MAX_DYNAMIC_MEM"
#echo " Network: $NETWORK_UUID"
echo ""
echo "Importing VDI:"
echo " Image: $VM_DISK_IMAGE ($VM_DISK_IMAGE_FORMAT)"
echo " Size: $VM_DISK_SIZE bytes"
echo " SR: $SR_UUID"
echo ""
echo "Press ENTER key to continue (or CTRL+C to cancel)..."
echo ""
read
VM_UUID=$(xe vm-install new-name-label=$VM_LABEL sr-uuid=$SR_UUID template=$VM_TEMPLATE)
if [ -z "$VM_UUID" ]; then
echo "Failed to create VM"
exit 1
fi
echo ">>> VM Created with UUID: ${VM_UUID}"
# Set up hardware parameters
xe vm-param-set VCPUs-max=$VM_MAX_VCPUS uuid=$VM_UUID
xe vm-param-set VCPUs-at-startup=$VM_STARTUP_VCPUS uuid=$VM_UUID
xe vm-param-set memory-static-max=$VM_MAX_STATIC_MEM uuid=$VM_UUID
xe vm-param-set memory-dynamic-max=$VM_MAX_DYNAMIC_MEM uuid=$VM_UUID
xe vm-param-set memory-dynamic-min=$VM_MIN_DYNAMIC_MEM uuid=$VM_UUID
xe vm-param-set memory-static-min=$VM_MIN_STATIC_MEM uuid=$VM_UUID
# Convert to PV if requested
if [ "${VM_TYPE}" == "PV" ]; then
xe vm-param-set uuid=${VM_UUID} HVM-boot-policy=""
xe vm-param-set uuid=${VM_UUID} PV-bootloader=pygrub
xe vm-param-set uuid=${VM_UUID} PV-args="--quiet console=hvc0"
#xe vm-param-set uuid=$UUID PV-bootloader-args="--kernel=$KERNEL_PATH --ramdisk=$RAMDISK_PATH"
#xe vm-param-set uuid=$UUID PV-args="$KERNEL_ARGS console=hvc0 xencons=hvc0"
fi
#
# 3: Create disk
#
xe vm-disk-add uuid=$VM_UUID sr-uuid=$SR_UUID device=0 disk-size=$VM_DISK_SIZE
VBD_UUID=$(xe vbd-list vm-uuid=$VM_UUID userdevice=0 params=uuid --minimal)
if [ -z "$VBD_UUID" ]; then
echo "Failed to create HDD"
exit 1
fi
xe vbd-param-set bootable=true uuid=$VBD_UUID
echo ">>> VBD Created with UUID: ${VBD_UUID}"
DISK_UUID=$(xe vdi-list vbd-uuids=$VBD_UUID | grep -e "^uuid" | awk '{print $5}')
if [ -z "$DISK_UUID" ]; then
echo "Something went wrong during disk creation, UUID not found"
exit 1
fi
echo ">>> VDI Created with UUID: ${DISK_UUID}"
#
# 4: Import image
#
echo ">>> Importing image..."
#xe vdi-import uuid=$DISK_UUID filename=$VM_DISK_IMAGE format=$VM_DISK_IMAGE_FORMAT #--progress
cp $VM_DISK_IMAGE /var/run/sr-mount/${SR_UUID}/${DISK_UUID}.${VM_DISK_IMAGE_FORMAT}
xe vbd-param-set bootable=true uuid=$VBD_UUID
echo ">>> Imported and set bootable"
#
# 5: Create network connection
#
#NET_UUID=$(xe vif-create vm-uuid=$VM_UUID network-uuid=$NETWORK_UUID mac=random device=0)
#if [ -z "$NET_UUID" ]; then
# echo "Failed to create NET"
# exit 1
#fi
#echo ">>> VIF Created with UUID: ${DISK_UUID}"
#
# 6: Done
#
#echo "Starting up VM..."
#xe vm-start uuid=$VM_UUID
echo "Done ... :)"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment