Google celebrates Women's History Month. See how.

Sysmgr configuration

sysmgr is one of the two major pieces of Components v1 (appmgr being the other). It is responsible for hosting the sys realm that contains global system services.

At runtime, sysmgr loads all files present under /config/data in its namespace and parses them using the format described below. This directory is provided to sysmgr because it uses the 'config-data' feature in its component manifest, sysmgr.cmx. For more details, see the docs on the config-data feature.

sysmgr services are registered with a GN config_data target that is defined and included in product configurations to include an extra file in sysmgr's /config/data directory.

For example:

config_data("my_service_config") {
  for_pkg = "sysmgr"
  sources = "my_service.config"
}

And then in the appropriate product.gni:

base_package_labels += [
  ...
  "//path/to:my_service_config",
  ...
]

sysmgr configuration format

sysmgr's configuration files are in JSON format. Each config file should have a single top-level JSON object, and the following keys are supported:

  • services
  • startup_services
  • apps

The contents of all sysmgr config files are read from sysmgr's /config/data directory and merged at runtime to form sysmgr's overall configuration.

services

This is the most common configuration key and where most of sysmgr's configuration comes from. Each entry in the services map consists of a service name and the component URL which provides it. Optionally, command line arguments can be provided to the component by using an array instead of a string value.

{
  "services": {
    "fuchsia.foo.Service": "fuchsia-pkg://fuchsia.com/foo#meta/foo.cmx",
    "fuchsia.bar.Service": [
        "fuchsia-pkg://fuchsia.com/bar#meta/bar.cmx", "arg1", "arg2", "arg3"
    ]
  }
}

The combined services map across all config files defines the list of services that are available in the sys realm and that are available for other components running in the sys realm to request in their component manifests. It is not possible to add services to the sys realm in any other way; the list of services is fixed at realm creation time.

Components in the services map are started lazily as the services they provide are connected to. In other words, in the example above foo.cmx will not be started until another component attempts to connect to fuchsia.foo.Service. If your component needs to be started eagerly, see startup_services or apps below.

startup_services and apps

Both of these keys perform similar functions; they cause sysmgr to eagerly launch components right after it creates the sys realm. The key difference is that startup_services should be used to eagerly launch a component which is providing services to the sys realm (i.e. there is an entry in the services map that uses the component), whereas apps should be used to eagerly launch a component which does not provide any services to sys.

For example, the following configuration would cause sysmgr to eagerly launch the component that provides fuchsia.foo.Service (the same as if another component attempted to connect to the service) as well as an instance of bar.cmx and baz.cmx with the given arguments:

{
  "services": {
    "fuchsia.foo.Service": "fuchsia-pkg://fuchsia.com/foo#meta/foo.cmx"
  },
  "startup_services": [
    "fuchsia.foo.Service"
  ],
  "apps": [
    "fuchsia-pkg://fuchsia.com/bar#meta/bar.cmx",
    [ "fuchsia-pkg://fuchsia.com/baz#meta/baz.cmx", "arg1", "arg2", "arg3" ]
  ]
}

It is important to not mix up usage of startup_services and apps. Using apps instead of startup_services can result in sysmgr starting two separate instances of your component, which is likely unintended. For example, the example below would result in two instances of foo.cmx, one started eagerly and the other started lazily when another component connects to fuchsia.foo.Service:

// WARNING: This is an example of what NOT to do.
{
  "services": {
    "fuchsia.foo.Service": "fuchsia-pkg://fuchsia.com/foo#meta/foo.cmx"
  }
  "apps": [
    "fuchsia-pkg://fuchsia.com/foo#meta/foo.cmx"
  ]
}