Any OS can support PXE/EFI boot possibilities to other systems booting. This post will focus on creating a X86/EFI boot environment using Debian for booting various other systems. The post will primarily focus on booting other Linux environments, there will be additional posts supporting Windows and other platforms.
Step 1: Basic Details
The three components that make up a PXE boot environment are:
- DHCP provisioning: DHCP provisions the system with IP address and details on where to boot from.
- TFTP : provides the system with files to boot from
Step 2: DHCP Details
Provision a DHCP server in the environment that is coupled to your network. In the following example will focus primarily on linux DHCP, but any DHCP service will suffice. The following DHCP server configuration extract contains the option entries to have the system choose a boot file for x86 of EFI systems.
# DHCP Server Example Configuration File allow bootp; allow booting; next-server 192.168.0.40; option arch code 93 = unsigned integer 16; if option arch = 00:07 or option arch = 00:09 { filename "bootnetx64.efi"; } else { filename "pxelinux.0"; } subnet 192.168.2.0 netmask 255.255.255.0 { option routers 192.168.2.1; option subnet-mask 255.255.255.0; option broadcast-address 192.168.2.255; range 192.168.2.2 192.168.2.254; }
Step 2: TFTP Server
Install a tftp server:
# apt install tftpd-hpa
Configure the default TFTP configuration file /etc/default/tftpd-hpa
# /etc/default/tftpd-hpa TFTP_USERNAME="tftp" TFTP_DIRECTORY="/srv/tftp" TFTP_ADDRESS=":69" TFTP_OPTIONS="--secure"
Create TFTP directory structure:
# mkdir /srv/tftp # mkdir /srv/tftp/boot-screens # mkdir /srv/tftp/pxelinux.cfg # mkdir /srv/tftp/grub # mkdir -p /srv/tftp/debian-installer/amd64 # mkdir -p /srv/tftp/images/debian # mkdir -p /srv/tftp/images/ubuntu
Restart the TFTP server
# systemctl restart tftpd-hpa.service
Step 3: Install Debian Netboot
Install the Debian netboot files, these contain the basic files for creating a Debian boot PXE environment and memdisk (to boot alternative images in X86 mode):
# apt install debian-installer-11-netboot-amd64 # apt install grub-imageboot
Copy the various netboot files to the tftp directory and create basic structure:
# cd /usr/lib/debian-installer/images/11/amd64/text/debian-installer/amd64 # cp pxelinux.0 /srv/tftp/ # cp bootnetx64.efi /srv/tftp/ # cp grubx64.efi /srv/tftp/ # cp boot-screens /srv/tftp/boot-screens # cd /srv/tftpboot # ln -s boot-screens/ldlinux.c32 ldlinux.c32 # cp /boot/memdisk /srv/tftpboot/images/memdisk < Debian EFI boot links to grub.cfg in debian-installer directory, create symbolic link to root> # cd /srv/tftp/debian-installer/amd64 # ln -s ../../grub grub
Copy the Debian boot files to the TFTP Debian image directory:
# cd /usr/lib/debian-installer/images/11/amd64/text/debian-installer/amd64 # cp initrd.gz /srv/tftp/images/debian # cp linux /srv/tftp/images/debian
Step 4: Configure X86 Netboot
x86 netboot uses the pxelinux.0 format to boot from, this file uses /srv/tftp/pxelinux.cfg/default
for its details, edit the file and place the following values to let it use a boot-screen:
path boot-screens/ include boot-screens/menu.cfg default boot-screens/vesamenu.c32 prompt 0 timeout 0
Configure the /srv/tftp/boot-screens/menu.cfg
to reflect your boot requirements, in the following example it was customized to support for various options:
menu hshift 7 menu width 61 timeout 50 menu title ^GMy PXE Boot System include boot-screens/stdmenu.cfg default debian menu begin debian menu label ^Debian menu title Debian include boot-screens/stdmenu.cfg label mainmenu menu label ^Back.. menu exit include boot-screens/debian-auto.cfg include boot-screens/debian-manual.cfg menu end
Configure the Debian auto-installer menu /srv/tftp/boot-screens/debian-auto.cfg
to reflect your boot requirements, in the following example it was customized to support for various options. The boot line contains a url=??? entry, which should point to your Debian preseed file.
label debian-auto-install-text menu label ^Debian [auto-install-text] menu default kernel images/debian/text/linux append vga=788 auto=true priority=critical ramdisk_size=14984 locale=en_US.UTF-8 kdb-chooser/method=us console-setup/layoutcode=en_GB interface=eth0 netcfg/get_hostname= console-keymaps-at/keymap=us url=http://nas.mydomain.org/preseed-debian.txt vga=normal initrd=images/debian/text/initrd.gz -- quiet
Configure the Debian regular menu /srv/tftp/boot-screens/debian-manual.cfg
to reflect your boot requirements,
label debian-manual-install menu label ^Debian [manual-install] kernel images/debian/linux-amd64 append vga=788 initrd=images/debian/initrd-amd64.gz --- quiet
Step 5: Configure EFI Netboot
EFI netboot uses the bootnetx64.efi format to boot from, this file uses /debian-installer/amd64/grub/x86_64-efi/grub.cfg
for its details. As we created a symoblic link you can edit /srv/tftp/grub/x86_64-efi/grub.cfg
the file and place the following values to let it load the generic modules and the main grub.cfg file:
insmod part_acorn insmod part_amiga insmod part_apple insmod part_bsd insmod part_dfly insmod part_dvh insmod part_gpt insmod part_msdos insmod part_plan insmod part_sun insmod part_sunpc source /grub/grub.cfg
Configure the /srv/tftp/grub/grub.cfg
to reflect your boot requirements, in the following example it was customized to support for various options. The following example does contain a theme.txt file, you can use any of the available grub themes to customize this loader:
if loadfont $prefix/font.pf2 ; then set gfxmode=800x600 set gfxpayload=keep insmod efi_gop insmod efi_uga insmod video_bochs insmod video_cirrus insmod gfxterm insmod png terminal_output gfxterm fi insmod loopback background_image /boot-screens/background.png set theme=/grub/theme.txt set menu_color_normal=cyan/blue set menu_color_highlight=white/blue insmod play play 480 440 1 submenu "Debian" --class debian { set theme=/grub/theme.txt menuentry 'Debian Auto-Install' --class debian { set background_color=black linux images/debian/text/linux vga=normal auto=true priority=critical ramdisk_size=14984 locale=en_US.UTF-8 kdb-chooser/method=us console-setup/layoutcode=en_GB interface=eth0 netcfg/get_hostname= console-keymaps-at/keymap=us url=http://filer.ops.cyberfront.org/preseed-debian-efi.txt vga=normal initrd=images/debian/text/initrd.gz quiet initrd images/debian/text/initrd.gz } menuentry 'Debian Manual-Install' --class debian { set background_color=black linux images/debian/text/linux vga=normal quiet initrd images/debian/text/initrd.gz } } menuentry 'Reboot' --class restart { reboot } menuentry 'Shutdown' --class shutdown { halt }
Step 6: Test Test Test
Create a Virtual Machine with X86 boot or EFI Settings, when creating a Virtual Machine, just edit it settings and set BIOS type to BIOS or EFI. Boot the VM and start checking if it receives the proper DHCP settings, boots from the TFTP server, etc.