Citrix Hypervisor – Unattended Installation with Hotfixes and NVIDIA GRID Driver

Reading Time: 6 minutes

I wanted to write about automating a Citrix Hypervisor aka XenServer installation for a long time but never had the time to put all the information together. If you are looking for a guide how to silent install a XenServer with the latest updates and NVIDIA vGPU driver you came to the right place. This deployment is only working with XenServer 7.1 and later. Citrix changed the hotfix format from ‘.xsupdate’ to ‘.ISO’. If there should be any reason for deploying XenServer 7.0 (EOL – May 2021) feel free to edit the provided bash script.


Before installing and configuring the needed components we need to understand the procedure for an unattended installation.

  1. Server is powered on
  2. Server is getting an ip address from a DHCP server with PXE boot information
  3. PXELINUX is started and a boot menu is presented (TFTP)
  4. Citrix Hypervisor base installation is triggered with an answer configuration file (FTP)
  5. After the first boot of the server a post script action is triggered

This is a screenshot of the the PXELinux boot menu.

Now lets get started with setting up the deployment server. Im using a Windows Server 2019 machine in my environment but it could be any other Windows Server release. There is no need to join the machine to a domain it can be member of a local workgroup.  Its up to you.

Please download the following sources:

Setup the DHCP Server

The first thing we need to do is to install the DHCP server role and configure a scope for our deployment network. Im using the subnet  and the ip address of my deployment server is

Powershell Commands


Prepare the FTP Server

Now its time to install the WebServer and FTP feature which will provide the Citrix Hypervisor installation sources during the TFTP boot stage.

Create the FTP directories in the filesystem.

Start the IIS Management Console and add a new FTP site.





Verify if the FTP server is working while accessing “ftp://localhost/xenserver” in Windows Explorer.


Import Citrix Hypervisor Sources

Mount the Citrix Hypervisor ISO and copy the files to “C:\FTP\xenserver\7.1”


Copy the needed hotfixes (.ISO) to “C:\FTP\xenserver\files\7.1\Hotfix”.


Copy the NVIDIA GRID driver to “C:\FTP\xenserver\files\7.1\GRID”


Build the Answerfile

Now it is time to create the XML answerfile file which is providing the install parameters  > “C:\FTP\xenserver\config\XEN-01.xml”


Post Script  & First Boot Script

You can see in the answerfile is a parameter called “<script stage>” which is providing a “” script which will be triggered after the succesfull base installation of the hypervisor. This script is calling the after the next reboot, where the automation magic is happening. Thanks to my colleague Michael Winkler who was working together with me on the script. We included the following features:

  • Set TimeZone
  • Download Hotfixes and NVIDIA GRID driver
  • Set Licence Server
  • Enable Multipathing
  • Install Hotfixes and NVIDIA GRID driver
  • Cleanup the system
  • Reboot



PXELinux and TFTP Server

Create the following folder structure

Extract the to C:\TFTP


Copy the needed boot files to the TFTP folder.

Create the boot menu config file “C:\TFTP\pxelinux.cfg\default” and edit the ftp url for the answerfile > ‘answerfile=’


Select “tftpd64.exe” for starting the TFTP server. Make sure “C:\TFTP” is selected as current directory and the “TFTP Server” service is activated under “Settings”.


Deployment Example

Server is booting into PXE.  I am choosing “Install Citrix XenServer 7.1 CU1”.


Unattended installation is starting with the answerfile “XEN-01.xml”


You can check the transfered files with Tftpd64. We can see that the “install.img” got transmited to our server.


After the succesfull base installation of the Citrix XenServer the “” will be executed and a final reboot will occure. You can check the log file “/var/log/xenautomation.log” for getting more information.



Lets add the fresh installed server to XenCenter and check if everything went well –> Licensed, Cumulative Updates got applied and the GRID driver is available 🙂




In an environment where you have to install many servers it is better to create a custom boot menu for each server. Otherwise you need to create an entry for every server which could end up with a list of 100 labels or more. Example:

  • Name of the boot menu file: 01-MACAddress –> “01-88-99-aa-bb-cc-dd”
  • Name of the answer file: 01-MACAddress.xml –> “01-88-99-aa-bb-cc-dd.xml”

During the boot phase PXELinux will first look for a file with is matching the server MAC address in the “pxelinux.cfg” directory. If the MAC address is not matching there will always be a fallback to the “default” file.

Nested Virtualization

If you want to play arround with the hypervisor deployment in a virtual environment you can go for a nested virtualization on VMware ESXi. It is easier to start with a virtual machine then deploying directly on bare-metal.

– Choose “CentOS 6 (64-bit) as Guest OS
– Active Hardware virtualization
– Change the SCSI Controller to “LSI Logic Parallel”




  1. Hi Julian, thank you for the good guidance and your great work.

    I’m trying to create an automated unattended installation of hypervisor 8.
    I created a TFTP and FTP server to provide the necessary data.

    I also set the .xml configurations according to the documentation from you and official citrix docs:

    Unfortunately the following part is not executed in the configuration:

    (also the syntax as described in your documentation does not work)

    I see in the ftp server logs, that he’s downloading the file.

    My Post Install Script looks like this. This is apparently not executed, because the directory in line 1 is not created at all.

    #!/bin/bash -x
    touch $1/tmp/post-executed
    wget ftp://*ip*/xenserver/scripts/ -O $1/tmp/
    chmod 777 $1/tmp/
    touch $1/etc/system/system/postinstall.service
    chmod 777 $1/etc/system/system/postinstall.service
    cat > $1/etc/system/system/postinstall.service <<EOF
    ln -s -s /etc/systemd/system/postinstall.service $1/etc/systemd/system/

    All other configurations in the config XML file are taken over. It fails only to execute the post-install script.

    Do you have any idea what I can do?

Leave a Reply

Your email address will not be published. Required fields are marked *