Flashing the IPMI firmware on a Supermicro X9DRW-iF

I recently tasked myself with bringing IPMI up to date on a Supermicro X9DRW-iF server. This can be quite dangerous, as a bad IPMI flash can break IPMI in a way that requires you end up having to mail your hardware (RMA) to Supermicro to get it re-flashed. As such, I’m not hugely fond of doing these sorts of things through the IPMI web interface, as it depends on all network connections between your computer and the server working properly. What’s more, the web interface doesn’t give you much in the way of feedback during the firmware upgrade process. Today, we’ll be stepping through what I have found to be the most stable way of flashing the IPMI firmware on an X9DRW-iF. We’ll be doing so from an OS that is installed on the hardware itself — in our case from CentOS 6.6 64-bit (Note: this would work just fine in RHEL, and would very likely work on a Debian-based OS like Ubuntu Server as well).

Here are the details:

Server: Supermicro X9DRW-iF
OS: CentOS 6.6 x86_64
Files needed: SMM_X9_2_59.zip – Supermicro IPMI Firmware (when newer versions are available they can be found at http://www.supermicro.com/support/bios/

Preparing

First, we copy the firmware to the root home directory on the server using SCP:

[you@your_workstation]$ scp SMM_X9_2_59.zip root@server:~

Then, we SSH to the server:

[you@your_workstation]$ ssh root@server

Once on the server, we install unzip and ipmitool. unzip is used to extract the zip file, and ipmitool is used to verify it is properly installed (and to configure IPMI) when we’re finished flashing the IPMI firmware:

[root@server]$ yum install unzip ipmitool

As another step in preparation, we can start the ipmi service:

[root@server]$ /etc/init.d/ipmi restart

Then we create a directory to work in, move the Supermicro IPMI firmware zip file to this directory, unzip this file, and change to this directory:

[root@server]$ mkdir ~/tmp && mv SMM_X9_2_59.zip ~/tmp/ && unzip ~/tmp/SMM_X9_2_59.zip && cd ~/tmp/Linux_x86_64/

Comparing the existing firmware to the new firmware

Now, we run the firmware update tool with the -info option to compare the current IPMI firmware to our new firmware (without updating). This is useful to make sure we aren’t flashing the same version we already have installed. In this example, the old version is 1.10 and the new version is 2.59. Note: You’ll notice I include LD_LIBRARY_PATH=. in the command. This is because the RLin64Flsh utility depends on libipmi.so.1, which is contained in the same directory as RLin64Flsh. By setting LD_LIBRARY_PATH to the current directory ., we tell the system that this is where RLin64Flsh can find libipmi.so.1.:

[root@server Linux_x86_64]# LD_LIBRARY_PATH=. ./RLin64Flsh -cd -info ../SMM_X9_2_59.ima
-------------------------------------------------
YAFUFlash - Firmware Upgrade Utility (Version 2.9)
-------------------------------------------------
(C)Copyright 2008, American Megatrends Inc.
Creating IPMI session via USB...Done
===============================================================================
Firmware Details
===============================================================================
RomImage ExistingImage from Flash

ModuleName Description Version ModuleName Description Version
1. boot BootLoader 0.2 boot BootLoader 0.1
2. pcie 0.1 pcie 0.1
3. conf ConfigParams 0.1 conf ConfigParams 0.1
4. bkupconf 1.2 bkupconf 1.2
5. root Root 0.1 root Root 0.1
6. osimage Linux OS 0.6 osimage Linux OS 0.6
7. www Web Pages 0.6 www Web Pages 0.6
8. rainier 2.59 rainier 1.10

Flashing the firmware

When we’re sure we’re ready to proceed with the firmware flash, we run the following (and choose Y when prompted to Update UBOOT):

[root@server Linux_x86_64]# LD_LIBRARY_PATH=. ./RLin64Flsh -cd ../SMM_X9_2_59.ima
-------------------------------------------------
YAFUFlash - Firmware Upgrade Utility (Version 2.9)
-------------------------------------------------
(C)Copyright 2008, American Megatrends Inc.

Creating IPMI session via USB...Done
UBOOT Versions is different Updating of UBOOT is recommended
So,Type (Y/y) to Update UBOOT
or (N/n) to Skip
Enter your Option : Y

****************************************************************************
WARNING!
FIRMWARE UPGRADE MUST NOT BE INTERRUPTED ONCE IT IS STARTED.
PLEASE DO NOT USE THIS FLASH TOOL FROM THE REDIRECTION CONSOLE.
****************************************************************************
Preserving Env Variables... done
Uploading Firmware Image : 100%... done
Flashing Firmware Image : 100%... done
Verifying Firmware Image : 100%... done
Setting Env variables ...          done
Resetting the firmware..........
[root@server Linux_x86_64]#

Verifying the job

After the firmware has been flashed and verified by the RLin64Flsh utility, we are dropped back to our shell prompt, where we can verify the new firmware is in place ourselves by running the below ipmitool command. It should return a Firmware Revision that matches what we just updated to. For example:

[root@server Linux_x86_64]# ipmitool mc info 1 | grep 'Firmware Revision'
Firmware Revision         : 2.59

To finish the job, reboot the server by running reboot now. Then it’s time for us to configure the IPMI web interface using ipmitool. Here’s a cheat sheet to help you along with this.

Configuring IPMI using ipmitool

Set the IPMI interface to be static (as opposed to the default, which is DHCP). This typically needs to be done first before IPMI will allow you to set a static IP:

[root@server Linux_x86_64]# ipmitool lan set 1 ipsrc static

Set the IP address of the IPMI network interface. In this example, we set it to 192.168.1.30, but you should choose this IP based on your network configuration. Many engineers choose to build a separate network just for IPMI interfaces, separate from their normal traffic:

[root@server Linux_x86_64]# ipmitool lan set 1 ipaddr 192.168.1.30

Set the subnet mask of the IPMI network interface. In this example, we set it to 255.255.255.0, also known as a Class C or /24 (pronounced, “slash twenty four”) subnet mask:

[root@server Linux_x86_64]# ipmitool lan set 1 netmask 255.255.255.0

Set the gateway address for the IPMI network interface. In this example, we set it to 192.168.1.1:

[root@server Linux_x86_64]# ipmitool lan set 1 defgw ipaddr 192.168.1.1

Setting these three values should be enough to allow you to access the IPMI web interface at the IP address specified (in our example, 192.168.1.30). The username and password should be set to the default of Username: ADMIN, Password: ADMIN. For security reasons you should change this as soon as possible. This can be done via the IPMI web interface or using ipmitool. For example:

# Print a list of IPMI users, along with their ID numbers, which are used to reference them in subsequent ipmitool commands
[root@server Linux_x86_64]# ipmitool user list 1
ID  Name	     Callin  Link Auth	IPMI Msg   Channel Priv Limit
1                    false   false      true       NO ACCESS
2   ADMIN            false   false      true       ADMINISTRATOR
# Set a password for the ADMIN user (ID 2)
[root@server Linux_x86_64]# ipmitool user set password 2 myamazingpassword
# Verify that the setting worked. If it succeeds it will look like this:
[root@server Linux_x86_64]# ipmitool user test 2 16 myamazingpassword
Success
# ... If it fails, it will look like this:
[root@server Linux_x86_64]# ipmitool user test 2 16 myamazingpassword
Set User Password command failed (user 2): Unknown (0x80)
Failure: password incorrect

This newly-set password can then be used to access the IPMI web interface with the ADMIN username.

Colophon

I hope this has been a helpful and interesting post. This process should work just as well on a 32-bit operating system. Just substitute RLin32Flsh for RLin64Flsh, and Linux_x86_32 for Linux_x86_64 anywhere you see it in the above tutorial. As always, questions are more than welcome in the comments section. I’ll do my best to answer each and every one. Thanks for reading!

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *