First problem. The default ROM file is about 68KB when compiled. This unfortunately is too big. We have a limit of 64KB in the BIOS file so to shrink our file, we’re gonna have to cut some features out of the ROM. To do this, we need to edit the general.h file to remove some item definitions.
[root@localhost ~] vi config/general.h
Through a lot of trial and error I was able to shrink the file down to just under 64K. Unfortunately a lot of features had to be disabled for this to work, but the core functionality is still there. Gone are Wireless Boot (duh), HTTP/FTP/NFS boot. Infiniband protocol, FCoE and the GUI console.
The following features are left behind: iSCSI, DNS, TFTP, AoE, VLAN, bzImage, ELF, MBOOT, PXE, PXEXT and Menu
This is my copy of the general.h file after all the unnecessary features have been trimmed.
#ifndef CONFIG_GENERAL_H
#define CONFIG_GENERAL_H
/** @file
*
* General configuration
*
*/
FILE_LICENCE ( GPL2_OR_LATER );
#include
/*
* Branding
*
* Vendors may use these strings to add their own branding to iPXE.
* PRODUCT_NAME is displayed prior to any iPXE branding in startup
* messages, and PRODUCT_SHORT_NAME is used where a brief product
* label is required (e.g. in BIOS boot selection menus).
*
* To minimise end-user confusion, it's probably a good idea to either
* make PRODUCT_SHORT_NAME a substring of PRODUCT_NAME or leave it as
* "iPXE".
*
*/
#define PRODUCT_NAME "iPXE for C6100 by Tom Heiber https://copyerror.com (2013-08-24) v1.02"
#define PRODUCT_SHORT_NAME "ARiPXE"
/*
* Timer configuration
*
*/
#define BANNER_TIMEOUT 40 /* Tenths of a second for which the shell
banner should appear */
/*
* Network protocols
*
*/
#define NET_PROTO_IPV4 /* IPv4 protocol */
#undef NET_PROTO_FCOE /* Fibre Channel over Ethernet protocol */
/*
* PXE support
*
*/
//#undef PXE_STACK /* PXE stack in iPXE - you want this! */
//#undef PXE_MENU /* PXE menu booting */
/*
* Download protocols
*
*/
#define DOWNLOAD_PROTO_TFTP /* Trivial File Transfer Protocol */
#undef DOWNLOAD_PROTO_HTTP /* Hypertext Transfer Protocol */
#undef DOWNLOAD_PROTO_HTTPS /* Secure Hypertext Transfer Protocol */
#undef DOWNLOAD_PROTO_FTP /* File Transfer Protocol */
#undef DOWNLOAD_PROTO_SLAM /* Scalable Local Area Multicast */
#undef DOWNLOAD_PROTO_NFS /* Network File System Protocol */
/*
* SAN boot protocols
*
*/
#define SANBOOT_PROTO_ISCSI /* iSCSI protocol */
#define SANBOOT_PROTO_AOE /* AoE protocol */
#undef SANBOOT_PROTO_IB_SRP /* Infiniband SCSI RDMA protocol */
#undef SANBOOT_PROTO_FCP /* Fibre Channel protocol */
/*
* 802.11 cryptosystems and handshaking protocols
*
*/
#undef CRYPTO_80211_WEP /* WEP encryption (deprecated and insecure!) */
#undef CRYPTO_80211_WPA /* WPA Personal, authenticating with passphrase */
#undef CRYPTO_80211_WPA2 /* Add support for stronger WPA cryptography */
/*
* Name resolution modules
*
*/
#define DNS_RESOLVER /* DNS resolver */
/*
* Image types
*
* Etherboot supports various image formats. Select whichever ones
* you want to use.
*
*/
//#define IMAGE_NBI /* NBI image support */
//#define IMAGE_ELF /* ELF image support */
//#define IMAGE_MULTIBOOT /* MultiBoot image support */
//#define IMAGE_PXE /* PXE image support */
//#define IMAGE_SCRIPT /* iPXE script image support */
//#define IMAGE_BZIMAGE /* Linux bzImage image support */
//#define IMAGE_COMBOOT /* SYSLINUX COMBOOT image support */
//#define IMAGE_EFI /* EFI image support */
//#define IMAGE_SDI /* SDI image support */
/*
* Command-line commands to include
*
*/
#define AUTOBOOT_CMD /* Automatic booting */
#define NVO_CMD /* Non-volatile option storage commands */
#undef CONFIG_CMD /* Option configuration console */
#define IFMGMT_CMD /* Interface management commands */
#undef IWMGMT_CMD /* Wireless interface management commands */
#undef FCMGMT_CMD /* Fibre Channel management commands */
#undef ROUTE_CMD /* Routing table management commands */
#define IMAGE_CMD /* Image management commands */
#define DHCP_CMD /* DHCP management commands */
#define SANBOOT_CMD /* SAN boot commands */
#define MENU_CMD /* Menu commands */
#undef LOGIN_CMD /* Login command */
#define SYNC_CMD /* Sync command */
//#define NSLOOKUP_CMD /* DNS resolving command */
//#define TIME_CMD /* Time commands */
//#define DIGEST_CMD /* Image crypto digest commands */
//#define LOTEST_CMD /* Loopback testing commands */
#define VLAN_CMD /* VLAN commands */
//#define PXE_CMD /* PXE commands */
//#define REBOOT_CMD /* Reboot command */
//#define POWEROFF_CMD /* Power off command */
//#define IMAGE_TRUST_CMD /* Image trust management commands */
//#define PCI_CMD /* PCI commands */
//#define PARAM_CMD /* Form parameter commands */
/*
* ROM-specific options
*
*/
#undef NONPNP_HOOK_INT19 /* Hook INT19 on non-PnP BIOSes */
/*
* Error message tables to include
*
*/
#undef ERRMSG_80211 /* All 802.11 error descriptions (~3.3kb) */
/*
* Obscure configuration options
*
* You probably don't need to touch these.
*
*/
#define NETDEV_DISCARD_RATE 0 /* Drop every N packets (0=>no drop) */
#undef BUILD_SERIAL /* Include an automatic build serial
* number. Add "bs" to the list of
* make targets. For example:
* "make bin/rtl8139.dsk bs" */
#undef BUILD_ID /* Include a custom build ID string,
* e.g "test-foo" */
#undef NULL_TRAP /* Attempt to catch NULL function calls */
#undef GDBSERIAL /* Remote GDB debugging over serial */
#undef GDBUDP /* Remote GDB debugging over UDP
* (both may be set) */
#include
#endif /* CONFIG_GENERAL_H */
Now we need to create a script that will execute automatically on iPXE boot. Again, through a lot of trial and error (and about 15 reflashes of the C6100) I came up with this:
Features:
- Ability to skip the iPXE boot
- Manual override
- Redundant loading. NIC1 can load either NIC1 or NIC2 file and NIC2 can load either NIC1 or NIC2 file
- Global UUID file loading
- DNS based TFTP location so it’ll be easy to move without requiring re-flash
To create a script simply create a new file and define the custom script
[root@localhost ~] vi config.ipxe
My script file is as follows
#!ipxe
#print current UUID for reference
echo UUID: ${uuid}
#allow user to abort the script
prompt --key 0x1b --timeout 3000 Press ESC to skip iPXE boot... && exit ||
#prompt for shell mode
prompt --key 0x02 --timeout 2000 Press Ctrl-B for the iPXE shell... || goto no_shell
shell
exit
#attempt load from interface 1
:no_shell
echo Starting Network on net0
dhcp net0 || dhcp net0 || dhcp net0 || goto no_net0
set net0_up 1
goto load_net0
exit
#attempt load from interface 2
:no_net0
echo Starting Network on net1
dhcp net1 || dhcp net1 || dhcp net1
set net1_up 1
goto load_net0
exit
#load from TFTP for first interface
:load_net0
isset ${net0_up} && echo Connecting to TFTP: tftp://ipxehost/${net0/mac:hexhyp}.ipxe && chain tftp://ipxehost/${net0/mac:hexhyp}.ipxe || goto load_net1
exit
#load from TFTP for second interface
:load_net1
#attempt to load net0 image first
isset ${net0_up} && goto load_uuid #we simply failed to find MAC.ipxe
isset ${net1_up} && echo Connecting to TFTP: tftp://ipxehost/${net0/mac:hexhyp}.ipxe && chain tftp://ipxehost/${net1/mac:hexhyp}.ipxe ||
#screw it, load net1 image next
isset ${net1_up} && echo Connecting to TFTP: tftp://ipxehost/${net1/mac:hexhyp}.ipxe && chain tftp://ipxehost/${net1/mac:hexhyp}.ipxe || goto load_uuid
exit
#alternatively load by UUID
:load_uuid
#are we even connected?
isset ${net0_up} || isset ${net1_up} || exit #no connection, abort all
echo MAC image not found....
echo Attempting to load from UUID ${uuid}
chain tftp://ipxehost/${uuid}.ipxe
STOP: At this point you must verify that the bin/808610c9.bin file is under 64K! If the file is too big, more features will have to be removed from the general.h file.
Pingback: Dell C6100 XS23-TY3 2U 4-Node (8 CPU) Cloud Server - Page 43