Skip to content

Instantly share code, notes, and snippets.

@andersevenrud
Created October 21, 2014 11:48
Show Gist options
  • Save andersevenrud/8b1a85ebf28d4221972b to your computer and use it in GitHub Desktop.
Save andersevenrud/8b1a85ebf28d4221972b to your computer and use it in GitHub Desktop.
#!/bin/bash
#
# Script for migrating a VHD
#
# Anders Evenrud <andersevenrud@gmail.com>
#
# http://serverfault.com/questions/508251/migrating-xenserver-vms-from-intel-to-amd-servers
# http://wiki.xen.org/wiki/Proposal:_Disk_import/export
# http://wiki.xen.org/wiki/XAPI_Command_Line_Interface
# http://cristiansan.wordpress.com/2011/09/29/xenserver-create-a-vm-from-cli/
# http://heylinux.com/en/?p=238
# http://docs.vmd.citrix.com/XenServer/4.0.1/reference/ch05s04.html
# http://xenserver.org/partners/developing-products-for-xenserver/18-sdk-development/114-import-export-vdi.html
# http://zderadicka.eu/migrating-xend-virtual-machines-to-xapi-platform-xcpxenserver/
VM_LABEL="${1}"
VM_CPUS="2"
VM_MEM="512MiB"
VM_DISK_SIZE="20GiB"
VM_DISK_IMAGE="/tmp/foo.vhd"
VM_TEMPLATE="Other install media"
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#*.}"
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"
exit 1
fi
#
# 1: Detect storage and networks
#
SR_UUID=$(xe sr-list | grep -C 1 "Local" | grep uuid | awk '{print $5}')
if [ -z "$SR_UUID" ]; then
echo "Failed to discover Storage Record UUID"
exit 1
fi
echo "Using Storage Record: ${SR_UUID}"
NETWORK_UID=$(xe network-list bridge=xenbr0 --minimal)
if [ -z "$NETWORK_UUID" ]; then
echo "Failed to discover Network UUID"
# exit 1
fi
echo "Using Network: ${NETWORK_UUID}"
#
# 2: Create new VM
#
echo "Creating Virtual Machine '${VM_LABEL}':"
echo "Configuring with ${VM_MAX_VCPUS} CPUs, ${VM_MAX_DYNAMIC_MEM} RAM, ${VM_DISK_SIZE} HDD"
echo "Importing VDI (${VM_DISK_IMAGE_FORMAT}) ${VM_DISK_IMAGE}"
echo "Press any key to continue.... or CTRL+C to cancel"
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 "New VM has 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
#
# 3: Create disk and set bootable. Then import VDI
#
xe vm-disk-add uuid=$VM_UUID sr-uuid=$SR_UUID device=0 disk-size=$VM_DISK_SIZE
DISK_UUID=$(xe vbd-list vm-uuid=$VM_UUID userdevice=0 params=uuid --minimal)
if [ -z "$DISK_UUID" ];
echo "Failed to create HDD"
exit 1
then
xe vbd-param-set bootable=true uuid=$DISK_UUID
xe vdi-import uuid=$DISK_UUID filename=$VM_DISK_IMAGE format=$VM_DISK_IMAGE_FORMAT #--progress
#
# 4: 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 "New Network Interface has UUID: ${DISK_UUID}"
#
# 5: 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