<<../../_common/intro/_components_intro.md>>
<<../../_common/intro/_components_manager.md>>
<<../../_common/intro/_components_capabilities.md>>
<<../../_common/intro/_components_organization.md>>
In this exercise, you'll explore the component instance tree and look in detail at capability routing in action using some core system components.
<<../_common/_start_femu.md>>
Open another terminal window and use the component list
command to dump the
system's component tree:
ffx component list
You should see output similar to the (truncated) list below:
/
/bootstrap
/bootstrap/archivist
/bootstrap/base_resolver
/bootstrap/console
/bootstrap/console-launcher
/bootstrap/decompressor
/bootstrap/device_name_provider
/bootstrap/driver_manager
/bootstrap/fshost
/bootstrap/miscsvc
/bootstrap/netsvc
/bootstrap/power_manager
/bootstrap/ptysvc
/bootstrap/pwrbtn-monitor
/bootstrap/shutdown_shim
/bootstrap/svchost
/bootstrap/sysinfo
/bootstrap/virtual_console
/core
/core/activity
/core/appmgr
...
/core/debug_serial
/core/detect
/core/font_provider
/core/log-stats
/core/remote-control
/core/remote-diagnostics-bridge
/core/sampler
/core/system-update-committer
/core/temperature-logger
/core/test_manager
/core/full-resolver
/startup
This list represents the component instance tree, with organizational
components like bootstrap
, core
, and startup
forming sub-trees
underneath the root.
The component show
command provides more details about each component.
Use this command to see the details of http-client
— a component that provides
an HTTP request service:
ffx component show http-client.cm
The command outputs the following report:
Moniker: /core/network/http-client
URL: #meta/http-client.cm
Type: CML static component
Component State: Resolved
Incoming Capabilities: config
fuchsia.logger.LogSink
fuchsia.net.name.Lookup
fuchsia.posix.socket.Provider
pkg
Exposed Capabilities: fuchsia.net.http.Loader
Merkle root: d9e73f5b061f2f227e596e2e0079ff3a095fc69e192cf85e0d7621826c76356c
Execution State: Running
Start reason: '/core/feedback' requested capability 'fuchsia.net.http.Loader'
Running since: ...
Job ID: 41268
Process ID: 41311
Outgoing Capabilities: fuchsia.net.http.Loader
Notice a few of the details reported here:
- A unique identifier for the component instance (called a moniker).
- The package URL where this component was loaded from.
- The execution state of the component.
- The current job/process ID where the instance is running.
- A set of requested and exposed capabilities for the component.
In the previous output, there are three capability groups listed:
- Incoming Capabilities: Capabilities that the component declares with
use
. These are provided to the component through its namespace. - Outgoing Capabilities: Capabilities the component has published to its outgoing directory.
- Exposed Capabilities: Capabilities the component declares with
expose
. These are the component's exposed services.
One of the capabilities exposed by http-client
to its parent realm is
fuchsia.net.http.Loader.
This enables other components to issue HTTP requests.
Use the component select
command determine how many components interact with
this capability:
ffx component select capability fuchsia.net.http.Loader
The command lists all the matching components:
Exposed:
/core/network/http-client
/core/network
Used:
/core/cobalt
/core/feedback
/core
This indicates that the cobalt
and feedback
components use this capability
(i.e., have it listed under Incoming Capabilities). The common ancestor
between these components is core
, which handles the routing of this capability
to the necessary children.
A lot of components use the fuchsia.logger.LogSink
capability,
which is needed to read the system logs. You can list them using the same
component select
search for incoming capabilities.
Can you find which component exposes this capability?