OpenBMC & Systemd

OpenBMC uses systemd to manage all processes. It has its own set of target and service units to control which processes are started. There is a lot of documentation on systemd and to do OpenBMC state work, you're going to have to read some of it. Here's the highlights:

Unit - Units are the basic framework of all systemd work. Service - Services are a type of unit, that define the processes to be run and execute. Target - Targets are another type of unit, they have two purposes:

  1. Define synchronization points among services.
  2. Define the services that get run for a given target.

On an OpenBMC system, you can go to /lib/systemd/system/ and see all of the systemd units on the system. You can easily cat these files to start looking at the relationships among them. Service files can also be found in /etc/systemd/system and /run/systemd/system as well.

systemctl is the main tool you use to interact with systemd and its units.


Initial Power

When an OpenBMC system first has power applied, it starts the "default.target" unless an alternate target is specified on the kernel command line. In Phosphor OpenBMC, there is a link from default.target to multi-user.target. Within Phosphor OpenBMC, obmc-standby.target is wanted by multi-user.target and is where you'll find all Phosphor services associated.

Server Power On

When OpenBMC is used within a server, the obmc-chassis-start@.target is what drives the boot of the system.

If you dig into its .wants relationship, you'll see the following in the file system

ls -1 /lib/systemd/system/obmc-chassis-start@0.target.wants/
obmc-power-chassis-on@0.target
obmc-start-host@0.service
...

You can see we have another target in here, obmc-power-chassis-on@0.target, along with some services that will all be started by systemd when you do a "systemctl start obmc-chassis-start@0.target".

The target has corresponding services associated with it:

ls -1 /lib/systemd/system/obmc-power-chassis-on\@0.target.wants/
op-power-start@0.service
op-wait-power-on@0.service

So basically, if you run systemctl start obmc-chassis-start@0.target then systemd will start execution of all associated services.

The services have dependencies within them that control the execution of each service (for example, the op-power-start.service will run prior to the op-wait-power-on.service). These dependencies are set using targets and the Wants,Before,After keywords.

Server Power Off

The server power off function is encapsulated in the obmc-chassis-stop@0.target. You can do a similar exercise with the power on to see its dependent services.

Systemd Control in OpenBMC

There are a collection of services within OpenBMC that interact with systemd and its unit files, providing somewhat of an abstraction layer from the user of the OpenBMC system and systemd. See the state interfaces for more information on this function.

For example, if you wanted to execute the server power on function, you would do the following:

busctl set-property xyz.openbmc_project.State.Host /xyz/openbmc_project/state/host0 xyz.openbmc_project.State.Host RequestedHostTransition s xyz.openbmc_project.State.Host.Transition.On

Underneath the covers, this is calling systemd with obmc-chassis-start@0.target