Updating PRIMERGY M1/M2 servers LoM CNA firmware on Linux

Most of Fujitsu PRIMERGY BX/RX M1 and M2 servers use Emulex CNA as LoM. To update the LoM CNA firmware, Fujitsu recommends using the firmware update ISO, firmware update ASP (Autonomous Support Package), Emulex OCM, ServerView Update Manager, or ServerView Update Manager Express. Each has pros and cons. My focus is to see if a mass update is possible and updates can be done without vendor specific tools. ServerView Update Manager and Emulex OCM support mass updates. If there are tens or hundreds of PRIMERGYs that require a CNA firmware update, either one would be the way to go, but both require some sort of vendor specific agents/tools. Other methods are for a single server update. Well, technically the ASP method can be used for a mass update, but it sill requires the Emulex tool as a prerequisite. In this entry, I will explain another way to update the CNA LoM firmware in Linux. This is not documented in Fujitsu's manuals, so I think this is not supported by the vendor. You can do this, but at your own risk. Here are the steps.
  1. Download the firmware image from Fujitsu's download site (http://support.ts.fujitsu.com/).
  2. Extract the firmware image (e.g. oc14-11.1.172.23.ufi) from the download file.
  3. Place the firmware file under /lib/firmware.
  4. # cp oc14-11.1.172.23.ufi /lib/firmware
  5. Check the current firmware version.
  6. # ethtool -i <interface name>
    Example)
    # ethtool -i eth0
    driver: be2net
    version: 11.1.172.21.4fts
    firmware-version: 10.6.193.31
    bus-info: 0000:03:00.0
    supports-statistics: yes
    supports-test: yes
    supports-eeprom-access: yes
    supports-register-dump: no
    supports-priv-flags: yes
    
  7. Update the firmware.
  8. # ethtool -f <interface name> <firmware file name copied in step 2>
    Example)
    # ethtool -f eth0 oc14-11.1.172.23.ufi
    
  9. Check if the firmware is installed.
  10. Example) New firmware version appears in the square brackets
    # ethtool -i eth0
    driver: be2net
    version: 11.1.172.21.4fts
    firmware-version: 10.6.193.31 [11.1.172.23]
    bus-info: 0000:03:00.0
    supports-statistics: yes
    supports-test: yes
    supports-eeprom-access: yes
    supports-register-dump: no
    supports-priv-flags: yes
    
  11. Reboot the server to activate the new firmware.
You should see the new firmware used in the system after the reboot.

How to reset iRMC admin password on Fujitsu PRIMERGY servers

For some reason, the iRMC admin user password is lost, and you need to recover it to access the iRMC on your PRIMERGY server. The official way to reset the admin user password is to reboot the server and bring up the BIOS setup utility. Then set the "Load iRMC Default Values" option to Yes, and save the change. However this requires a system reboot.

Many customers/users do not want to reboot their servers (especially production ones) just to reset the iRMC (BMC) password. Also this option will wipe out any settings you made for iRMC other than the LAN settings, so you need to remember the original settings and restore them once the password is reset.

Here is another way to reset your iRMC admin password. You don't need to reboot the server. You don't need to install Fujitsu ServerView Agents or Operations Manager. The only thing you need is an IPMI tool/utility on your PRIMERGY.

On Linux, you can use 'ipmitool'. Major Linux distributions have this by default, so you just need to install it if not there using yum, apt, dnf, zypper, etc. Then run the following command (the default password for admin is "admin"):

$ ipmitool user set password 2 admin 

Now you should be able to log in to iRMC with user ID: admin and password: admin. If the ipmi drivers (ipmi_si, ipmi_msghandler, and ipmi_devintf) are not loaded to the kernel, load them first. Otherwise the above command will fail.

On ESXi, you can install the ipmitool vib (see my blog post "IPMITOOL on VMware ESXi") or just copy the ipmitool binary to ESXi, and run the same command as Linux.

For Windows, there is a tool called "IPMIVIEW" from Fujitsu. You can download the binary from their website. For your convenience, here is the link to the download page of IPMIVIEW V2.22 which is the latest version as of 3/24/2017.

Once you download the tool and unpack it, create a file and add the following two lines to the file:

UserName.2=admin
UserPassword.2=admin
Then run the following command from Command Prompt:
C:/> ipmiview.exe -ini=<file name>
Example)
C:\Fujitsu\IPMIVIEW> type admin_pwd_reset.ini
UserName.2=admin
UserPassword.2=admin
C:\Fujitsu\IPMIVIEW> ipmiview.exe -ini=admin_pwd_reset.ini
IPMI (Intelligent Platform Management) Tool V2.22

OK:    ReadINIFile admin_pwd_reset.ini [(null)]
OK:    StartupIPMICommunication
OK:    UserName/Password.2: "admin"/"admin"

Ret = 0 = 0x00

This is it. You can log in to iRMC with admin/admin now.

Fujitsu ServerView RAID Manager 6.4.11 for Ubuntu

I have updated ServerView RAID Manager on my Ubuntu 16.04.1 servers to 6.4.11 (serverview-raid-manager_6.4-11_amd64.deb) that I ported.
I can't distribute the package. If you need it, please ask your regional Fujitsu support. They may have an official version for Ubuntu.

Fujitsu PRIMERGY: Configuring RAID via iRMC REST API

Fujitsu published iRMC S4 REST API. With the latest firmware (version 8.4x), you can configure RAID via API. That means you don't need to bring up the RAID configuration utility to create logical drives on a new machine, or you can manage the RAID card and logical drives even though ServerView RAID does not support the OS you are using. This feature is good to have so you can replicate the same configuration to multiple servers at the same time.

