Scripting remote BIOS upgrades & changes on Supermicro
-
I've been looking for a way to change BIOS settings, do BIOS upgrades, change BMC settings etc remotely using scripts on Supermicro servers.
You can always do it remotely out-of-band (IPMI/KVM), rebooting into BIOS, change settings etc. But that's a manual process and it's very time consuming and boring when you have many servers.
To do it from the shell you need the Supermicro Update Manager (SUM). It also uses the out-of-band management controller but without all the manual work. You don't need to install anything on the target server itself and it doesn't even need an OS installed or even be running. It works on servers from the X9 generation and forward, so everything made the last 10 years or so.
For example to read all the BIOS settings on a remote server:
sum -i <remote_server_ip> -u <user_name> -p <password> -c GetCurrentBiosCfg
Will give an output like:
[Advanced|Boot Feature] Quiet Boot=01 // Please enter the value in 2 hexadecimal digits. Default value is <<<01>>> AddOn ROM Display Mode=01 // 00 (Keep Current), *01 (Force BIOS) Bootup Num-Lock=01 // 00 (Off), *01 (On) Wait For "F1" If Error=01 // 00 (Disabled), *01 (Enabled) Interrupt 19 Capture=01 // 00 (Disabled), *01 (Enabled) Re-try Boot=00 // *00 (Disabled), 01 (Legacy Boot), 02 (EFI Boot) Watch Dog Function=00 // *00 (Disabled), 01 (Enabled) Power Button Function=00 // *00 (Instant Off), 01 (4 Seconds Override) Restore on AC Power Loss=00 // 00 (Stay Off), 01 (Power On), *02 (Last State) [Advanced|CPU Configuration] Clock Spread Spectrum=00 // *00 (Disabled), 01 (Enabled) RTID=00 // *00 (Optimal), 01 (Alternate) Hyper-threading=01 // 00 (Disabled), *01 (Enabled) Limit CPUID Maximum=00 // *00 (Disabled), 01 (Enabled) Execute Disable Bit=01 // 00 (Disabled), *01 (Enabled) Intel(R) AES-NI=01 // 00 (Disabled), *01 (Enabled) MLC Streamer Prefetcher=01 // 00 (Disabled), *01 (Enabled) MLC Spatial Prefetcher=01 // 00 (Disabled), *01 (Enabled) DCU Streamer Prefetcher=01 // 00 (Disabled), *01 (Enabled) DCU IP Prefetcher=01 // 00 (Disabled), *01 (Enabled) Intel Virtualization Technology=01 // 00 (Disabled), *01 (Enabled) [Advanced|CPU Configuration|CPU Power Management Configuration] Power Technology=03 // 00 (Disable), *01 (Energy Efficient), 02 (Custom), 03 (Max Performance) EIST=01 // 00 (Disabled), *01 (Enabled) Power Technology = "Custom" Turbo Mode=01 // 00 (Disabled), *01 (Enabled) Power Technology = "Custom" and EIST = "Enabled" C1E Support=01 // 00 (Disabled), *01 (Enabled) Power Technology = "Custom" CPU C3 Report=00 // *00 (Disabled), 01 (Enabled) Power Technology = "Custom" CPU C6 Report=01 // 00 (Disabled), *01 (Enabled) Power Technology = "Custom" CPU C7 Report=01 // 00 (Disabled), *01 (Enabled) Power Technology = "Custom" Package C State limit=06 // 00 (C0), 01 (C2), *06 (C6), FF (No Limit) Power Technology = "Custom" Energy/Performance Bias=00 // 00 (Performance), *07 (Balanced Performance), 0B (Balanced Energy), 0F (Energy Efficient) [Advanced|Chipset Configuration|North Bridge|Integrated IO Configuration] Intel(R) VT-d=01 // 00 (Disabled), *01 (Enabled) Ageing Timer Rollover=02 // 00 (Disabled), 01 (32 us), *02 (128 us), 03 (512 us) Intel(R) I/OAT=01 // 00 (Disabled), *01 (Enabled) DCA Support=01 // 00 (Disabled), *01 (Enabled) MMCFG BASE=00 // *00 (0x80000000), 01 (0x90000000), 02 (0xA0000000), 03 (0xB0000000), 04 (0xC0000000), 05 (0xD0000000), 06 (0xE0000000) IOU1_1 - PCIe Port=00 // *00 (x4x4), 01 (x8) PCH Upstream Link Speed=00 // *00 (GEN1), 01 (GEN2), 02 (GEN3) i350 Lan Link Speed=01 // 00 (GEN1), *01 (GEN2), 02 (GEN3) IOU1_2 - PCIe Port=05 // 00 (x4x4x4x4), 01 (x4x4x8), 02 (x8x4x4), 03 (x8x8), 04 (x16), *05 (Auto) SXB1 Link Speed=02 // 00 (GEN1), 01 (GEN2), *02 (GEN3) PORT 1_2C Link Speed=02 // 00 (GEN1), 01 (GEN2), *02 (GEN3) IOU1_3 - PCIe Port=03 // 00 (x4x4x4x4), 01 (x4x4x8), 02 (x8x4x4), *03 (x8x8), 04 (x16) SXB2 Link Speed=02 // 00 (GEN1), 01 (GEN2), *02 (GEN3) Onboard IB Link Speed=02 // 00 (GEN1), 01 (GEN2), *02 (GEN3) IOU2_2 - PCIe Port=04 // 00 (x4x4x4x4), 01 (x4x4x8), 02 (x8x4x4), 03 (x8x8), *04 (x16) SXB3 Link Speed=02 // 00 (GEN1), 01 (GEN2), *02 (GEN3) IOU2_3 - PCIe Port=05 // 00 (x4x4x4x4), 01 (x4x4x8), 02 (x8x4x4), 03 (x8x8), 04 (x16), *05 (Auto) etc etc
To change a setting you would create a file with the settings you like to change.
For example:[Advanced|Boot Feature] Restore on AC Power Loss=02
Then execute with:
sum -i <remote_server_ip> -u <user_name> -p <password> -c ChangeBIOScfg --file <new_settings_file>
The server will pick up the changed settings on the next reboot or power cycle.
Download the tool here:
https://www.supermicro.com/en/support/resources/downloadcenter/smsdownloadThe software is free but you need the license SFT-OOB-LIC for some of the functionality. You will also need this license if you want to update the BIOS remotely fully manual as well. The license is about $20 per physical server and it's just a code you enter into the BIOS once to unlock the functionality forever.
A Supermicro video that shows you some examples:
Youtube Video