Host / OpenBMC sensors / Update info for Zaius / Barreleye G2 via REST API

Zaius / Barreleye G2 -  Power9 and AST2500 running OpenBMC

Zaius / Barreleye G2 – Power9 and AST2500 running OpenBMC

Part of integrating a new openPOWER Zaius / Barreleye G2 in a companies’ environment comes with a couple of new-ness.:

A) Not all openPOWER servers have APSS which provides the external power measurement for CPU, DIMMs and other components.

B) Not all openPOWER servers fully support IPMIoverLAN because of leveraging openBMC. OpenBMC does this better, it provides you API access to all the sensors / management controls.

However to mitigate this newness, I’ve document I’ve provided below information to help you in your journey.

Power Rail Information via Host:

apt install lm-sensors
Chip 0 :                  70.00 W
Chip 0 Vdd:               14.00 W
Chip 0 Vdn:               21.00 W
Chip 8 :                  79.00 W
Chip 8 Vdd:               19.00 W
Chip 8 Vdn:               25.00 W



OpenBMC – Host Code Update

After build, you will end up with a set of image files in:


The images corresponds to components that can be updated on the BMC.

The whole flash image for BMC
image-bmc → flash--
The small initramfs image is used for early init and flash management
image-initramfs → core-image-minimal-initramfs-palmetto.cpio.lzma.u-boot
The OpenBMC kernel cuImage (combined kernel and device tree)
image-kernel → cuImage
The read-only OpenBMC file system
image-rofs → obmc-phosphor-image-palmetto.squashfs-xz
The read-write file system for persistent changes to the OpenBMC file system
image-rwfs → rwfs.jffs2
The OpenBMC boot-loader.
image-u-boot → u-boot.bin

Preparing for BMC code Update

The BMC normally runs with the read-write and read-only file systems mounted, which means these images may be read (and written, for the read-write file-system) at any time. Because the updates are distributed as complete file system images, these file-systems have to be unmounted to replace them with new images. To unmount these file-systems all applications must be stopped.

By default an orderly reboot will stop all applications and unmount the root file-system, and the images copied into the /run/initramfs directory will be applied at that point before restarting. This also applies to the shutdown and halt commands — they will also write the flash before stopping.

As an alternative, an option can be parsed by the init script in the initramfs to copy the required contents of these file-systems into RAM so that the images can be applied while the rest of the application stack is running and progress can be monitored over the network. The update script can then be called to write the images while the
system is operational and its progress output monitored.

Update from the OpenBMC Shell

To update from the OpenBMC shell, follow the steps in this section. It is recommended that the BMC be prepared for the update first as shown below :

fw_setenv openbmconce copy-files-to-ram copy-base-filesystem-to-ram reboot
Copy one or more of these image-* files to the directory:
(preserving the filename), then run the update script to apply the images:
then reboot to finish applying:
During the reboot process the update script will be invoked after the 
file systems are unmounted to complete the update process.
Some optional features are available, see the help for more details:
/run/initramfs/update –help

Update via REST

An OpenBMC system can download an update image from a TFTP server, and apply updates, controlled via REST. The general procedure is:

  1.  Prepare system for update
  2. Configure update settings
  3. Initiate update
  4. Check flash status
  5. Reboot the BMC

Prepare system for update

Perform a POST to invoke the PrepareForUpdate method of the /flash/bmc object:

curl -b cjar -k -H "Content-Type: application/json" -X POST \
 -d '{"data": ["<TFTP server IP address>", "<filename>"]}' \

This will setup the u-boot environment and reboot the BMC. If no other images were pending the BMC should return in about 2 minutes.

Configure update settings

There are a few settings available to control the update process:

preserve_network_settings Preserve network settings, only needed if updating the whole flash
restore_application_defaults Update (clear) the read-write file system
update_kernel_and_apps_only Update kernel and initramfs
clear_persistent_files Ignore the persistent file list when resetting applications defaults
auto_apply Attempt to write the images by invoking the Apply method after the images are unpacked.

To configure the update settings, perform a REST PUT to /control/flash/bmc/attr/<setting>. For example:

curl -b cjar -k -H "Content-Type: application/json" -X PUT \
 -d '{"data": 1}' \


Initiate update

Perform a POST to invoke the updateViaTftp method of the /flash/bmc object:

curl -b cjar -k -H "Content-Type: application/json" -X POST \
 -d '{"data": ["<TFTP server IP address>", "<filename>"]}' \


