iPXE on Dell C6100 (BIOS Mod)

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.

One Reply to “iPXE on Dell C6100 (BIOS Mod)”

  1. Pingback: Dell C6100 XS23-TY3 2U 4-Node (8 CPU) Cloud Server - Page 43

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.