If you need to upgrade the bios firmware of a Dell system (to fix some bugs or add some enhancements, etc.) and you are not running Windows or RHEL (the systems Dell is officially supporting and providing upgrading solutions) there is still hope. I used to manage some Dell’s running RHEL and I loved how easy it was to run all the firmware updates released by Dell for RHEL. I always hoped that there will be some a solution for Debian also. And the solution exists, and I will exemplify it bellow by updating the bios of a Dell PowerEdge SC1435 system.
NOTE: as always when doing things like BIOS upgrade be extremely careful and don’t proceed with it if you are not sure what (or why) you are doing it. If something wrong happens and the BIOS update is broken it can make your system unusable. If unsure, check with your Dell support representative before doing this.
Ok, here is the summary of the actions needed:
- we need the libsmbios package installed
- we need to get the bios update file
- we will perform the update and reload the system for this to take place.
1. Install the libsmbios package.
This step is easy as it is packaged in the debian repository and we can install it with:
aptitude install libsmbios-bin libsmbios1 libsmbiosxml1
There are several binaries installed by libsmbios-bin:
dpkg -L libsmbios-bin /. /usr /usr/bin /usr/sbin /usr/sbin/activateCmosToken /usr/sbin/ascii2enUS_scancode /usr/sbin/assetTag /usr/sbin/createUnitTestFiles <strong>/usr/sbin/dellBiosUpdate</strong> /usr/sbin/dellLcdBrightness /usr/sbin/disable_console_redir /usr/sbin/dumpCmos /usr/sbin/dumpSmbios /usr/sbin/getPasswordFormat <strong>/usr/sbin/getSystemId</strong> /usr/sbin/isCmosTokenActive /usr/sbin/probes /usr/sbin/propertyTag /usr/sbin/serviceTag /usr/sbin/smitest /usr/sbin/stateByteCtl /usr/sbin/sysid /usr/sbin/tokenCtl /usr/sbin/upBootCtl /usr/sbin/verifySmiPassword /usr/sbin/wakeupCtl
We will be using getSystemId to get the system ID and dellBiosUpdate to perform the actual update.
2. Download the BIOS update file
We can see in the Dell support site that there is a new bios update version, but the files are not in the format we need… We first need to find out the system id. For this we run getSystemID and the output in my example is:
getSystemId Libsmbios: 0.12.1 System ID: 0x01EB Service Tag: xxx Express Service Code: xxx Product Name: PowerEdge SC1435 BIOS Version: 1.0.0 Vendor: Dell Inc. Is Dell: 1
We can also see the running bios version. In this case it is v1.0.0 that is quite old and as we can see in the Dell support site there is a newer version 1.1.2 released on 4/10/2007 that brings some significant improvements. Now where can we find the bios update file in a format we can actually use? We have go to http://linux.dell.com/repo/firmware/bios-hdrs/ and search after our system ID. In my case this returned two bios files:
Note: as you can see these are in the format: system_bios_ven_0x1028_dev_SYSTEM_ID_version_BIOS_VERSION. You need to have the proper system ID for this (not sure what would happen if you try with a different system bios as I was not curious enough to try this out :-) ).
From the appropriate folder download the bios.hdr file. In my case this was:
3. Perform the BIOS update
We will need first to load a kernel module (dell_rbu) that is required by libsmbios for BIOS updates. This exists in debian default kernels (if you are running a vanilla kernel you only need to compile it as a module as it is included in the standard linux kernel starting with Linux 2.6.14):
(you will not see any output if all is ok). You can check if this was really successful by running lsmod and you should see the module loaded:
lsmod Module Size Used by dell_rbu 13088 0 firmware_class 15616 1 dell_rbu ...
And finally we need to run:
dellBiosUpdate -u -f bios.hdr
(this from the location you downloaded the bios.hdr file; else add the full path to the bios.hdr file)
The output will look like:
dellBiosUpdate -u -f bios.hdr WARNING: packet updates are not fully tested yet for packet modes v0/v2. We recommend that only monlithic updates be used at this point. You should only use packet mode on v0/v2 systems if you know what you are doing (for example, testing.) Forcing MONOLITHIC mode... Supported RBU type for this system: (MONOLITHIC, PACKET) Using RBU v2 driver. Initializing Driver. Setting RBU type in v2 driver to: MONOLITHIC (FORCED) Prep driver for data load. Writing RBU data (4096bytes/dot): ................................................................................................................................................................................................................................................................. Notify driver data is finished. Activate CMOS bit to notify BIOS that update is ready on next boot. Update staged sucessfully. BIOS update will occur on next reboot.
That’s it. You need to reboot your system in order to complete this. Once the system is rebooted it will first perform the bios update and then continue to load the system.
After the reboot my example system was showing:
getSystemId Libsmbios: 0.12.1 System ID: 0x01EB Service Tag: xxx Express Service Code: xxx Product Name: PowerEdge SC1435 BIOS Version: 1.1.2 Vendor: Dell Inc. Is Dell: 1
Conclusion: hopefully other debian/ubuntu users will find this information useful while running Debian on Dell systems. Personally, I have seen one other method described by Felix Schwarz in his doc “Flashing a Dell Bios with Linux” but this will require to boot using a boot floppy image to flash the bios and normally this will require direct access to the system or at least a remote console. The above method can be performed remotely and doesn’t require anything special besides a ssh connection.