Updating BIOS automatically with PXE and FreeDOS
To update the BIOS on all machines, the easiest thing to do is create a bootable disk that runs the flasher and reboots. We can load this all up over the network via PXE and re-flash a whole hoard of nodes in one go.
Since the X8SIT BIOS image is about 4MB uncompressed, it won't fit on a floppy in that form. Fortunately, however, the zipped file is much smaller, so we can use a 2.88MB boot disk that contains unzip.exe and the flashing utility. We then create a ram disk, unzip the new bios there, and run. Making our own boot disks is a bit of a chore, but fortunately some other enterprising folks did this already for their cluster:
http://www.lsc-group.phys.uwm.edu/beowulf/nemo/construction/BIOS-imaging.html
We'll just use that image and modify the contents to suit our needs.
Steps:
Grab the http://www.lsc-group.phys.uwm.edu/beowulf/nemo/construction/BIOS/Nemo-node-config.img FreeDOS 2.88MB bootable floppy image.
Mount it (mount -o loop node-config.img /mnt)
Copy the bios zip file to /mnt
Edit config.sys to create a larger ramdisk (8192KB is fine for our machines)
Edit autoexec.bat to copy/extract the right files to the ramdisk and call the right bios flashing script.
Add a pxelinux config file that loads and runs the boot disk (via memdisk)
Below is an example boot disk for our X8SIT supermicro servers that updates to bios rev 1.2.
The boot disk (x8sit_1.2bios_updater.img) contains:
TDSK.EXE
X8SIT1.C22.zip
autoexec.bat
command.com
config.sys
fdxms.sys
kernel.sys
set.img
setboot.exe
shutdown.com
unzip.exe
config.sys contains:
DEVICE=FDXMS.SYS
DEVICE = TDSK.EXE 8192
autoexec.bat contains:
@echo off
PROMPT $P$G
VERIFY ON
BREAK ON
SET RAMDRIVE=C:
echo Running setboot.exe
setboot.exe
COPY *.ZIP C:\
echo Copying unzip.exe to c:
COPY unzip.exe c:\
echo CWD c:
c:
echo Unpacking *.zip
unzip -x *.zip
echo Flashing Bios
CALL ami.bat X8SIT1.C22
a:
shutdown.com R
The TFTP server's pxelinux config is as follows:
default x8sit-bios-update
label x8sit-bios-update
kernel memdisk
append initrd=x8sit_1.2bios_updater.img floppy raw