I will explain how to create/delete logical drive(s) via iRMC REST API. As a prerequisite, iRMC firmware must be at 8.4x or later.
In the following example, I will use iRMC user ID: admin, iRMC user password: admin, and iRMC IP address: 192.168.10.80.

  1. Check if the RAID profile is already there.
  2. $ curl -u admin:admin -H"Accept: application/json" -X GET -i http://192.168.10.80/rest/v1/Oem/eLCM/ProfileManagement/
    HTTP/1.1 200 OK
    Date: Fri, 28 Oct 2016 23:15:29 GMT
    Server: iRMC S4 Webserver
    Expires: Thu, 27 Oct 2016 23:15:29 GMT
    Content-Length: 145
    Content-Type: application/json; charset=UTF-8
    
    {
      "Links":{
        "profileStore":[
          {
            "@odata.id":"rest\/v1\/Oem\/eLCM\/ProfileManagement\/HWConfigurationIrmc"
          }
        ]
      }
    }
    
    If the profile is not created yet, run the following to create it:
    $ curl -u admin:admin -H"Accept: application/json" -X POST -i http://192.168.10.80/rest/v1/Oem/eLCM/ProfileManagement/get?PARAM_PATH=Server/HWConfigurationIrmc
    HTTP/1.1 202 Accepted
    Date: Fri, 28 Oct 2016 22:57:05 GMT
    Server: iRMC S4 Webserver
    Expires: Thu, 27 Oct 2016 22:57:05 GMT
    Content-Length: 154
    Content-Type: application/json; charset=UTF-8
    Location: rest/v1/Oem/eLCM/ProfileManagement/HWConfigurationIrmc
    
    {
      "Session":{
        "Id":16,
        "Tag":"",
        "WorkSequence":"obtainProfileParameters",
        "Start":"",
        "Duration":0,
        "Status":"activated"
      }
    }
    
    
  3. Review the current configuration. The following example shows that there is one RAID card, and six physical SATA hard drives in slot 0, 1, 2, 4, 5, and 6 which are all 465GB drives. There is no logical drive configured.
  4. $ curl -u admin:admin -H"Accept: application/json" -X GET -i http://192.168.10.80/rest/v1/Oem/eLCM/ProfileManagement/HWConfigurationIrmc
    HTTP/1.1 200 OK
    Date: Fri, 28 Oct 2016 23:00:40 GMT
    Server: iRMC S4 Webserver
    Expires: Thu, 27 Oct 2016 23:00:40 GMT
    Content-Length: 3881
    Content-Type: application/json; charset=UTF-8
    Content-disposition: attachment; filename="rest/v1/Oem/eLCM/ProfileManagement/HWConfigurationIrmc";
    
    {
      "Server":{
        "HWConfigurationIrmc":{
          "Adapters":{
            "RAIDAdapter":[
              {
                "@AdapterId":"RAIDAdapter0",
                "@ConfigurationType":"Addressing",
                "PCIId":{
                  "Vendor":"1000",
                  "Device":"005B",
                  "ControllerIndex":0
                },
                "Features":{
                  "RaidLevel":"0,1,5,6,10,50,60",
                  "Stripe":{
                    "@Unit":"KB",
                    "#text":"8,16,32,64,128,256,512,1024"
                  },
                  "InitMode":"no,fast,slow",
                  "WriteMode":"WriteBack,WriteThrough,AlwaysWriteBack",
                  "ReadMode":"NoReadAhead,ReadAhead",
                  "CacheMode":"Direct,Cached",
                  "DiskCacheMode":"Enabled,Disabled,Unchanged"
                },
                "BGIRate":30,
                "MDCRate":30,
                "RebuildRate":30,
                "EnableCopyback":"Enabled",
                "EnableCopybackOnSMART":"Enabled",
                "EnableCopybackOnSSDSMART":"Enabled",
                "AutoRebuild":"Enabled",
                "PhysicalDisks":{
                  "PhysicalDisk":[
                    {
                      "@Number":"0",
                      "@Action":"None",
                      "Slot":0,
                      "PDStatus":"Available",
                      "Interface":"SATA",
                      "Type":"HDD",
                      "Vendor":"ATA",
                      "Product":"WDC WD5003ABYX-",
                      "Size":{
                        "@Unit":"GB",
                        "#text":465
                      }
                    },
                    {
                      "@Number":"1",
                      "@Action":"None",
                      "Slot":1,
                      "PDStatus":"Available",
                      "Interface":"SATA",
                      "Type":"HDD",
                      "Vendor":"ATA",
                      "Product":"WDC WD5003ABYX-",
                      "Size":{
                        "@Unit":"GB",
                        "#text":465
                      }
                    },
                    {
                      "@Number":"2",
                      "@Action":"None",
                      "Slot":2,
                      "PDStatus":"Available",
                      "Interface":"SATA",
                      "Type":"HDD",
                      "Vendor":"ATA",
                      "Product":"WDC WD5003ABYX-",
                      "Size":{
                        "@Unit":"GB",
                        "#text":465
                      }
                    },
                    {
                      "@Number":"4",
                      "@Action":"None",
                      "Slot":4,
                      "PDStatus":"Available",
                      "Interface":"SATA",
                      "Type":"HDD",
                      "Vendor":"ATA",
                      "Product":"WDC WD5003ABYX-",
                      "Size":{
                        "@Unit":"GB",
                        "#text":465
                      }
                    },
                    {
                      "@Number":"5",
                      "@Action":"None",
                      "Slot":5,
                      "PDStatus":"Available",
                      "Interface":"SATA",
                      "Type":"HDD",
                      "Vendor":"ATA",
                      "Product":"WDC WD5003ABYX-",
                      "Size":{
                        "@Unit":"GB",
                        "#text":465
                      }
                    },
                    {
                      "@Number":"6",
                      "@Action":"None",
                      "Slot":6,
                      "PDStatus":"Available",
                      "Interface":"SATA",
                      "Type":"HDD",
                      "Vendor":"ATA",
                      "Product":"WDC WD5003ABYX-",
                      "Size":{
                        "@Unit":"GB",
                        "#text":465
                      }
                    }
                  ]
                },
                "Arrays":null,
                "LogicalDrives":null
              }
            ]
          }
        }
      }
    }
    
  5. Create logical drive(s). I will create one RAID1 volume with two HDDs, and one RAID5 volume with the remaining four HDDs. To do this, you need to create a configuration file to send to iRMC. Then send a request to iRMC to create volumes.
    If you want to specify drive slots for each logical volume, you can do that. Read the API manual for details.
  6. $ cat create_logical_drives.json
    {
      "Server":{
        "HWConfigurationIrmc":{
          "@Processing":"execute",
          "Adapters":{
            "RAIDAdapter":[
              {
                "@AdapterId":"RAIDAdapter0",
                "@ConfigurationType":"Addressing",
                "LogicalDrives":{
                  "LogicalDrive":[
                    {
                      "@Number":0,
                      "@Action":"Create",
                      "RaidLevel":"1"
                    },
                    {
                      "@Number":1,
                      "@Action":"Create",
                      "RaidLevel":"5"
                    }
                  ]
                },
              }
            ]
          },
          "@Version":"1.00"
        },
        "@Version":"1.01"
      }
    }
    
    $ curl -u admin:admin -H"Accept: application/json" -X POST -i http://192.168.10.80/rest/v1/Oem/eLCM/ProfileManagement/set --data @create_logical_drives.json
    HTTP/1.1 202 Accepted
    Date: Fri, 28 Oct 2016 23:29:20 GMT
    Server: iRMC S4 Webserver
    Expires: Thu, 27 Oct 2016 23:29:20 GMT
    Content-Length: 143
    Content-Type: application/json; charset=UTF-8
    
    {
      "Session":{
        "Id":17,
        "Tag":"",
        "WorkSequence":"applyProfile",
        "Start":"",
        "Duration":0,
        "Status":"activated"
      }
    }
    
  7. Wait for the request to be completed.
  8. Check the current session status.
    $ curl -u admin:admin -H"Accept: application/json" -X GET -i http://192.168.10.80/sessionInformation/17/status
    HTTP/1.1 200 OK
    Date: Fri, 28 Oct 2016 23:36:16 GMT
    Server: iRMC S4 Webserver
    Expires: Thu, 27 Oct 2016 23:36:16 GMT
    Content-Length: 177
    Content-Type: application/json; charset=UTF-8
    
    {
      "Session":{
        "Id":17,
        "Tag":"",
        "WorkSequence":"applyProfile",
        "Start":"2016\/10\/28 16:30:00",
        "Duration":145,
        "Status":"terminated regularly"
      }
    }
    
    Check the current log.
    $ curl -u admin:admin -H"Accept: application/json" -X GET -i http://192.168.10.80/sessionInformation/17/log
    HTTP/1.1 200 OK
    Date: Fri, 28 Oct 2016 23:36:20 GMT
    Server: iRMC S4 Webserver
    Expires: Thu, 27 Oct 2016 23:36:20 GMT
    Content-Length: 2510
    Content-Type: application/json; charset=UTF-8
    Content-disposition: attachment; filename="sessionInformation/17/log";
    
    {
      "SessionLog":{
        "Id":17,
        "Tag":"",
        "WorkSequence":"applyProfile",
        "Entries":{
          "Entry":[
            {
              "@date":"2016\/10\/28 16:29:20",
              "#text":"CreateSession: Session 'applyProfile' created with id 17"
            },
            {
              "@date":"2016\/10\/28 16:29:20",
              "#text":"AttachWorkSequence: Attached work sequence 'applyProfile' to session 17"
            },
            {
              "@date":"2016\/10\/28 16:30:00",
              "#text":"LCMScheduler: Launch ApplyProfileParameters"
            },
            {
              "@date":"2016\/10\/28 16:30:00",
              "#text":"ValidateProfile: Profile successfully validated"
            },
            {
              "@date":"2016\/10\/28 16:30:00",
              "#text":"ApplyProfileParameters: Sub profile 'BiosConfig' not found"
            },
            {
              "@date":"2016\/10\/28 16:30:00",
              "#text":"ApplyProfileParameters: Sub profile 'IrmcConfig' not found"
            },
            {
              "@date":"2016\/10\/28 16:30:00",
              "#text":"ApplyProfileParameters: Sub profile 'AdapterConfigIrmc' not found"
            },
            {
              "@date":"2016\/10\/28 16:30:00",
              "#text":"ApplyProfileParameters: Sub profile 'OSInstallation' not found"
            },
            {
              "@date":"2016\/10\/28 16:30:00",
              "#text":"ApplyProfileParameters: Sub profile 'HWConfiguration' not found"
            },
            {
              "@date":"2016\/10\/28 16:30:00",
              "#text":"FindSubProfile: Sub profile 'HWConfigurationIrmc' found"
            },
            {
              "@date":"2016\/10\/28 16:30:00",
              "#text":"LOG-1-HWConfigurationIrmc: Start processing of Sub profile 'HWConfigurationIrmc'"
            },
            {
              "@date":"2016\/10\/28 16:32:14",
              "#text":"createLogicalDrive: drv[0] Create Drive [RAID Level = 1]"
            },
            {
              "@date":"2016\/10\/28 16:32:22",
              "#text":"createLogicalDrive: drv[1] Create Drive [RAID Level = 5]"
            },
            {
              "@date":"2016\/10\/28 16:32:25",
              "#text":"LOG-2-HWConfigurationIrmc-Success: Finished processing of Sub profile 'HWConfigurationIrmc' with status 'Success'"
            },
            {
              "@date":"2016\/10\/28 16:32:25",
              "#text":"LCMScheduler: LCM object is being destroyed as automatic termination was configured"
            },
            {
              "@date":"2016\/10\/28 16:32:25",
              "#text":"TerminateSession: 'applyProfile' is being terminated"
            }
          ]
        }
      }
    }
    
  9. Check if the logical drives are configured. You can see the status on iRMC Web GUI, or rescan the profile.
  10. Delete the current profile.
    $ curl -u admin:admin -H"Accept: application/json" -X DELETE -i http://192.168.10.80/rest/v1/Oem/eLCM/ProfileManagement/HWConfigurationIrmc
    
    Rescan the configuration.
    $ curl -u admin:admin -H"Accept: application/json" -X POST -i http://192.168.10.80/rest/v1/Oem/eLCM/ProfileManagement/get?PARAM_PATH=Server/HWConfigurationIrmc
    
    View the latest profile. As you can see, logical drive 0 (RAID 1) and logical drive 1 (RAID 5) are newly created.
    $ curl -u admin:admin -H"Accept: application/json" -X GET -i http://192.168.10.80/rest/v1/Oem/eLCM/ProfileManagement/HWConfigurationIrmc
    HTTP/1.1 200 OK
    Date: Fri, 28 Oct 2016 23:51:08 GMT
    Server: iRMC S4 Webserver
    Expires: Thu, 27 Oct 2016 23:51:08 GMT
    Content-Length: 6625
    Content-Type: application/json; charset=UTF-8
    Content-disposition: attachment; filename="rest/v1/Oem/eLCM/ProfileManagement/HWConfigurationIrmc";
    
    {
      "Server":{
        "HWConfigurationIrmc":{
          "Adapters":{
            "RAIDAdapter":[
              {
                "@AdapterId":"RAIDAdapter0",
                "@ConfigurationType":"Addressing",
                "PCIId":{
                  "Vendor":"1000",
                  "Device":"005B",
                  "ControllerIndex":0
                },
                "Features":{
                  "RaidLevel":"0,1,5,6,10,50,60",
                  "Stripe":{
                    "@Unit":"KB",
                    "#text":"8,16,32,64,128,256,512,1024"
                  },
                  "InitMode":"no,fast,slow",
                  "WriteMode":"WriteBack,WriteThrough,AlwaysWriteBack",
                  "ReadMode":"NoReadAhead,ReadAhead",
                  "CacheMode":"Direct,Cached",
                  "DiskCacheMode":"Enabled,Disabled,Unchanged"
                },
                "BGIRate":30,
                "MDCRate":30,
                "RebuildRate":30,
                "EnableCopyback":"Enabled",
                "EnableCopybackOnSMART":"Enabled",
                "EnableCopybackOnSSDSMART":"Enabled",
                "AutoRebuild":"Enabled",
                "Arrays":{
                  "Array":[
                    {
                      "@Number":0,
                      "@ConfigurationType":"Addressing",
                      "PhysicalDiskRefs":{
                        "PhysicalDiskRef":[
                          {
                            "@Number":"0"
                          },
                          {
                            "@Number":"1"
                          }
                        ]
                      }
                    },
                    {
                      "@Number":1,
                      "@ConfigurationType":"Addressing",
                      "PhysicalDiskRefs":{
                        "PhysicalDiskRef":[
                          {
                            "@Number":"2"
                          },
                          {
                            "@Number":"4"
                          },
                          {
                            "@Number":"5"
                          }
                        ]
                      }
                    }
                  ]
                },
                "LogicalDrives":{
                  "LogicalDrive":[
                    {
                      "@Number":0,
                      "@Action":"None",
                      "RaidLevel":"1",
                      "ArrayRefs":{
                        "ArrayRef":[
                          {
                            "@Number":0
                          }
                        ]
                      },
                      "WriteMode":"WriteThrough",
                      "ReadMode":"ReadAhead",
                      "CacheMode":"Direct",
                      "DiskCacheMode":"Disabled",
                      "Stripe":{
                        "@Unit":"KB",
                        "#text":64
                      },
                      "InitMode":"no",
                      "LDStatus":"Operational",
                      "Name":"LogicalDrive_0",
                      "Size":{
                        "@Unit":"GB",
                        "#text":465
                      }
                    },
                    {
                      "@Number":1,
                      "@Action":"None",
                      "RaidLevel":"5",
                      "ArrayRefs":{
                        "ArrayRef":[
                          {
                            "@Number":1
                          }
                        ]
                      },
                      "WriteMode":"WriteThrough",
                      "ReadMode":"ReadAhead",
                      "CacheMode":"Direct",
                      "DiskCacheMode":"Disabled",
                      "Stripe":{
                        "@Unit":"KB",
                        "#text":64
                      },
                      "InitMode":"no",
                      "LDStatus":"Operational",
                      "Name":"LogicalDrive_1",
                      "Size":{
                        "@Unit":"GB",
                        "#text":930
                      }
                    }
                  ]
                },
                "PhysicalDisks":{
                  "PhysicalDisk":[
                    {
                      "@Number":"0",
                      "@Action":"None",
                      "Slot":0,
                      "PDStatus":"Operational",
                      "Interface":"SATA",
                      "Type":"HDD",
                      "Vendor":"ATA",
                      "Product":"WDC WD5003ABYX-",
                      "Size":{
                        "@Unit":"GB",
                        "#text":465
                      }
                    },
                    {
                      "@Number":"1",
                      "@Action":"None",
                      "Slot":1,
                      "PDStatus":"Operational",
                      "Interface":"SATA",
                      "Type":"HDD",
                      "Vendor":"ATA",
                      "Product":"WDC WD5003ABYX-",
                      "Size":{
                        "@Unit":"GB",
                        "#text":465
                      }
                    },
                    {
                      "@Number":"2",
                      "@Action":"None",
                      "Slot":2,
                      "PDStatus":"Operational",
                      "Interface":"SATA",
                      "Type":"HDD",
                      "Vendor":"ATA",
                      "Product":"WDC WD5003ABYX-",
                      "Size":{
                        "@Unit":"GB",
                        "#text":465
                      }
                    },
                    {
                      "@Number":"4",
                      "@Action":"None",
                      "Slot":4,
                      "PDStatus":"Operational",
                      "Interface":"SATA",
                      "Type":"HDD",
                      "Vendor":"ATA",
                      "Product":"WDC WD5003ABYX-",
                      "Size":{
                        "@Unit":"GB",
                        "#text":465
                      }
                    },
                    {
                      "@Number":"5",
                      "@Action":"None",
                      "Slot":5,
                      "PDStatus":"Operational",
                      "Interface":"SATA",
                      "Type":"HDD",
                      "Vendor":"ATA",
                      "Product":"WDC WD5003ABYX-",
                      "Size":{
                        "@Unit":"GB",
                        "#text":465
                      }
                    },
                    {
                      "@Number":"6",
                      "@Action":"None",
                      "Slot":6,
                      "PDStatus":"Available",
                      "Interface":"SATA",
                      "Type":"HDD",
                      "Vendor":"ATA",
                      "Product":"WDC WD5003ABYX-",
                      "Size":{
                        "@Unit":"GB",
                        "#text":465
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      }
    }
    

Enabling the serial console for ESXi on Fujitsu PRIMERGY

If you can't boot ESXi for some reason, or have some firmware/driver issues when booting ESXi, you can enable the serial line output via iRMC on Fujitsu PRIMERGY servers.

Here is how to enable the serial output through iRMC, and capture ESXi boot logs.

  1. Enable BIOS Console Redirection under Console Redirection.
  2. You can do this in the BIOS setup menu (hit the F2 key during BIOS POST), or on the iRMC Web GUI.

    Here is the example of iRMC. Check the Console Redirection Enabled option, and change the Serial 1 Multiplexer option from System to iRMC.
  3. Enable IPMI over LAN under Network Settings if it is not enabled.
  4. Activate Serial-Over-LAN through iRMC.
  5. In this example, I use the ipmitool command, but you can use ipmiutil or other IPMI utilities which support SOL.
    $ ipmitool -I lanplus -H <iRMC IP address> -U <iRMC User> -P <iRMC Password> sol activate
    Example)
    $ ipmitool -I lanplus -H 192.168.10.77 -U admin -P admin sol activate
  6. Boot the ESXi with the console options enabled.
  7. You can see how to enable the console options for ESXi on VMware KB 1033888. In the following screenshot, I added the options to the boot options during startup (SHIFT+O).

    Now you can see the ESXi boot log on your IPMI SOL session.

Fujitsu PRIMERGY: How to update BIOS and iRMC firmware remotely

There is a HTTP interface in iRMC for system BIOS and iRMC firmware updates. That means you can send firmware images to iRMC remotely to flash BIOS and iRMC. What you need is just to do a HTTP POST to /irmcupdate or /biosupdate with an update image.

Here are some examples using curl or PowerShell. In the examples, I used PRIMERGY BX2580 M1 BIOS and iRMC images for my PRIMERGY BX2580 M1 server. You can download BIOS and iRMC firmware files from Fujitsu download site

  • BIOS update using curl
  • $ curl -k --digest -u <iRMC username>:<iRMC password> -F "file=@<BIOS file>" http://<iRMC IP address>/biosupdate
    example)
    $ curl -k --digest -u admin:admin -F "file=@D3321-A1.UPC" http://192.168.10.21/biosupdate

    The above command stages the BIOS file to iRMC. If the server is powered off, then iRMC powers it on and starts BIOS flash. If it is not powered off, BIOS flash will be started after you shut down the OS.

    To check the update status, you can do a HTTP GET to /biosprogress. It will return the status in XML.

    example)
    $ curl -k --digest -u admin:admin http://192.168.10.21/biosprogress
    <?xml version="1.0" encoding="UTF-8"?>
    <Status>
    <Value>8</Value>
    <Severity>Information</Severity>
    <Message>FLASH programming in progress 33 Percent</Message>
    </Status>
    
  • iRMC firmware update using PowerShell
  • PS> $username="<iRMC username>"
    PS> $password=ConvertTo-SecureString "<iRMC password>" -AsPlainText -Force 
    PS> $credential = New-Object System.Management.Automation.PSCredential $username, $password
    PS> Invoke-WebRequest -Uri "http://<iRMC IP address>/irmcupdate?flashSelect=255" -Method Post -Credential $credential -InFile "<iRMC firmware image>" -Verbose
    
    example)
    PS> $username="admin"
    PS> $password=ConvertTo-SecureString "admin" -AsPlainText -Force 
    PS> $credential = New-Object System.Management.Automation.PSCredential $username, $password
    PS> Invoke-WebRequest -Uri "http://192.168.10.21/irmcupdate?flashSelect=255" -Method Post -Credential $credential -InFile "C:\FW\BX2580M1_0824F.BIN" -Verbose
    

    An iRMC firmware update does not require a system reboot. It will be updated while the OS is running.

    To check the update status, send a HTTP GET request to /irmcprogress. It will return the status in XML.

    example)
    PS> $username="admin"
    PS> $password=ConvertTo-SecureString "admin" -AsPlainText -Force 
    PS> $credential = New-Object System.Management.Automation.PSCredential $username, $password
    PS> [xml]$response = Invoke-WebRequest -Uri "http://192.168.10.21/irmcprogress" -Method Get -Credential $credential -Verbose
    PS> $response.status |fl
    
    Value    : 8
    Severity : Information
    Message  : FLASH programming in progress 48 Percent
    
    

Fujitsu PRIMERGY: How to change BIOS settings remotely

If you have multiple servers and you need to change BIOS settings, it is not wise to bring up BIOS setup screen on each server and change the values. It's time consuming. Also you easily make a mistake like forget to change a value on one of the servers.

To avoid this, we normally automate a process with a tool or a script to replicate the changes on all target servers, but is there an interface to do this on Fujitsu PRIMERGY servers? Yes, there is. You can change BIOS settings through iRMC (integraded Remote Management Controller) which is similar to DELL iDRAC or HP iLO. iRMC accepts an XML file as a BIOS configuration file, and it will enable the changes after a reboot.

Here is an example. I will change the CPU Hyper-Threading setting from "Enable" to "Disable" through iRMC on PRIMERGY BX2580 M2.

  1. Create a BIOS configuration change XML file. To disable Hyper-Threading, create a file like this:
  2. $ cat input.xml
    <?xml version="1.0" encoding="utf-8"?>
    <config>
      <sysId>BX2580M2</sysId>
      <configuration>
        <token api="BSPBR"></token>
        <supportedSetting>
          <id>HyperThreading</id>
          <name>Hyper-Threading</name>
          <setupItemID>0x0057</setupItemID>
          <value>Disabled</value>
        </supportedSetting>
      </configuration>
    </config>
    
  3. Send the XML file to the iRMC BIOS restore interface. I use the curl command to do an HTTP POST to iRMC.
  4. $ curl --basic -u <iRMC username>:<iRMC password> --data @<XML file> http://<iRMC IP address>/biosrestore
    example)
    $ curl --basic -u admin:admin --data @input.xml http://192.168.10.21/biosrestore
  5. Reboot the server. You can see the value is changed to Disabled in BIOS after the reboot.

If you need to change multiple settings, you just need to add "<supportedSetting>(BIOS setting you want to change)</supportedSetting>" to the XML file like the following (change both "HT" and "Hardware Prefetcher" to "Disabled":

$ cat input.xml
<?xml version="1.0" encoding="utf-8"?>
<config>
  <sysId>BX2580M2</sysId>
  <configuration>
    <token api="BSPBR"></token>
    <supportedSetting>
      <id>HyperThreading</id>
      <name>Hyper-Threading</name>
      <setupItemID>0x0057</setupItemID>
      <value>Disabled</value>
    </supportedSetting>
    <supportedSetting>
      <id>HardwarePrefetcher</id>
      <name>Hardware Prefetcher</name>
      <setupItemID>0x012E</setupItemID>
      <value>Disabled</value>
    </supportedSetting>
  </configuration>
</config>

If you need to change multiple servers, you can create a script to send the same XML file to iRMC.

Good Bye, Folks!

As you may have heard, Fujitsu has completely discontinued Data Center Products and Solutions business in North America on April 1st, 2021. ...