[syslinux] PXE-on-a-disk Intel EM64T reboot

Josh Lehan jlehan at scyld.com
Fri Dec 2 13:07:11 PST 2005


Hello!  I have been successful using SYSLINUX and Etherboot to create a 
generic "PXE-on-a-disk" package, a floppy image and CD image that 
support as many Ethernet cards as possible.

These have support for all of Etherboot's modules that support real PCI 
cards: about 25-or-so drivers and 250-or-so cards.  I've built Etherboot 
ZLILO images, one for each driver, set up to boot as a PXE stack.  I've 
used "ethersel.c32" to choose the correct image for each detected PCI 
card, and it seems to work.

I made a fairly straightforward Perl script to take Etherboot's internal 
PCI device table and munge that into a fairly large SYSLINUX config file 
that is scanned by ethersel.  I've tested it on a fair variety of 
different hardware and it works!  It auto-detects the correct driver to 
load, without user interaction, and behaves just as a PXE BIOS would.

A limitation is that it will only work with the "first" card detected by 
ethersel.  In a situation where 2 PCI cards are installed, both from 
different drivers (for example, one 3com and one Intel), only one of 
them will work.  I was pleased to see that Etherboot can work with 
multiple copies of the same card, though, trying each in a round-robin 
fashion.

I'd love it if the Etherboot module could somehow "return" to SYSLINUX, 
instead of rebooting the entire machine or trying forever in a loop, if 
there is a problem/timeout.  Then, ethersel could have the chance of 
detecting another PCI card in the system, and continue trying with that. 
  Then, it would work even in systems with multiple PCI cards from 
different vendors.  However, that's an Etherboot question, not a 
SYSLINUX question, so I won't continue with it here.

I use PXELINUX as my bootloader (of course), and have my TFTP and DHCP 
server set up and working correctly to serve it, and a Linux kernel/initrd.

The flow of control:

Boot
--> SYSLINUX (or ISOLINUX if CD)
--> ethersel (detect PCI card and choose Etherboot kernel)
--> Back to SYSLINUX (load and run Etherboot kernel)
--> Etherboot (PXE stack, download of PXELINUX)
--> PXELINUX (downloaded from server and ran, downloads Linux kernel)
--> Linux

Kind of convoluted, but it works nicely!

My main problem is on the Intel EM64T (Intel's clone of AMD's 64-bit x86 
architecture).

Right after SYSLINUX prints the final "Ready." line, it reboots!

I see the kernel and initrd downloaded correctly by TFTP.  There were no 
errors.  However, instead of getting the normal kernel startup text 
after SYSLINUX's final "Ready." line, I get an immediate reboot!

Yes, I'm downloading an Intel EM64T kernel, not an AMD64 kernel.

Yes, the kernel boots fine when loaded from other means (local hard 
disk, for instance).  For testing, I tried enabling the motherboard's 
on-board PXE BIOS for booting, and it worked.  So, the problem seems to 
be in some difference between my Etherboot-created software PXE stack, 
and the BIOS's real PXE stack.

Are there any known issues with the final handoff phase from 
SYSLINUX/Etherboot/PXELINUX to the kernel, on Intel EM64T machines?

Anything I can do to help troubleshoot this?  At first, I had a feeling 
it has something to do with freeing the PXE stack in memory (from 
Etherboot), but since it works on other AMD64 machines and all 32-bit 
machines I have found, I don't think this would be the problem.

I'll post this to the Etherboot list as well, but thought I'd also 
mention it here, in hopes that someone else has seen this before (since 
a universal "PXE-on-a-disk" boot floppy/CD image is quite useful, and 
seems to be the killer app for Etherboot these days).

Josh




More information about the Syslinux mailing list