Check flash status

You can query the progress of the download and image verification with a simple GET request:

curl -b cjar -k https://bmc/org/openbmc/control/flash/bmc

Or perform a POST to invoke the GetUpdateProgress method of the /flash/bmc object:

curl -b cjar -k -H "Content-Type: application/json" -X POST \
 -d '{"data": []}' \

Note: the status will not advance from Writing images to flash without calling the GetUpdateProgress method.
If the status is Image ready to apply then you can either initiate a reboot or call the Apply method to start the process of writing the flash.

Reboot the BMC

To start using the new images, reboot the BMC using the warmReset method of the BMC control object:

curl -b cjar -k -H "Content-Type: application/json" -X POST \
 -d '{"data": []}' \

Host Code Update

The host firmware (or “BIOS”) can be updated in a similar method. Because the BMC does not use the host firmware it is updated when the download is completed. This assumes the host is not accessing its firmware.
Perform a POST request to call the updateViaTftp method of /control/flash/bios (instead of /control/flash/bmc used above). To initiate the update:

curl -b cjar -k -H "Content-Type: application/json" -X POST \
  -d '{"data": ["<TFTP server IP address>", "<filename>"]}' \

And to check the flash status:

curl -b cjar -k https://bmc/org/openbmc/control/flash/bios


Serial Over LAN(host console)

The console infrastructure allows multiple shared connections to a single host UART. UART data from the host is outputted to all connections, and input from any connection is sent to the host.

Remote Console Connections

To connect to an OpenBMC console session remotely, just ssh to your BMC on port 2200. Use the same login credentials as you would for a normal ssh session:

 $ ssh -p 2200 [user]@[bmc-hostname]
 bmc-hostname is BMC IP address.

Local Console Connections

If you’re already logged into an OpenBMC machine, you can start a console session directly, using:

$ obmc-console-client

To exit from a console, type:

return ~ 

Note that if you’re on an ssh connection, you’ll need to ‘escape’ the ~ character, by entering it twice.


Console logs are kept in:


This log is limited in size, and will wrap after hitting that limit (currently set at 16kB)



The primary management interface for OpenBMC is REST.

Host Management with OpenBMC

Accessible over REST.


The system inventory structure is under the /xyz/openbmc_project/inventory hierarchy. Each event is a separate object under this structure, referenced by name.

In OpenBMC the inventory is represented as a path which is hierarchical to the physical system topology. Items in the inventory are referred to as inventory items and are not necessarily FRUs. If the system contains one chassis, a motherboard, and a CPU on the motherboard, then the path to that inventoryitem would be:
The properties associated with an inventory item are specific to that item with the addition of these common properties:
version: a code version associated with this item
present: indicates whether this item is present in the system (True/False)
The usual list and enumerate REST queries allow the system inventory structure to be accessed. For example, to enumerate all inventory items and their properties:

curl -b jcar -k -X GET -H "Content-Type:application/json"

Confirm BMC version:

curl -b jcar -k -X GET -H "Content-Type:application/json"

Check the status of the CPU0:

curl -b cjar -k -X GET -H "Content-Type:application/json"

Check the status of the CPU0 core<item>:

curl -b cjar -k -X GET -H "Content-Type:application/json"
curl -b cjar -k -X GET -H "Content-Type:application/json"

(e.g. core0 ~ core23)


Check the status of the CPU1:

curl -b cjar -k -X GET -H "Content-Type:application/json"


Check the status of the CPU1 core<item>:

curl -b cjar -k -X GET -H "Content-Type:application/json"
curl -b cjar -k -X GET -H "Content-Type:application/json"

(e.g. core0 ~ core23)
Check the status of the dimm<instance>:

curl -b cjar -k -X GET -H "Content-Type:application/json"

(e.g. dimm0 ~ dimm31)
Check the information of motherboard

curl -b cjar -k -X GET -H "Content-Type:application/json"

Check the information of FPDB

curl -b cjar -k -X GET -H "Content-Type:application/json"

Check the information of EXP

curl -b cjar -k -X GET -H "Content-Type:application/json"

Check the information of BP

curl -b cjar -k -X GET -H "Content-Type:application/json"

Check the information of pcie

curl -b cjar -k -X GET -H "Content-Type:application/json"

Check the information of pcie, shows 7 pcie slot

curl -b cjar -k -X GET -H "Content-Type:application/json"

(xxx should be pe0~pe4, e2a and e2b)



The system inventory structure is under the /xyz/openbmc_project/sensors hierarchy.
This interface allows monitoring of system attributes like temperature or altitude, and are represented similar to the inventory, by object paths under the top-level sensors object name. The path categorizes the sensor and shows what the sensor represents, but does not necessarily represent the physical topology of the system.

The following sensor hierarchies are recognized:

  • Temperature: Unit must be “DegreesC”.
  • Voltage: Unit must be “Volts”.
  • Fan_tach: Unit must be “RPMS”.

For example, all temperature sensors are under sensors/temperature whereas ambient temperature sensors would be sensors/temperature/ + /ambient_mb, /ambient_fpdb, /ambient_bp.

These are the common properties associated with all sensors:

  •  Value: current value of sensor
  • Units: units of value
  • WarningHigh & WarningLow: High & Low threshold for a warning error
  • CriticalHigh & CriticalLow: High & Low threshold for a critical error

All Sensor value properties are read-only.
To enumerate all sensors in the system:

curl -b jcar -k -X GET https://BMC_IP/xyz/openbmc_project/sensors/enumerate


Check the temperature of ambient sensor on Motherboard:

curl -b cjar -k -X GET https://BMC_IP/xyz/openbmc_project/sensors/temperature/ambient_mb


Check the temperature of ambient sensor on FPDB:

curl -b cjar -k -X GET https://BMC_IP/xyz/openbmc_project/sensors/temperature/ambient_fpdb


Check the temperature of ambient sensor on BP:

curl -b cjar -k -X GET https://BMC_IP/xyz/openbmc_project/sensors/temperature/ambient_bp


Check the temperature of cpu cores:

curl -b cjar -k -X GET https://BMC_IP/xyz/openbmc_project/sensors/temperature/p0_core7_temp

(e.g. cpu0/core7)



Check the voltage of power sequencer(UCD90160):

curl -b cjar -k -X GET https://BMC_IP/xyz/openbmc_project/sensors/voltage/voutx

(e.g. vout1 ~ vout13)
Check the voltage of ADC:

curl -b cjar -k -X GET https://BMC_IP/xyz/openbmc_project/sensors/voltage/iio_hwmon/<item>

Check the status of the Fan_tach:

curl -b cjar -k -X GET https://BMC_IP/xyz/openbmc_project/sensors/fan_tach/tach/fanxL

(e.g. fan1L ~ fan5L)

curl -b cjar -k -X GET https://BMC_IP/xyz/openbmc_project/sensors/fan_tach/tach/fanxH

(e.g. fan1H ~ fan5H)
Check the current speed of fans (PWM)

curl -b cjar -k -X GET https://BMC_IP//xyz/openbmc_project/sensors/pwm/speed/fanx



The system inventory structure is under the /xyz/openbmc_project/state hierarchy.
The OpenBMC is an interface to control and track the states of the different software
entities in a system. These interfaces will be the mechanism by which you determine the state of their corresponding instances, as well as reboot the BMC and hosts, turn power
on and off to the chassis. The interfaces are designed in a way to support  many to many
mappings of each interface.
There are three states to track and control on a BMC based server. The states below in () represents the actual parameter name as found in /xyz/openbmc_project/state/+/bmcX,/hostY,/chassisZ

where X,Y,Z are the instances (in most cases 0). For all three states, the software tracks a current state, and a requested transition.
1. BMC : The BMC has either started all required systemd services and reached it’s required target(Ready) or it’s on it’s way there (NotReady). Users can request a (Reboot) or (None).
2. Host : The host is either (Off), (Running), or it’s (Quiesced). Running simply implies that the processors are executing instructions. Users can request the host be in a (Off), (On), or (Reboot) state. More details on different Reboot options below. Quiesced means the host OS is in a quiesce state and the system should be checked for errors.

3. Chassis : The chassis is either (Off) or (On) This represents the state of power to the chassis. The Chassis being on is a pre-req to the Host being running. Users can request for the chassis to be (Off) or (On). A transition to one or the other is implied by the transition not matching the current state.
To enumerate all state items :

Check the status of the BMC:
 curl -b jcar -k -X GET https://BMC_IP/xyz/openbmc_project/state/bmc<instance>

Change the BMC transition states:

