Newer versions of XenServer expect you to use vApps to handle virtual machines auto starting. This may not be appropriate in some situations.
You can still enable auto-power on via command line on the host [https://support.citrix.com/article/CTX133910], however this just batch starts all VMs at once. You might like a bit more control, particularly if you require the VMs to start up in a particular order.
The method I'm about to explain may not be particularly elegant, but it works for my home lab.
Establish a shell connection to your XenServer / XCP-NG host via SSH or directly on the console. Using PuTTY or some other SSH client that allows you to copy and paste will be really helpful.
You should be in the root user's home directory /root. This should be the default directory you're dropped in to when you first establish your connection
- otherwise just type cd and press enter to go straight there.
Create a new file called vm-autostart.sh with your favourite editor. I like vi as it's usually available.
Paste the following contents and modify the array called vms to suit:
#!/bin/bash
# xe vm-list for name-label, add in start order
vms=("VM1" "VM2" "VM3" "VM4" "VM5" "VM6" "VM7" "VM8" "VM9" "VM10")
wait=42s
# No need to modify below
initwait=2.5m
vmslength=${#vms[@]}
log=/root/vma.log
start_vm () {
echo -n "[$(date +"%T")] Starting $1 ... " >> ${log}
/opt/xensource/bin/xe vm-start name-label=$1
if [ $? -eq 0 ]
then
echo "Success" >> ${log}
else
echo "FAILED" >> ${log}
fi
# Wait if not the last vm
if [ "$1" != "${vms[${vmslength}-1]}" ]
then
echo "Waiting ${wait}" >> ${log}
sleep ${wait}
fi
}
echo "[$(date +"%T")] Running autostart script (Waiting ${initwait})" > ${log}
sleep ${initwait}
for vm in ${vms[@]}
do
start_vm ${vm}
done
echo "[$(date +"%T")] Startup complete." >> ${log}
The vms array takes the list of VM name-label properties. You can see them on the host if you run xe vm-list, or just take a look at your management software for the VM name. If you prefer to use the UUID, just modify the script accordingly.
The wait variable is set at 42 seconds. This is just slightly longer than it takes each of my vms to start up. You may require a bit longer, or you can set it a bit shorter. As my VMs all boot from the hosts local disks, I have the delay set so that there isn't so much contention for disk access. If you're booting from a storage array, then you might not require such a long delay.
The initwait variable is set at 2.5 minutes. This is to allow time for the toolstack to finish starting before trying to start the first VM. If the toolstack hasn't properly started before the first VM attempts to boot, the virtual machine will fail to start and you will have to start it manually. Subsequent machines will usually start, depending on the wait variable.
Save the script and quit the editor when you're happy with it. Remember to set the script to be executable with chmod a+x vm-autostart.sh.
Edit /etc/rc.d/rc.local
with your favourite editor.
At the bottom of the file, add a call to your newly create and executable script:
/root/vm-autostart.sh
Save the file and quit the editor.
Make the rc.local script executable:
chmod a+x /etc/rc.d/rc.local
Next time your host restarts, your vms should start automatically. Remember to test the script manually by shutting down all your VMs and then running the script in the shell to see that you didn't inadvertently introduce any errors.
You can track the progress of the script. As soon as your host has rebooted,
connect to the shell and either run tail -f /root/vma.log
or run less /root/vma.log
and press the F key to get the tail (Follow) function.