What is systemd?
systemd is a suite of basic building blocks for a Linux system. It provides a system and service manager that runs as PID 1 and starts the rest of the system.
https://www.freedesktop.org/wiki/Software/systemd
systemd is now the init process running as PID 1 as indicated above.
/sbin/init
was the actual init process of Linux (also known as System V init boot system),
it is now replaced with /usr/lib/systemd
in many Linux distributions.
After the kernel is initialized, it launches systemd process. Detailed Linux boot process is described in here. This post only handles in-systemd details.
systemd provides parallelized boot, uses sockets and d-bus activation
for starting services, offers on-demand daemon launch, etc.
We can easily attach our own daemons to systemd by creating service
scripts in either /lib/systemd/system
or /etc/systemd/system
directories.
For the daemons to be automatically and normally launched, we need to
acknowledge the systemd launch process, which this post will investigate
more.
systemd boot process in Linux
The following chart is a structural overview of well-known systemd units and their position in the boot-up logic, according to freedesktop. The chart comes from here.
{: .center-image width=“900px”}
The first target of systemd to be launched is default.target
, which is typically a symbolically linked to graphical.target
or multi-user.target
(depending on whether system is configured for a GUI or only a text console).
If you want to add your own system service into systemd hierarchy, it would be usally be added multi-user.target
, like for example:
/etc/systemd/system/myservice.service
[Unit]
Description=My Service
[Service]
ExecStart=/usr/bin/echo 'Hello'
[Install]
WantedBy=multi-user.target
as illustrated in freedesktop systemd.target manual.
timers.target
, paths.target
, and sockets.target
are special targets for the initialization of timers, paths, and sockets, respectively.
These targets have default dependencies: target unites are automatically configured with:
After=sysinit.target
,Requires=sysinit.target
,Before=shutdown.target
,- and
Conflicts=shutdown.target
.
Those default dependencies can be ignored with the following statement in the unit: DefaultDependencies=no
.
For example, udev.service
uses two sockets: systemd-udevd-control.socket
and systemd-udevd-kernel.socket
. In the chart above, udev.service
should be initialized in the stage before sysinit.target
.
Therefore, all udev.service
, systemd-udevd-control.socket
, and systemd-udevd-kernel.socket
have DefaultDependencies=no
statement to avoid those default dependencies.
There are more special systemd units,
such like network.target
or network-online.target
,
by default freedesktop does not show which position those targets sit in.
[ Source: https://insujang.github.io/2018-11-22/systemd-boot-process/ ]
Keine Kommentare:
Kommentar veröffentlichen