How to turn your OpenWRT router into a PXE server for hardware installations from your couch¶
So I have a custom made NAS at home which was running with debian and ZFS. I wanted to switch the OS to Ubuntu for reasons that are not important for this post. The NAS is buried in a closet, it has no out of band management/ipmi and I didn't want to hassle with USB-Sticks/ISOs anymore.
I have some experience with provisioning VMs and Baremetal via Foreman. I won't go into too much detail: In principal you give Foreman some control over a subnet by providing a dhcp and tftp server with hosts (MACs and IPs) you want to provision and what kind of OS you want to install. Foreman will then put the right files on the tftp server and setup a lease that boots an pxe image. Further more Foreman provides preseeds, kickstart or cloud-init configuration so you don't have to do anything.
Foreman does a good job at unattended installations but Foreman is no option for my home environment. It's a heavy application with so many configurations to do before hand, so a total overkill. Besides that there is no suitable host to install it, I have my OpenWRT router, PC and a laptop.
So the idea is to use my router for pxe boot and do an attended installation for now. This requires a USB-Stick for storing the pxe images, tftp for serving them and dnsmasq to provide them to PXE network booting hosts.
USB Stick preparation¶
I used a spare USB-Stick that I formated with ext4 and lableing the partition
mkfs.ext4 -L tftp /dev/sdXX
/dev/sdXX with your partition path. ie
This was done on OpenWRT Version 19.07
opkg update opkg install usbutils kmod-usb-storage block-mount kmod-fs-ext4 wget mkdir -p /mnt/usb/
wget package is needed because the dropbear version does not support SSL
Mount USB-Stick reboot persistent¶
uci set fstab.@mount.label=tftp uci set fstab.@mount.target=/mnt/usb uci set fstab.@mount.options=noatime,nodiratime uci commit block mount
Get PXE images¶
Instead of pulling each OS image individually I use netboot.xyz.
netboot.xyz is basically a menu wrapper for all kinds of operating systems.
cd /mnt/usb/ # Legacy (PCBIOS) iPXE Bootloaders wget --no-check-certificate https://boot.netboot.xyz/ipxe/netboot.xyz.kpxe # UEFI iPXE Bootloaders wget --no-check-certificate https://boot.netboot.xyz/ipxe/netboot.xyz.efi
Unfortunately I was only able to set one bootfile.
The linuxserver.io documentation states that multiple entries should be possible. This didn't work for me =(
uci set dhcp.@dnsmasq.enable_tftp=1 uci set dhcp.@dnsmasq.tftp_root=/mnt/usb/ uci set dhcp.@dnsmasq.dhcp_boot=netboot.xyz.kpxe uci commit /etc/init.d/dnsmasq restart
After booting via my NAS' network interface I was greeted by the netboot.xyz installer menu. This was much easier than expected. Even tho many documentations seems outdated.
Next thing will be unattended installations. Ubuntu switched from preseed to autoinstall which is basically cloud-init which looks promissing.
- OpenWRT tftp pxe user guide
- netboot.xyz OpenWRT dhcp config
- Latest netboot.xyz legacy boot image
- Latest netboot.xyz efi boot image
The OpenWRT tftp pxe user guide seems outdated