A Lua script for syslinux' lua.c32 comboot module that uses DMI data to decide between localboot / chainloading.
We use PXELINUX in our product to show a boot menu on client computers, with options like "Boot from local hard disk", "Install Windows", etc. Unfortunately, a lot of computers seem to have broken BIOSes and won't boot with the LOCALBOOT command, and need to be booted with chain.c32 instead. We also have encountered some computers where it works only the other way - chainloading does not work, while LOCALBOOT works fine.
To solve this issue, we have written this Lua script that uses the DMI data of the computer to decide whether it should be booted with LOCALBOOT or chain.c32. The scripts defaults to LOCALBOOT, but has a list of exceptions for computers that require chainloading.
Tested with PXELINUX 4.05 and PXELINUX 6.03.
pxelinux.cfg, and change the existing
LOCALBOOTcommand to the following:
kernel lua.c32 append localboot.lua
You can optionally use the provided
debug.lua script to collect the necessary
data for new exceptions. It will print the most relevant DMI data:
When one of your users encounters a computer that won't boot, you can instruct
them to boot
debug.lua and send you a photo of the output.
Add an exception
To add the exception to the script, duplicate one of the
elseif blocks and
modify the string matches and the descriptive comment. Note that string matches
are case sensitive and have to be exact. Look out for trailing spaces too -
some manufacturers use fixed string lengths and pad their strings with spaces,
e.g. "Acer ". If you're copying the data from a
screenshot, be sure to count these spaces carefully.
Usually what you want to match is either
system.product_name for OEM computers:
sm == "Acer" and sp == "Aspire 3750"
base_board.product_name for custom built
bm == "Gigabyte Technology Co., Ltd." and bp == "B75M-D3H"
After you have confirmed that the exception works, please consider to file a bug or to send a pull request so that everyone benefits of your improvement.