[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