curl -b cjar -k -X PUT -H "Content-Type:application/json" -d '{"data":
"xyz.openbmc_project.State.BMC.Transition.None" }'



Check the status of the Host:

curl -b jcar -k -X GET https://BMC_IP/xyz/openbmc_project/state/host<instance>

Change the Host transition states:

curl -b cjar -k -X PUT -H "Content-Type:application/json" -d '{"data":
"xyz.openbmc_project.State.Host.Transition.On" }'



Check the status of the Chassis:

curl -b jcar -k -X GET https://BMC_IP/xyz/openbmc_project/state/chassis<instance>

Change the Chassis transition states:

curl -b cjar -k -X PUT -H "Content-Type:application/json" -d '{"data":
"xyz.openbmc_project.State.Chassis.Transition.On" }'


The system inventory structure is under the /xyz/openbmc_project/control hierarchy. Implement to specify power transition behavior on a BMC reset. The implementation may choose to only enforce the policy on a power loss or on both a power loss and BMC reboot.

To enumerate all controls in the system:

curl -b jcar -k -X GET https://BMC_IP/xyz/openbmc_project/led/physical/enumerate

The policy to adopt after the BMC reset:
1. AlwaysOn: Perform a complete power on process.
2. AlwaysOff: Remain powered off.
3. Restore: Restore power to last requested state recorded before the BMC was reset.

Check the status of the Power Restore Policy:

curl -b cjar -k -X GET https://BMC_IP/xyz/openbmc_project/control/host0/power_restore_policy


Change Power Restore Policy states:

curl -b cjar -k -X PUT -H "Content-Type:application/json" -d '{"data":
"xyz.openbmc_project.Control.Power.RestorePolicy.Policy.AlwaysOn" }'



LEDs that are present in the system can be managed by: BMC/Hardware controller/Operating system and always recommended that external users use only the LED groups. Describing the Physical LED here just for documenting it and strictly NOT to be used outside of the firmware code.
The system inventory structure is under the /xyz/openbmc_project/led/physical hierarchy. Each event is a separate object under this structure, referenced by name.

To enumerate all physical LED in the system:

curl -b jcar -k -X GET https://BMC_IP/xyz/openbmc_project/led/physical/enumerate

There are four kinds of LEDs to track and control on a BMC based server as follows:

  • Attention
  • Onboard
  • Platform
  • System

Control states of physical LED can be in:

  • On: LED is in solid on state
  • Off: LED is in off state
  • Blink: LED is blinking once per second.

Check the status of the Attention LED:

curl -b cjar -k -X GET -H "Content-Type:application/json"

Change a Attention LED states:

curl -b cjar -k -X PUT -H "Content-Type: application/json" -d '{"data":
 "xyz.openbmc_project.Led.Physical.Action.On" }'

Check the status of the Onboard LED:

curl -b cjar -k -X GET -H "Content-Type:application/json"

Change a Attention LED states:

curl -b cjar -k -X PUT -H "Content-Type: application/json" -d '{"data":
 "xyz.openbmc_project.Led.Physical.Action.On" }'


Check the status of the Platform LED:

curl -b cjar -k -X GET -H "Content-Type:application/json"

Change a Attention LED states:

curl -b cjar -k -X PUT -H "Content-Type: application/json" -d '{"data":
 "xyz.openbmc_project.Led.Physical.Action.On" }'

Check the status of the System LED:

curl -b cjar -k -X GET -H "Content-Type:application/json"

Change a Attention LED states:

curl -b cjar -k -X PUT -H "Content-Type: application/json" -d '{"data":
"xyz.openbmc_project.Led.Physical.Action.On" }'



The event log structure is under the /xyz/openbmc_project/logging/entry hierarchy. Each event is a separate object under this structure, referenced by number.
BMC and host firmware on POWER-based servers can report logs to the BMC. Typically, these logs are reported in cases where host firmware cannot start the OS, or cannot reliably log to the OS.
The properties associated with an error log are as follows:

  • Id: The error event entry id number.
  • Timestamp: Commit timestamp of the error event entry in milliseconds since 1970.
  • Severity: The severity of the error event entry.
  • Message: The message description of the error event entry.
  • AdditionalData: Additional information in the form of metadata field strings VAR=val
  • Resolved: Error resolution status.

To list all reported events:

