I have a Citrix xenserver 6.5 host which hosts a FreeNAS VM that exports an NFS share. I then have that same xenserver host use that NFS export as a SR for other VMs on that same server. It’s unusual, but it saves me from buying a separate server for VM storage.
The problem is if you reboot the hypervisor it will fail to connect to the NFS export (because the VM hosting it hasn’t booted yet.) Additionally it appears Xenserver does not play well at all with hung NFS mounts. If you try to shutdown or reboot your FreeNAS VM while Xenserver is still using its NFS export, things start to freeze. You will be unable to do anything to any of your VMs thanks to the hung NFS share. It’s a problem!
My hack around this mess is to have FreeNAS, not Xenserver, control starting and stopping these VMs.
First, create public/private key pair for ssh into xenserver
ssh-keygen
This will generate two files, a private key file and a public (.pub) file. Copy the contents of the .pub file into the xenserver’s authorized_keys file:
echo "PUT_RSA_PUBLIC_KEY_HERE" >> /root/.ssh/authorized_keys
Copy the private key file (same name but without .pub extension) somewhere on your FreeNAS VM.
Next, create NFS startup and shutdown scripts. Thanks to linuxcommando for some guidance with this. Replace the -i argument with the path to your SSH private key file generated earlier. You will also need to know the PBD UUID of the NFS store. Discover this by issuing
xe pbd-list
Copy the UUID for use in the scripts.
vi nfs-startup.sh
#!/bin/bash #NFS FreeNAS VM startup script SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i <PRIVATE_KEY_LOCATION> -l root <ADDRESS_OF_XENSERVER>" #Attach NFS drive first, then start up NFS-reliant VMs $SSH_COMMAND xe pbd-plug uuid=<UUID_COPIED_FROM_ABOVE> sleep 10 #Issue startup commands for each of your NFS-based VMs, repeat for each VM you have $SSH_COMMAND xe vm-start vm="VM_NAME" ...
vi nfs-shutdown.sh
#!/bin/bash #NFS FreeNAS VM shutdown script #Shut down NFS-reliant VMs, detach NFS SR #Re-establish networking to work around the fact that Network goes down before this script is executed within FreeNAS /sbin/ifconfig -l | /usr/bin/xargs -n 1 -J % /sbin/ifconfig % up SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i <PRIVATE_KEY_LOCATION> -l root <ADDRESS_OF_XENSERVER>" #Issue shutdown commands for each of your VMs $SSH_COMMAND xe vm-shutdown vm="VM_NAME" sleep 60 $SSH_COMMAND xe pbd-unplug <UUID_OF_NFS_SR> #Take the networking interfaces back down for shutdown /sbin/ifconfig -l | /usr/bin/xargs -n 1 -J % /sbin/ifconfig % down
Don’t forget to mark them executable:
chmod +x nfs-startup.sh chmod +x nfs-shutdown.sh
Now add the scripts as a startup task in FreeNAS and shutdown task respectively by going to System / Init/Shutdown Scripts. For startup, Select Type: Script, Type: postinit and point it to your nfs-startup.sh script. For shutdown, select Type: Script and Type: Shutdown.
Success! Now whenever your FreeNAS VM is shut down or rebooted, things will be handled properly which will prevent your hypervisor from freezing.