Know Your Surroundings: SMBIOS

Posted on August 22, 2009

Some time ago I discussed The Joy of IPMI. IPMI is a handy want of interacting with the Baseboard Management Controller (BMC) on enterprise class systems to retrieve information such as sensor data, event log, and even Serial over LAN (SoL, poor mans console). IPMI can also help you identify components in the system but isn’t the best means of doing so. This is where SMBIOS comes in and can complete the picture.

System Management BIOS (SMBIOS) is a DMTF specification that can give you extended information about a system. Here’s how its put by the DTMF:

The information is intended to allow generic instrumentation to deliver this information to management applications that use DMI, CIM or direct access, eliminating the need for error prone operations like probing system hardware for presence detection.

Put another way, it’s an easy way to get the lay of the land.

Using SMBIOS on Solaris is easy, using the cleverly named smbios command. If you simply run the command with no args you’ll get a flood of information which makes no sense at first glance. Here is an example:

$ smbios
ID    SIZE TYPE
0     68   SMB_TYPE_BIOS (BIOS information)

  Vendor: American Megatrends Inc.
  Version String: 0ABJX039
  Release Date: 04/11/2007
  Address Segment: 0xf000
  ROM Size: 1048576 bytes
  Image Size: 65536 bytes
  Characteristics: 0x17c0bda90
        SMB_BIOSFL_ISA (ISA is supported)
        SMB_BIOSFL_PCI (PCI is supported)
        SMB_BIOSFL_PLUGNPLAY (Plug and Play is supported)
        SMB_BIOSFL_FLASH (BIOS is Flash Upgradeable)
        SMB_BIOSFL_SHADOW (BIOS shadowing is allowed)
        SMB_BIOSFL_ESCD (ESCD support is available)
        SMB_BIOSFL_CDBOOT (Boot from CD is supported)
        SMB_BIOSFL_SELBOOT (Selectable Boot supported)
        SMB_BIOSFL_ROMSOCK (BIOS ROM is socketed)
        SMB_BIOSFL_EDD (EDD Spec is supported)
        SMB_BIOSFL_I5_PRINT (int 0x5 print screen svcs)
        SMB_BIOSFL_I9_KBD (int 0x9 8042 keyboard svcs)
        SMB_BIOSFL_I14_SER (int 0x14 serial svcs)
        SMB_BIOSFL_I17_PRINTER (int 0x17 printer svcs)
...

If you just dump the whole output to a file and start grepping around you’ll find interesting information within…

$ smbios | grep DIMM
  Location Tag: DIMM0
  Form Factor: 9 (DIMM)
  Device Locator: DIMM0
  Location Tag: DIMM1
...
$ smbios | grep Sun
  Manufacturer: Sun Microsystems
  Product: Sun Fire X4100 M2
  Manufacturer: Sun Microsystems
  Product: Sun Fire X4100 M2                     
  Manufacturer: Sun Microsystems
...

So you can see that there is interesting data in there… but how do we get it in some more palatable form?

The DMTF standard breaks down the data available from SMBIOS into “types”. If you download the System Management BIOS Reference Specification you can get all sort of details on data available based on type. Each type is assigned an integer. Some are required and some are optional. Here are the required types:

  • BIOS Information (Type 0)
  • System Information (Type 1)
  • System Enclosure (Type 3)
  • Processor Information (Type 4)
  • Cache Information (Type 7)
  • System Slots (Type 9)
  • Physical Memory Array (Type 16)
  • Memory Device (Type 17)
  • Memory Array Mapped Address (Type 19)
  • Memory Device Mapped Address (Type 20)
  • System Boot Information (Type 32)

The smbios command accepts the type number as an argument, so we can thus hone down the output to what we really want, for instance to get just the “System Information” we nab type 1:

$ smbios -t 1
ID    SIZE TYPE
1     173  SMB_TYPE_SYSTEM (system information)

  Manufacturer: Sun Microsystems
  Product: Sun Fire X4100 M2
  Version: To Be Filled By O.E.M.          
  Serial Number: XXXXXXXXXXXX                      

  UUID: 00000000-0000-0000-0000-00144fXXXXXXXX
  Wake-Up Event: 0x6 (power switch)
  SKU Number: To Be Filled By O.E.M.
  Family: To Be Filled By O.E.M.

Let me note that the information above is correct, and the X’ed out Serial Number is in fact the correct one that Sun Support would want. In the case of Dell PowerEdge servers that I’ve tested the “Serial Number” was the Dell Service Tag. This alone is handy dandy, but lets try the System Slots, Type 9. This time I’ll run the command on my home white-box workstation:

$ smbios -t 9
ID    SIZE TYPE
32    17   SMB_TYPE_SLOT (upgradeable system slot)

  Location Tag: J6B2

  Reference Designator: J6B2
  Slot ID: 0x0
  Type: 0xa5 (PCI Express)
  Width: 0xd (16x or x16)
  Usage: 0x4 (in use)
  Length: 0x4 (long length)
  Slot Characteristics 1: 0xc
        SMB_SLCH1_33V (provides 3.3V)
        SMB_SLCH1_SHARED (opening shared with other slot)
  Slot Characteristics 2: 0x1
        SMB_SLCH2_PME (slot supports PME# signal)

ID    SIZE TYPE
33    17   SMB_TYPE_SLOT (upgradeable system slot)

  Location Tag: J6B1

  Reference Designator: J6B1
  Slot ID: 0x1
  Type: 0xa5 (PCI Express)
  Width: 0x8 (1x or x1)
  Usage: 0x3 (available)
  Length: 0x3 (short length)
  Slot Characteristics 1: 0xc
        SMB_SLCH1_33V (provides 3.3V)
        SMB_SLCH1_SHARED (opening shared with other slot)
  Slot Characteristics 2: 0x1
        SMB_SLCH2_PME (slot supports PME# signal)
...

Direct your eyes to “Usage”, you can see the fist 16x PCI Express slot is “in use” (my NVidia Graphics Card), the second PCI Express 1x is “available”.

If you haven’t figured it out already, the prtdiag command gets its data largely from SMBIOS:

$ prtdiag
System Configuration: Sun Microsystems Sun Fire X4100 M2
BIOS Configuration: American Megatrends Inc. XXXXXXXXX 04/11/2007
BMC Configuration: IPMI 1.5 (KCS: Keyboard Controller Style)

==== Processor Sockets ====================================

Version                          Location Tag
-------------------------------- --------------------------
Dual-Core AMD Opteron(tm) Processor 2216 CPU 1
....

SMBIOS, when use in conjunction with IPMI and Solaris KStats, can provide a lot of very fine grained data about your systems that can really make your monitoring applications shine. Play around and have fun.