~drscream

Setup PXE boot environment

It’s really helpful to have a nice netboot environment at home or at the datacenter. It allows you to be flexible by changing the operating system version or have different installation methods.

We use it to boot our different SmartOS versions without having an usb key installed on the server. To be also flexible we using pxelinux and grub2 as boot loaders, tftpd and nginx to deliver the files to the node.

DHCP setting

I think you know already how to install an dhcpd on your preferred server. The following options are required to setup PXE boot.

## /etc/dhcp/dhcpd.conf
# pxe bootable
allow booting;
allow bootp;

# pxe-specific configuration directives
next-server 192.168.15.1;
filename "/pxelinux.0";

If the node is configured to use PXE it automatically checks and download the file pxelinux.0 from the configured next-server tftpd server.

TFTP

We use tftpd-hpa, it could easy configured on Debian in /etc/default/tftpd-hpa. To have tftpd a little bit more secure you should use an extra user that have access the the PXE files.

## /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/pxe"
TFTP_ADDRESS="192.168.15.1:69"
TFTP_OPTIONS="--secure"

PXELinux / SYSLinux

The syslinux package provides all files for pxelinux setup. We deploy all files to /srv/pxe to have one place which stores the configuration.

/srv/pxe
|-- boot -> .                # Simple symlink to boot folder
|-- grub                     # Grub2 configuration folder
|   |-- grub.cfg             # Grub2 configuration file
|   `-- i386-pc              # Grub2 modules folder
|-- os                       # Operating system folder
|-- pxelinux                 # PXELinux module folder
|-- pxelinux.0               # PXELinux file
`-- pxelinux.cfg             # PXELinux configuration folder
    |-- 01-00-0d-b9-32-6b-d0 # Extra configuration based on MAC
    `-- default              # Default configuration file for PXELinux

The pxelinux.cfg folder contains files named of the MAC address (01-[mac address]) of the node or fallback default configuration file. In the default file we’ve different options for:

  • Boot from local disk
  • Boot SmartOS
  • Boot FreeDOS
  • Boot Grub2

The menu contains some style options to have a fancy interface. But checkout the configuration file by yourself.

# Seriel console and default option
SERIAL 0 115200 0
DEFAULT pxelinux/vesamenu.c32
PROMPT 0

TIMEOUT 100

# Menu Style
MENU BACKGROUND pxelinux/splash.png
MENU TITLE Welcome to f.fruky.net-PXE
MENU VSHIFT 11
MENU ROWS 6
MENU TABMSGROW 15
MENU CMDLINEROW 14
MENU HELPMSGROW 16
MENU TABMSG Press [Tab] to edit options, [F1] for boot options.
MENU COLOR border 30;44 #00000000 #00000000 none

# Menu Setup
LABEL local
  MENU LABEL Local Disk
  LOCALBOOT 0

LABEL smartos
  MENU LABEL SmartOS-20140611EAIT
  KERNEL pxelinux/mboot.c32
  APPEND os/smartos/20140611EAIT/platform/i86pc/kernel/amd64/unix -B smartos=true,console=text --- os/smartos/20140611EAIT/platform/i86pc/amd64/boot_archive

LABEL FreeDOS
  MENU LABEL FreeDOS
  LINUX pxelinux/memdisk
  INITRD os/freedos/fdboot.img

LABEL grub
  MENU LABEL Grub2 boot
  boot grub/i386-pc/core.0

F1 help.msg #00000000

Grub2

You maybe think, why grub2 if you’ve a running pxelinux environment. Grub2 has some features that helps us more for debugging or installation from an web server.

  • Better serial console support
  • Better debug support (for example: changing of PCI device order)
  • Fetch additional information from http servers
## grub.cfg
# Load modules
insmod pxe
insmod serial
insmod usbserial_pl2303
insmod usbserial_ftdi

# Configure serial console
serial --speed=115200 --word=8 --parity=no --stop=1
terminal_input serial
terminal_output serial
terminal serial

# Play sound
play 480 440 1

# Menu
menuentry "SmartOS DEBUGGING" {
	multiboot /os/smartos/DEBUG/platform/i86pc/kernel/amd64/unix /os/smartos/DEBUG/platform/i86pc/kernel/amd64/unix -v -kd -B smartos=true,console=ttya,ttya-mode="115200,8,n,1,-"
	module /os/smartos/DEBUG/platform/i86pc/amd64/boot_archive /os/smartos/DEBUG/platform/i86pc/amd64/boot_archive
}

menuentry "FreeDOS" {
	linux16 /pxelinux/memdisk harddisk c=19 h=16 s=63
	initrd16 /os/freedos/freedos10.img
}

menuentry "Debian 7.4 Live Rescue (amd64)" {
	linux /os/debian/debian-live-7.4-amd64-rescue.vmlinuz boot=live config fetch=http://192.168.15.1/os/debian/debian-live-7.4-amd64-rescue.squashfs quiet console=ttyS0,115200n8
	initrd /os/debian/debian-live-7.4-amd64-rescue.initrd.img
}

menuentry "Debian 7.4 Live Standard (amd64)" {
	linux /os/debian/debian-live-7.4-amd64-standard.vmlinuz boot=live config fetch=http://192.168.15.1/os/debian/debian-live-7.4-amd64-standard.squashfs quiet console=ttyS0,115200n8
	initrd /os/debian/debian-live-7.4-amd64-standard.initrd.img
}

menuentry "Debian 7.5 Installer (amd64)" {
	linux /os/debian/installer-7.5-amd64/linux
	initrd  /os/debian/installer-7.5-amd64/initrd.gz
}

The Debian Rescue and Debian Live configuration fetches the squashfs via http. This is much faster than download the files via tftp.

To boot SmartOS via grub2 the following grub2 menuentry parameters required. You need to specify every value two times.

  • multiboot: SmartOS Kernel
  • module: SmartOS boot archive

Send your comment by mail.