| .. SPDX-License-Identifier: CC-BY-SA-2.0-UK |
| |
| .. _init-manager: |
| |
| Selecting an Initialization Manager |
| *********************************** |
| |
| By default, the Yocto Project uses :wikipedia:`SysVinit <Init#SysV-style>` as |
| the initialization manager. There is also support for BusyBox init, a simpler |
| implementation, as well as support for :wikipedia:`systemd <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 |
| :wikipedia:`udev <Udev>`, which SysVinit and systemd both use. |
| |
| The ":ref:`device-manager`" chapter has more details about device managers. |
| |
| Using SysVinit with udev |
| ========================= |
| |
| SysVinit with the udev device manager corresponds to the |
| default setting in Poky. This corresponds to setting:: |
| |
| INIT_MANAGER = "sysvinit" |
| |
| 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" |
| |
| 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 :yocto_git:`meta/conf/distro/include/init-manager-systemd.inc |
| </poky/tree/meta/conf/distro/include/init-manager-systemd.inc>` for exact |
| details on what this does. |
| |
| 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 services |
| - ``systemctl status <service>``: show the status of one service |
| - ``systemctl [start|stop] <service>``: start or stop a service |
| - ``systemctl [enable|disable] <service>``: enable or disable a service at boot time |
| - ``systemctl list-units``: list all available units |
| - ``journalctl -a``: show all logs for all services |
| - ``journalctl -f``: show only the last log entries, and keep printing updates as they arrive |
| - ``journalctl -u``: show only logs from a particular service |
| |
| 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``. |
| |
| Summary |
| ------- |
| |
| The Yocto Project supports three different initialization managers, offering |
| increasing levels of complexity and functionality: |
| |
| .. list-table:: |
| :widths: 40 20 20 20 |
| :header-rows: 1 |
| |
| * - |
| - BusyBox init |
| - SysVinit |
| - systemd |
| * - Size |
| - Small |
| - Small |
| - Big [#footnote-systemd-size]_ |
| * - 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 |
| |
| .. [#footnote-systemd-size] Using systemd increases the ``core-image-minimal`` |
| image size by 160\% for ``qemux86-64`` on Mickledore (4.2), compared to SysVinit. |