Here is a quick and dirty script to change the VM type of an existing Xenserver VM. This can be useful if you are, let’s say, using Linux-based cloning software to clone a Windows VM and you want it to run as fast as possible. You may realize that the system runs very slow. That’s because the Windows VM handles paravirtualization differently than the Linux environment will. You have to change the device type, and this script will help. I added a layer of abstraction to simplify the whole process of switching VM types.
Here are examples of how to run the script:
./change-type myvm
This will print out the current VM type as either “windows” or “linux”. A numerical ID is printed in [] that designates the current device_id, for your information.
change-type myvm linux
This will change the device type from whatever it is now, to linux.
change-type myvm windows
This will change the device type from whatever it is now, to windows.
change-type 00000000-0000-0000-0000-000000000000 linux
This will change the device type for the machine with the UUID specified.
#!/bin/bash # /usr/bin/change-type # # Written by Pete Lombardo # # This script can change the type of hardware for a VM in a Xen Pool(for example, from Linux to Windows or visa versa). # It can also be used to resolve a blue screen issue after upgrading the tools inside a Windows VM. # if [ ! "$1" == "" ]; then uuidtest=`echo $1 | sed -e 's/\-//g' | egrep "[0-9a-f]{32}" | wc -l` if [ $uuidtest -eq 0 ]; then uuid=`xe vm-list | grep -i ": $1" -B1 | grep uuid | cut -d':' -f2 | cut -d' ' -f2` name="$1" else uuid=$1 name=`xe vm-list | grep "$uuid" -A1 | grep name | cut -d':' -f2 | cut -d' ' -f2-` fi fi if [ "$1" == "" ]; then echo echo "Usage: change-type [machine-name] [type]" echo "Available Types: linux,windows" echo exit elif [ "$2" == "" ]; then echo echo "Checking the device type for $name" if [ "$uuid" == "" ]; then echo echo "ERROR: System $1 not found." echo exit fi type=`xe vm-param-get uuid=$uuid param-name=platform param-key=device_id 2>/dev/null` case $type in 0001) echo "linux [$type]" ;; 0002) echo "windows [$type]" ;; *) echo "linux [$type]" ;; esac echo exit fi case $2 in linux) device="0001" ;; windows) device="0002" ;; esac if [ "$uuid" == "" ]; then echo echo "ERROR: System $1 not found." echo exit fi xe vm-param-set uuid=$uuid platform:device_id=$device echo type=`xe vm-param-get uuid=$uuid param-name=platform param-key=device_id` case $type in 0001) echo "linux [$type]" ;; 0002) echo "windows [$type]" ;; *) echo "linux [$type]" ;; esac echo