27 Selecting an Initialization Manager
By default, the Yocto Project uses SysVinit as the initialization manager. There is also support for BusyBox init, a simpler implementation, as well as support for systemd, which is a full replacement for init with parallel starting of services, reduced shell overhead, increased security and resource limits for services, and other features that are used by many distributions.
Within the system, SysVinit and BusyBox init treat system components as
services. These services are maintained as shell scripts stored in the
/etc/init.d/
directory.
SysVinit is more elaborate than BusyBox init and organizes services in
different run levels. This organization is maintained by putting links
to the services in the /etc/rcN.d/
directories, where N/ is one
of the following options: “S”, “0”, “1”, “2”, “3”, “4”, “5”, or “6”.
Note
Each runlevel has a dependency on the previous runlevel. This dependency allows the services to work properly.
Both SysVinit and BusyBox init are configured through the /etc/inittab
file, with a very similar syntax, though of course BusyBox init features
are more limited.
In comparison, systemd treats components as units. Using units is a
broader concept as compared to using a service. A unit includes several
different types of entities. Service
is one of the types of entities.
The runlevel concept in SysVinit corresponds to the concept of a target
in systemd, where target is also a type of supported unit.
In systems with SysVinit or BusyBox init, services load sequentially (i.e. one by one) during init and parallelization is not supported. With systemd, services start in parallel. This method can have an impact on the startup performance of a given service, though systemd will also provide more services by default, therefore increasing the total system boot time. systemd also substantially increases system size because of its multiple components and the extra dependencies it pulls.
On the contrary, BusyBox init is the simplest and the lightest solution and also comes with BusyBox mdev as device manager, a lighter replacement to udev, which SysVinit and systemd both use.
The “Selecting a Device Manager” chapter has more details about device managers.
27.1 Using SysVinit with udev
SysVinit with the udev device manager corresponds to the default setting in Poky. This corresponds to setting:
INIT_MANAGER = "sysvinit"
27.2 Using BusyBox init with BusyBox mdev
BusyBox init with BusyBox mdev is the simplest and lightest solution for small root filesystems. All you need is BusyBox, which most systems have anyway:
INIT_MANAGER = "mdev-busybox"
27.3 Using systemd
The last option is to use systemd together with the udev device manager. This is the most powerful and versatile solution, especially for more complex systems:
INIT_MANAGER = "systemd"
This will enable systemd and remove sysvinit components from the image. See meta/conf/distro/include/init-manager-systemd.inc for exact details on what this does.
27.3.1 Controling systemd from the target command line
Here is a quick reference for controling systemd from the command line on the
target. Instead of opening and sometimes modifying files, most interaction
happens through the systemctl
and journalctl
commands:
systemctl status
: show the status of all servicessystemctl status <service>
: show the status of one servicesystemctl [start|stop] <service>
: start or stop a servicesystemctl [enable|disable] <service>
: enable or disable a service at boot timesystemctl list-units
: list all available unitsjournalctl -a
: show all logs for all servicesjournalctl -f
: show only the last log entries, and keep printing updates as they arrivejournalctl -u
: show only logs from a particular service
27.3.2 Using systemd-journald without a traditional syslog daemon
Counter-intuitively, systemd-journald
is not a syslog runtime or provider,
and the proper way to use systemd-journald
as your sole logging mechanism is to
effectively disable syslog entirely by setting these variables in your distribution
configuration file:
VIRTUAL-RUNTIME_syslog = ""
VIRTUAL-RUNTIME_base-utils-syslog = ""
Doing so will prevent rsyslog
/ busybox-syslog
from being pulled in by
default, leaving only systemd-journald
.
27.3.3 Summary
The Yocto Project supports three different initialization managers, offering increasing levels of complexity and functionality:
BusyBox init |
SysVinit |
systemd |
|
---|---|---|---|
Size |
Small |
Small |
Big [1] |
Complexity |
Small |
Medium |
High |
Support for boot profiles |
No |
Yes (“runlevels”) |
Yes (“targets”) |
Services defined as |
Shell scripts |
Shell scripts |
Description files |
Starting services in parallel |
No |
No |
Yes |
Setting service resource limits |
No |
No |
Yes |
Support service isolation |
No |
No |
Yes |
Integrated logging |
No |
No |
Yes |