Ubuntu – Ubuntu PXE Server using only Grub files (BIOS & UEFI Support)

Hello World, 

This post is a continuation of our previous investigation around PXE servers capable of deploying operating systems (i.e. Ubuntu) through the network to BIOS or UEFI based systems.  The standard approach in order to deploy BIOS or UEFI based systems  is to use a combination of pxelinux files and grub files.  This combination seems to cover most of the scenarios and working almost all the time.   Such setup has been described in the following post 

Then, some users have been requesting a post about setting up a PXE server and use exclusively pxelinux files.  After some investigations, we have been able to setup such PXE server.  The bid downside of such approach is that the UEFI pxelinux files are not signed. This means that you cannot use this configuration to deploy Operating systems on UEFI based systems where secure boot is enabled.  The other real problem is the performance issue encountered so far.  Based on the version of pxelinux used, you can have immediate error or you can have some success.  However, compared to the grub solution, booting time when using UEFI version of pxelinux is really really slow (it takes several minutes to get the Ubuntu installer)

This post will provide some guidance in order to replace the pxelinux files and use exclusively the grub files.  The grub files will be used to deploy OS against BIOS or UEFI Based systems.  As you will see, the process is quite straight forward and seems to work quite well.  

So, let’s go ! 



To be able to use this guide, you will need to first follow the instructions in our previous post as it explains how to setup the full TFTP/PXE infrastructure.  We will not repeat here all the steps already provided.   The following assumptions have been made as well 

  • Hyper-v platform is used to emulated UEFI based virtual machines
  • VM Generation 2 will be used in order to have UEFI and SecureBoot option is enabled (grub file support such functionality)
  • You have internet connection in order to download additional necessary packages
  • You have followed the instructions from our previous post  to install DHCP/PXE/TFTP and create the tftp folder structure 

Step by Step Guide 

Step 1 – Download UEFI PXELINUX Files

Because we have installed on Ubuntu Server as UEFI where Secure boot is enabled, the machine is hosting only the efi version of the grub files.  So, before proceeding, we need to download the correct version of grub files (the one for Bios version).  To download the needed packages, we will execute the following command  

sudo apt-get install grub-pc

Step 2 – Generate the grub boot loader for bios systems 

Actually, while searching for this information, we have discovered that some commands exists to create the grub files needed for pxe servers.  In this post, we will focus on generating the bios boot loader that will be used by grub.  So, to generate such file, you should run the following command 

cd ~
grub-mkimage -d /usr/lib/grub/i386-pc/ -O i386-pc-pxe -o ./booti386 -p '/grub' pxe tftp

This command will generate the booti386 file in the folder location where you execute the command  

If you have followed the installation instructions described here, you have already the necessary tftp folder structure in place and you have also the necessary grub bootloaders files for uefi systems

Note : 

We can create the uefi version by executing the following command 

grub-mkimage -d /usr/lib/grub/x86_x64/ -O x86_x64-efi -o ./bootx64.efi -p '/grub' efinet tftp


grub-mkimage -d /usr/lib/grub/x86_x64/ -O x86_x64-efi.signed -o ./bootx64.efi -p '/grub' efinet tftp

to support secure boot feature of UEFI systems 

Step 3 – Copy all necessary files under the tftp folder structure 

We are almost done.  Indeed, we have already the tftp folder structure in place.  We simply need to copy the necessary files in the correct location.  The first thing to do is to copy the grub bios boot loader file (i.e. booti386) under the tftp root folder by issuing the following command 

copy ~/booti386 t-/tftp/

Then, we also need to copy some grub files under the the tftp subfolder.  So, execute the following command 

sudo cp -rf /usr/lib/grub/i386-pc /tftp/grub

There is no need to update the grub.cfg file as both boot loaders will be using the same file with the same configuration information. 

Step 4 – update your dnsmasq.conf file 

The pxe client needs to know where to find the file it will boot from.  In our previous post, we have been using the pxelinux software file and we have made a reference of it in the /etc/dnsmasq.conf.  So, because we want to use the booti386  instead of the pxelinux.0 file, we will comment the last line of the file and we have added the following line 


So, the /etc/dnsmasq.conf file needs to be modified as follow (comment the line in red and add the line in green in your config file)

#Interface information 
#--use ip addr to see the name of the interface on your system

#DHCP Settings
#-- Set dhcp scope

#-- Set gateway option

#-- Set DNS server option

#-- dns Forwarder info

# Specify TFTP Options #

#--location of the pxeboot file

#--enable tftp service

#-- Root folder for tftp

#--Detect architecture and send the correct bootloader file

Test & Validate your setup  

Time to test our setup.  We have been performing a test using a physical Bios based system and on Virtualbox virtual machines. These tests were successful and you should see the grub menu when booting your bios system. 


Click on picture for better resolution 

However, when performing the test on an virtual machine hosted on hyper-v hypervisor, the grub menu never shows up….(see screenshot below)


Click on picture for better resolution 


Final Notes 

This is it for this post !  This one is not that long and has been written to provide complete options when configuring a pxe server.  Based on our investigations, it’ seems that the best configuration options for PXE Servers is to combine pxelinux files (to pxeboot bios based systems) and use grub files for uefi based systems.   

The second best option would be to use a PXE server that would be using exclusively grub technology to perform pxeboot operations.  The PXE erver can be configured to boot Bios and uefi bases system using only grub files (as described in this post).  The only limitation is when booting Hyper-V VMS.   

The least appealing options would be configure your PXE server to use exclusively pxelinux files.  The pxelinus files for BIOS based systems are working great but the UEFI version seems not ready for prime time.  Performance issues, unsigned file preventing deployment on system configured with secure boot enabled makes uefi pxelinux files unusable for real deployment scenarios.  

Personally, I like the idea of using only grub files because it offers a consistent look and feel when performing the deployment operation. Moreover, grub offers also the possibility to customize the boot menu a little bit further with a background image but this is not part of this post 

Hope you enjoyed this deep dive in PXE technology for Linux 

Till next time 

See ya




2 thoughts on “Ubuntu – Ubuntu PXE Server using only Grub files (BIOS & UEFI Support)

  1. Why you have installed the Webserver?
    Why we copy data inside the Server Root of the Webserver and access them via nfs?

  2. @Marcus,

    Thank you for visiting our blog and sharing your experience. In a really quick and dirty way, http is used when deploying server edition via PXE. NFS is used when deploying Desktop edition. Since we want to have a pxe server capable of deploying both version of Ubuntu, we have installed http and nfs on the server.

    Please note also that there is a newer version of the post related to Ubuntu 20.04. You might want to check them out and see if this could be useful to you

    Ubuntu 20.04 – Deploy Ubuntu 20.04 Desktop through PXE (BIOS & UEFI)
    Ubuntu 20.04 – Deploy Ubuntu 20.04 Server through PXE (BIOS & UEFI)

    Hope this help
    Till next time
    See ya

Leave a Reply