curl -b cjar -k -X GET https://BMC_IP/xyz/openbmc_project/logging/entry/
 "data": [
 "message": "200 OK",
 "status": "ok"

To read a specific event log:

curl -b cjar -k -X GET https://BMC_IP/xyz/openbmc_project/logging/entry/1
 "Id": 1,
 "Message": "org.open_power.Host.Boot.Error.WatchdogTimedOut",
 "Resolved": 0,
 BARRELEYE-G2 BMC FW Specification
 "Severity": "xyz.openbmc_project.Logging.Entry.Level.Error",
 "Timestamp": 1510895953373,
 "message": "200 OK",
 "status": "ok"

Implement to allow the deletion of individual entries, but cannot clear all logs.
To delete an event log (log 1 in his example), call the delete method on the event:

curl -b cjar -k -X DELETE https://BMC_IP/xyz/openbmc_project/logging/entry/1



The system inventory structure is under the /xyz/openbmc_project/network hierarchy.

A Network Manager is a daemon which handles network management operations. It must implement the xyz/openbmc_project/network/SystemConfiguration .

When the network manager daemon comes up, it should create objects implementing physical link/virtual interfaces such as xyz/openbmc_project/network/+/EthernetInterface or /VLANInterface on the system.

IP address(v4 and v6) objects must be children objects of the physical/virtual interface object.
These are the interface associated to all network:

  • SystemConfiguration: This describes the system specific parameters.
  • EthernetInterface: This describes the interface specific parameters.
  • IP: This describes the ip address specific parameters.
  • IPProtocol: This describes the IP protocol type(IPv4/IPv6).
  • VLANInterface: This describes the VLAN specific properties.
  • Bond: This describes the interface bonding parameters.

To enumerate all networks in the system:

curl -b jcar -k -X GET https://BMC_IP/xyz/openbmc_project/network/enumerate 

Interface objects can be physical as well as virtual.
If the object is physical interface, it can’t be deleted, but if it is a virtual interface object it can be deleted.

curl -b cjar -k -X Delete https://BMC_IP/xyz/openbmc_project/network/<interfacename>

There can be multiple ip address objects under an interface object. These objects can be deleted by the delete function or be added by the add function.

To delete IPv4 object:

curl -b cjar -k -X Delete https://BMC_IP/xyz/openbmc_project/network/eth0/ipv4/<id>

To add IPv4 object and ip address:

curl -b cjar -k -X POST -H "Content-Type:application/json" -d '{"data":
 ["xyz.openbmc_project.Network.IP.Protocol.IPv4", " Address", PrefixLength, " Gateway"] }'

To delete IPv6 object:

curl -b cjar -k -X Delete https://BMC_IP/xyz/openbmc_project/network/eth0/ipv6/<id>

Have the system configuration related parameters at/xyz/openbmc_project/network/config


Software Versions

The system inventory structure is under the /xyz/openbmc_project/software hierarchy.

All version identifiers are implementation specific strings. No format should be assumed. Some software versions are a collection of images, each with their own version identifiers.

The xyz/openbmc_project/software/ExtendedVersion interface can be added to any software.

To enumerate all software in the system:

curl -b jcar -k -X GET https://BMC_IP/xyz/openbmc_project/software/enumerate

Check the status of the aggregation version:

curl -b cjar -k -X GET -H "Content-Type:application/json"



The system inventory structure is under the /xyz/openbmc_project/time hierarchy.

To enumerate all time in the system:

curl -b jcar -k -X GET https://BMC_IP/xyz/openbmc_project/time/enumerate

Check the status of the time owner:

curl -b cjar -k -X GET -H "Content-Type:application/json"

The possible owners of the time are as follows:

  • BMC: BMC alone owns system time.
  • Host: Host alone owns system time.
  • Both: BMC and host own system time.
  • Split: BMC and host maintain their own time.

Change the method of the owner:

curl -b cjar -k -X PUT -H "Content-Type:application/json" -d '{"data":
 "xyz.openbmc_project.Time.Owner.Owners.BMC" }'

Check the status of the time synchronization method:

curl -b cjar -k -X GET -H "Content-Type:application/json"

The possible methods of time synchronization are as follows:

  • NTP: Sync by using the Network Time Protocol.
  • Manual: Sync time manually.

To change the time synchronization method:

curl -b cjar -k -X PUT -H "Content-Type:application/json" -d '{"data":
 "xyz.openbmc_project.Time.Synchronization.Method.NTP" }'