diff --git a/Makefile.am b/Makefile.am
index 2a1a08ce9b..8569983a15 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -193,8 +193,8 @@ SHUTDOWN_TARGET_WANTS =
LOCAL_FS_TARGET_WANTS =
MULTI_USER_TARGET_WANTS =
SYSINIT_TARGET_WANTS =
-BASIC_TARGET_WANTS =
SOCKETS_TARGET_WANTS =
+TIMERS_TARGET_WANTS =
SYSTEM_UNIT_ALIASES =
USER_UNIT_ALIASES =
@@ -211,8 +211,8 @@ install-target-wants-hook:
what="$(LOCAL_FS_TARGET_WANTS)" && wants=local-fs.target && $(add-wants)
what="$(MULTI_USER_TARGET_WANTS)" && wants=multi-user.target && $(add-wants)
what="$(SYSINIT_TARGET_WANTS)" && wants=sysinit.target && $(add-wants)
- what="$(BASIC_TARGET_WANTS)" && wants=basic.target && $(add-wants)
what="$(SOCKETS_TARGET_WANTS)" && wants=sockets.target && $(add-wants)
+ what="$(TIMERS_TARGET_WANTS)" && wants=timers.target && $(add-wants)
define add-wants
[ -z "$$what" ] || ( \
@@ -371,6 +371,8 @@ dist_systemunit_DATA = \
units/sigpwr.target \
units/sleep.target \
units/sockets.target \
+ units/timers.target \
+ units/paths.target \
units/suspend.target \
units/swap.target \
units/systemd-initctl.socket \
@@ -3916,7 +3918,7 @@ SYSINIT_TARGET_WANTS += \
systemd-tmpfiles-setup.service \
systemd-sysctl.service \
systemd-ask-password-console.path
-BASIC_TARGET_WANTS += \
+TIMERS_TARGET_WANTS += \
systemd-tmpfiles-clean.timer
if HAVE_SYSV_COMPAT
@@ -3938,6 +3940,8 @@ SYSTEM_UNIT_ALIASES += \
USER_UNIT_ALIASES += \
$(systemunitdir)/shutdown.target shutdown.target \
$(systemunitdir)/sockets.target sockets.target \
+ $(systemunitdir)/timers.target timers.target \
+ $(systemunitdir)/paths.target paths.target \
$(systemunitdir)/bluetooth.target bluetooth.target \
$(systemunitdir)/printer.target printer.target \
$(systemunitdir)/sound.target sound.target
diff --git a/man/bootup.xml b/man/bootup.xml
index 65923528d4..a596e85b70 100644
--- a/man/bootup.xml
+++ b/man/bootup.xml
@@ -50,18 +50,20 @@
Description
- A number of different components are involved in the
- system boot. Immediately after power-up, the system
- BIOS will do minimal hardware initialization, and hand
- control over to a boot loader stored on a persistent
- storage device. This boot loader will then invoke an
- OS kernel from disk (or the network). In the Linux
- case this kernel now (optionally) extracts and
+ A number of different components are involved in
+ the system boot. Immediately after power-up, the
+ system BIOS will do minimal hardware initialization,
+ and hand control over to a boot loader stored on a
+ persistent storage device. This boot loader will then
+ invoke an OS kernel from disk (or the network). In the
+ Linux case this kernel (optionally) extracts and
executes an initial RAM disk image (initrd) such as
dracut8
- which looks for the root file system. After the root
- file system is found and mounted the initrd hands over
- control to the system manager (such as
+ which looks for the root file system (possibly using
+ systemd1
+ for this). After the root file system is found and
+ mounted the initrd hands over control to the host's
+ system manager (such as
systemd1)
stored on the OS image which is then responsible for
probing all remaining hardware, mounting all necessary
@@ -132,35 +134,35 @@
v
sysinit.target
|
- _________________/|\___________________
- / | \
- | | |
- v | v
- (various | rescue.service
- sockets...) | |
- | | v
- v | rescue.target
- sockets.target |
- | |
- \_________________ |
- \|
+ ____________________________________/|\________________________________________
+ / | | | \
+ | | | | |
+ v v | v v
+ (various (various | (various rescue.service
+ timers...) paths...) | sockets...) |
+ | | | | v
+ v v | v rescue.target
+ timers.target paths.target | sockets.target
+ | | | |
+ \__________________|_________________ | ___________________/
+ \|/
v
basic.target
|
- __________________________________/| emergency.service
- / | | |
- | | | v
- v v v emergency.target
- display- (various system (various system
- manager.service services services)
- | required for |
- | graphical UIs) v
- | | multi-user.target
- | | |
- \_______________ | _________________/
+ ____________________________________/| emergency.service
+ / | | |
+ | | | v
+ v v v emergency.target
+ display- (various system (various system
+ manager.service services services)
+ | required for |
+ | graphical UIs) v
+ | | multi-user.target
+ | | |
+ \_________________ | _________________/
\|/
v
- graphical.target
+ graphical.targetTarget units that are commonly used as boot
targets are emphasized. These
@@ -174,23 +176,41 @@
- Initrd System Manager Bootup
- The default target in the initrd is the initrd.target. The bootup process is
- identical to the System Manager Bootup until it reaches basic.target. From there,
- systemd approaches the special initrd.target. If the root device can be mounted at
- /sysroot, the sysroot.mount unit becomes active and the initrd-root-fs.target is
- reached.
- The initrd-parse-etc.service scans /sysroot/etc/fstab for a possible /usr mountpoint
- and additional entries marked with the x-initrd.mount option.
- All entries found are mounted below /sysroot, and the initrd-fs.target is reached.
- The initrd-cleanup.service isolates to the initrd-switch-root.target, where cleanup
- services can run. As the very last step, the initrd-switch-root.service is activated,
- which will cause the system to switch its root to /sysroot.
+ Bootup in the Initial RAM Disk (initrd)
+ The initial RAM disk implementation (initrd) can
+ be set up using systemd as well. In this case boot up
+ inside the initrd follows the following
+ structure.
+
+ The default target in the initrd is
+ initrd.target. The bootup process
+ begins identical to the system manager bootup (see
+ above) until it reaches
+ basic.target. From there, systemd
+ approaches the special target
+ initrd.target. If the root device
+ can be mounted at /sysroot, the
+ sysroot.mount unit becomes active
+ and initrd-root-fs.target is
+ reached. The service
+ initrd-parse-etc.service scans
+ /sysroot/etc/fstab for a possible
+ /usr mount point and additional
+ entries marked with the
+ x-initrd.mount option. All
+ entries found are mounted below
+ /sysroot, and
+ initrd-fs.target is reached. The
+ service initrd-cleanup.service
+ isolates to the
+ initrd-switch-root.target, where
+ cleanup services can run. As the very last step, the
+ initrd-switch-root.service is
+ activated, which will cause the system to switch its
+ root to /sysroot.
-
- (identical to System Manager Bootup)
- :
+ : (beginning identical to above)
:
v
basic.target
@@ -203,13 +223,13 @@
| initrd-root-fs.target
| |
| v
- | initrd-parse-etc.service
- (custom initrd services) |
- | v
+ v initrd-parse-etc.service
+ (custom initrd |
+ services...) v
| (sysroot-usr.mount and
| various mounts marked
| with fstab option
- | x-initrd.mount)
+ | x-initrd.mount...)
| |
| v
| initrd-fs.target
@@ -225,11 +245,11 @@
|
v
______________________/|
- / |
+ / v
| initrd-udevadm-cleanup-db.service
- | |
- (custom initrd services) |
- | |
+ v |
+ (custom initrd |
+ services...) |
\______________________ |
\|
v
@@ -239,17 +259,16 @@
initrd-switch-root.service
|
v
- switch-root
-
+ Transition to Host OSSystem Manager Shutdown
- System shutdown also consists of various target
- units with some minimal ordering structure
- applied:
+ System shutdown with systemd also consists of
+ various target units with some minimal ordering
+ structure applied:
diff --git a/man/systemd.special.xml b/man/systemd.special.xml
index 67a81b639b..8a7242662d 100644
--- a/man/systemd.special.xml
+++ b/man/systemd.special.xml
@@ -73,6 +73,7 @@
network.target,
nss-lookup.target,
nss-user-lookup.target,
+ paths.target,
poweroff.target,
printer.target,
reboot.target,
@@ -97,6 +98,7 @@
syslog.socket,
system-update.target,
time-sync.target,
+ timers.target,
umount.target
@@ -116,22 +118,23 @@
basic.targetA special target unit
- covering early boot-up.
+ covering basic boot-up.
systemd automatically
adds dependencies of the types
- Requires and After for this
- target unit to all SysV
- service units configured for
- runlevel 1 to 5.
- Usually this should pull-in
- all sockets, mount points,
- swap devices and other basic
+ Requires=
+ and After=
+ for this target unit to all
+ services (except for those
+ with
+ DefaultDependencies=no).
+
+ Usually this should
+ pull-in all mount points, swap
+ devices, sockets, timers, and
+ path units and other basic
initialization necessary for
- the general purpose
- daemons. Most normal daemons
- should have dependencies of
- type After and Requires on
- this unit.
+ general purpose
+ daemons.
@@ -139,9 +142,15 @@
This target is started
automatically as soon as a
- bluetooth controller is
+ Bluetooth controller is
plugged in or becomes
available at boot.
+
+ This may be used to pull
+ in Bluetooth management
+ daemons dynamically when
+ Bluetooth hardware is
+ found.
@@ -169,7 +178,7 @@
dbus.serviceA special unit for the
- D-Bus system bus. As soon as
+ D-Bus bus daemon. As soon as
this service is fully started
up systemd will connect to it
and register its
@@ -182,7 +191,7 @@
A special unit for the
D-Bus system bus socket. All
units with
- Type=dbus
+ Type=dbus
automatically gain a
dependency on this
unit.
@@ -198,6 +207,7 @@
multi-user.target
or
graphical.target.
+
The default unit systemd
starts at bootup can be
overridden with the
@@ -247,8 +257,10 @@
getty.targetA special target unit
- that pulls in all local TTY
- getty instances.
+ that pulls in statically
+ configured local TTY
+ getty
+ instances.
@@ -261,11 +273,17 @@
multi-user.target.
Units that are needed
- for graphical login shall add
- Wants dependencies for their
- unit to this unit (or
+ for graphical logins shall add
+ Wants=
+ dependencies for their unit to
+ this unit (or
multi-user.target)
- during installation.
+ during installation. This is
+ best configured via
+ WantedBy=graphical.target
+ in the unit's
+ [Install]
+ section.
@@ -290,7 +308,13 @@
halt.targetA special target unit
- for shutting down and halting the system.
+ for shutting down and halting
+ the system. Note that this
+ target is distinct from
+ poweroff.target
+ in that it generally really
+ just halts the system rather
+ than powering it down.
Applications wanting to
halt the system should start
@@ -300,16 +324,17 @@
initrd-fs.target
- systemd automatically
- adds dependencies of type
- Before to sysroot-usr.mount and
- all mount points fround in
+ systemd-fstab-generator3
+ automatically adds
+ dependencies of type
+ Before= to
+ sysroot-usr.mount
+ and all mount points fround in
/etc/fstab
that have the
and
mount options set.
- See also systemd-fstab-generator.
@@ -338,20 +363,21 @@
local-fs.target
- systemd automatically
+ systemd-fstab-generator3
+ automatically adds
+ dependencies of type
+ Before= to
+ all mount units that refer to
+ local mount points for this
+ target unit. In addition, it
adds dependencies of type
- After to all mount units that
- refer to local mount points
- for this target unit. In
- addition, systemd adds
- dependencies of type Wants to
+ Wants= to
this target unit for those
mounts listed in
/etc/fstab
that have the
- and
-
- mount options set.
+ mount
+ option set.
@@ -377,9 +403,15 @@
Units that are needed
for a multi-user system shall
- add Wants dependencies to
- this unit for their unit during
- installation.
+ add Wants=
+ dependencies for their unit to
+ this unit during
+ installation. This is best
+ configured via
+ WantedBy=multi-uer.target
+ in the unit's
+ [Install]
+ section.
@@ -387,10 +419,10 @@
systemd automatically
adds dependencies of type
- After for this target unit to
- all SysV init script service
- units with an LSB header
- referring to the
+ After= for
+ this target unit to all SysV
+ init script service units with
+ an LSB header referring to the
$network
facility.
@@ -418,7 +450,8 @@
nss-user-lookup.target
should be used. systemd
automatically adds
- dependencies of type After for
+ dependencies of type
+ After= for
this target unit to all SysV
init script service units with
an LSB header referring to the
@@ -440,6 +473,29 @@
should be used.
+
+ paths.target
+
+ A special target unit
+ that sets up all path units
+ (see
+ systemd.path5
+ for details) that shall be
+ active after boot.
+
+ It is recommended that
+ path units installed by
+ applications get pulled in via
+ Wants=
+ dependencies from this
+ unit. This is best configured
+ via a
+ WantedBy=paths.target
+ in the path unit's
+ [Install]
+ section.
+
+ poweroff.target
@@ -463,6 +519,12 @@
printer is plugged in or
becomes available at
boot.
+
+ This may be used to pull
+ in printer management
+ daemons dynamically when
+ printer hardware is
+ found.
@@ -490,10 +552,10 @@
systemd automatically
adds dependencies of type
- After for this target unit to
- all SysV init script service
- units with an LSB header
- referring to the
+ After= for
+ this target unit to all SysV
+ init script service units with
+ an LSB header referring to the
$remote_fs
facility.
@@ -525,11 +587,14 @@
initrd-root-fs.target
- systemd automatically
- adds dependencies of type
- Before to the sysroot.mount unit,
- which is generated from the kernel command
- line by the systemd-fstab-generator.
+ systemd-fstab-generator3
+ automatically adds
+ dependencies of type
+ Before= to
+ the
+ sysroot.mount
+ unit, which is generated from
+ the kernel command line.
@@ -538,10 +603,10 @@
systemd automatically
adds dependencies of type
- After for this target unit to
- all SysV init script service
- units with an LSB header
- referring to the
+ After= for
+ this target unit to all SysV
+ init script service units with
+ an LSB header referring to the
$portmap
facility.
@@ -574,20 +639,12 @@
Services that shall be
terminated on system shutdown
- shall add Conflicts
+ shall add Conflicts=
dependencies to this unit for
their service unit, which is
implicitly done when
DefaultDependencies=yes
is set (the default).
-
- systemd automatically
- adds dependencies of type
- Conflicts to this target unit
- for all SysV init script
- service units that shall be
- terminated in SysV runlevels 0
- or 6.
@@ -607,7 +664,9 @@
A special target unit
that is pulled in by
suspend.target,
- hibernate.target and hybrid-sleep.target
+ hibernate.target
+ and
+ hybrid-sleep.target
and may be used to hook units
into the sleep state
logic.
@@ -621,20 +680,35 @@
smartcard controller is
plugged in or becomes
available at boot.
+
+ This may be used to pull
+ in printer management
+ daemons dynamically when
+ smartcard hardware is
+ found.sockets.targetA special target unit
- that sets up all service
- sockets.
+ that sets up all socket
+ units.(see
+ systemd.socket5
+ for details) that shall be
+ active after boot.
Services that can be
socket-activated shall add
- Wants dependencies to this
- unit for their socket unit
- during installation.
+ Wants=
+ dependencies to this unit for
+ their socket unit during
+ installation. This is best
+ configured via a
+ WantedBy=sockets.target
+ in the socket unit's
+ [Install]
+ section.
@@ -645,6 +719,11 @@
sound card is plugged in or
becomes available at
boot.
+
+ This may be used to pull
+ in audio management daemons
+ dynamically when printer
+ hardware is found.
@@ -710,14 +789,37 @@
systemd automatically
adds dependencies of type
- After for this target unit to
- all SysV init script service
- units with an LSB header
- referring to the
+ After= for
+ this target unit to all SysV
+ init script service units with
+ an LSB header referring to the
$time
facility.
+
+ timers.target
+
+ A special target unit
+ that sets up all timer
+ units (see
+ systemd.timer5
+ for details) that shall be
+ active after boot.
+
+ It is recommended that
+ timer units installed by
+ applications get pulled in via
+ Wants=
+ dependencies from this
+ unit. This is best configured
+ via
+ WantedBy=timers.target
+ in the timer unit's
+ [Install]
+ section.
+
+ umount.target
@@ -788,7 +890,7 @@
systemd.service5,
systemd.socket5,
systemd.target5,
- bootup7
+ bootup7,
systemd-fstab-generator8
diff --git a/src/core/path.c b/src/core/path.c
index 295e5cdf0e..ff49c069ee 100644
--- a/src/core/path.c
+++ b/src/core/path.c
@@ -361,12 +361,12 @@ static int path_add_default_dependencies(Path *p) {
assert(p);
- if (UNIT(p)->manager->running_as == SYSTEMD_SYSTEM) {
- r = unit_add_dependency_by_name(UNIT(p), UNIT_BEFORE,
- SPECIAL_BASIC_TARGET, NULL, true);
- if (r < 0)
- return r;
+ r = unit_add_dependency_by_name(UNIT(p), UNIT_BEFORE,
+ SPECIAL_PATHS_TARGET, NULL, true);
+ if (r < 0)
+ return r;
+ if (UNIT(p)->manager->running_as == SYSTEMD_SYSTEM) {
r = unit_add_two_dependencies_by_name(UNIT(p), UNIT_AFTER, UNIT_REQUIRES,
SPECIAL_SYSINIT_TARGET, NULL, true);
if (r < 0)
diff --git a/src/core/service.c b/src/core/service.c
index fa8a1cb039..98266a5a90 100644
--- a/src/core/service.c
+++ b/src/core/service.c
@@ -1148,6 +1148,16 @@ static int service_add_default_dependencies(Service *s) {
SPECIAL_SOCKETS_TARGET, NULL, true);
if (r < 0)
return r;
+
+ r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_AFTER, UNIT_REQUIRES,
+ SPECIAL_TIMERS_TARGET, NULL, true);
+ if (r < 0)
+ return r;
+
+ r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_AFTER, UNIT_REQUIRES,
+ SPECIAL_PATHS_TARGET, NULL, true);
+ if (r < 0)
+ return r;
}
/* Second, activate normal shutdown */
diff --git a/src/core/socket.c b/src/core/socket.c
index a3e3631dac..31f4bf49b6 100644
--- a/src/core/socket.c
+++ b/src/core/socket.c
@@ -331,11 +331,13 @@ static int socket_add_default_dependencies(Socket *s) {
int r;
assert(s);
- if (UNIT(s)->manager->running_as == SYSTEMD_SYSTEM) {
- if ((r = unit_add_dependency_by_name(UNIT(s), UNIT_BEFORE, SPECIAL_SOCKETS_TARGET, NULL, true)) < 0)
- return r;
+ r = unit_add_dependency_by_name(UNIT(s), UNIT_BEFORE, SPECIAL_SOCKETS_TARGET, NULL, true);
+ if (r < 0)
+ return r;
- if ((r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SYSINIT_TARGET, NULL, true)) < 0)
+ if (UNIT(s)->manager->running_as == SYSTEMD_SYSTEM) {
+ r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SYSINIT_TARGET, NULL, true);
+ if (r < 0)
return r;
}
diff --git a/src/core/special.h b/src/core/special.h
index c7b856e2bd..ad873a9c31 100644
--- a/src/core/special.h
+++ b/src/core/special.h
@@ -46,6 +46,8 @@
/* Early boot targets */
#define SPECIAL_SYSINIT_TARGET "sysinit.target"
#define SPECIAL_SOCKETS_TARGET "sockets.target"
+#define SPECIAL_TIMERS_TARGET "timers.target"
+#define SPECIAL_PATHS_TARGET "paths.target"
#define SPECIAL_LOCAL_FS_TARGET "local-fs.target"
#define SPECIAL_LOCAL_FS_PRE_TARGET "local-fs-pre.target"
#define SPECIAL_INITRD_FS_TARGET "initrd-fs.target"
diff --git a/src/core/timer.c b/src/core/timer.c
index d98468fd9e..16b49174d3 100644
--- a/src/core/timer.c
+++ b/src/core/timer.c
@@ -96,11 +96,11 @@ static int timer_add_default_dependencies(Timer *t) {
assert(t);
- if (UNIT(t)->manager->running_as == SYSTEMD_SYSTEM) {
- r = unit_add_dependency_by_name(UNIT(t), UNIT_BEFORE, SPECIAL_BASIC_TARGET, NULL, true);
- if (r < 0)
- return r;
+ r = unit_add_dependency_by_name(UNIT(t), UNIT_BEFORE, SPECIAL_TIMERS_TARGET, NULL, true);
+ if (r < 0)
+ return r;
+ if (UNIT(t)->manager->running_as == SYSTEMD_SYSTEM) {
r = unit_add_two_dependencies_by_name(UNIT(t), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SYSINIT_TARGET, NULL, true);
if (r < 0)
return r;
diff --git a/units/basic.target b/units/basic.target
index f9d03fa16f..b67c996b39 100644
--- a/units/basic.target
+++ b/units/basic.target
@@ -8,6 +8,6 @@
[Unit]
Description=Basic System
Documentation=man:systemd.special(7)
-Requires=sysinit.target sockets.target
-After=sysinit.target sockets.target
+Requires=sysinit.target sockets.target timers.target paths.target
+After=sysinit.target sockets.target timers.target paths.target
RefuseManualStart=yes
diff --git a/units/paths.target b/units/paths.target
new file mode 100644
index 0000000000..25c7fd031e
--- /dev/null
+++ b/units/paths.target
@@ -0,0 +1,10 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Paths
+Documentation=man:systemd.special(7)
diff --git a/units/systemd-ask-password-console.path b/units/systemd-ask-password-console.path
index 80f6cc4c18..2949635fea 100644
--- a/units/systemd-ask-password-console.path
+++ b/units/systemd-ask-password-console.path
@@ -11,7 +11,7 @@ Documentation=man:systemd-ask-password-console.service(8)
DefaultDependencies=no
Conflicts=shutdown.target
After=plymouth-start.service
-Before=basic.target shutdown.target
+Before=paths.target shutdown.target
ConditionPathExists=!/run/plymouth/pid
[Path]
diff --git a/units/systemd-ask-password-wall.path b/units/systemd-ask-password-wall.path
index 62dee80552..95ec9bc8a0 100644
--- a/units/systemd-ask-password-wall.path
+++ b/units/systemd-ask-password-wall.path
@@ -10,7 +10,7 @@ Description=Forward Password Requests to Wall Directory Watch
Documentation=man:systemd-ask-password-console.service(8)
DefaultDependencies=no
Conflicts=shutdown.target
-Before=basic.target shutdown.target
+Before=paths.target shutdown.target
[Path]
DirectoryNotEmpty=/run/systemd/ask-password
diff --git a/units/timers.target b/units/timers.target
new file mode 100644
index 0000000000..07fda3d9d0
--- /dev/null
+++ b/units/timers.target
@@ -0,0 +1,10 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Timers
+Documentation=man:systemd.special(7)