Last active
February 18, 2016 16:47
-
-
Save andersevenrud/39d98e3758b8e532a72b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 <[email protected]> | |
# | |
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