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'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" ] }