Thanks to Andrew for his help. Here is a complete summary of the problem and solution for the benefit of the mailing list archives. --
PROBLEM: I have a legacy PXE (DHCP/TFTP) environment in which I'm booting nodes both via SYSLINUX (pxelinux.0) for diagnostics boots and PXEGRUB (nbp.SUNW.i86pc) to boot Solaris. I'm tired of switching between these manually and instead want an programatic method. DHCP tricks via execute() scripts in dhcpd.conf calling 'omshell' to change records sucks. gPXE offers a solution, but gPXE scripts from HTTP interpret "chain pxelinux.0" instead as "chain http://${next-server}/pxelinux.0", which fails of course. How do I explicitly use TFTP even from an HTTP gPXE boot script? SOLUTION: Use the (poorly or not documented) "tftp://server/path" URI syntax in your gPXE scripts. Do not assume that paths not prefixed with "http://" are interpreted as TFTP as has been oft stated. Additionally, clear "net0.dhcp/filename", as this can be passed to other bootloaders and do things you don't expect. DETAIL: I'm currently testing with the gPXE 1.0.0 undi-only kpxe image from (the awesome) rom-o-matic.net. Here is the applicable dhcpd.conf setup: group "gpxe" { next-server 192.168.100.20; if exists user-class and option user-class = "gPXE" { filename "http://192.168.100.20/boot.gpxe"; } else { filename "gpxe-1.0.0-undionly.kpxe"; # ROM-O-MATIC 1.0.0 } } host test710 { hardware ethernet XX:XX:XX:XX:DD:75; #obscured for this mail, just because. fixed-address 192.168.100.101; group "gpxe"; } Here is the content of http://192.168.100.20/boot.gpxe: #!gpxe imgfree clear net0.dhcp/filename # If this isn't cleared, PXELINUX will pick it up as the configuration path prefix. clear filename # This should be cleared by the previous line, but clear this too for good measure echo echo Hello ${manufacturer} ${product} ${serial} echo chain http://${next-server}/${serial}.gpxe This is currently my pre-CGI test setup, so it redirect the client to a static gpxe script. Eventually this will instead be PHP, but here is my script for the test node, xxxxxxx.gpxe: #!gpxe echo echo Attempting to load PXEGRUB (Solaris) echo set 150:string menu.lst.TEST # Set this if you want a non-default menu.lst for PXEGRUB chain tftp://${next-server}/nbp.SUNW.i86pc #echo #echo Attempting to load SYSLINUX (DTK) #echo #chain tftp://${next-server}/pxelinux.0 And thats it! Uncomment the first block and I boot into PXEGRUB, uncomment the second block for PXELINUX. SOFTWARE: For the curious, I'm doing this on OpenSolaris with gPXE 1.0.0, ISC DHCP 4.1.1-P1, Solaris TFTP, GNU GRUB 0.97 (included with OpenSolaris), and PXELINUX 3.63 ( which I ripped out of Debian-2008-07-15). Big thanks to everyone at Etherboot for such an awesome tool and the gPXE community for helping out us n00bs. benr. _______________________________________________ gPXE mailing list gPXE@etherboot.org http://etherboot.org/mailman/listinfo/gpxe