From e3d84721dc9bcf9008f72dae03ff0f7842d0bb4b Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 25 Mar 2013 21:20:08 +0100 Subject: [PATCH] units: introduce new timers.target and paths.target to hook timer/path units into for boot --- Makefile.am | 10 +- man/bootup.xml | 143 +++++++------ man/systemd.special.xml | 258 +++++++++++++++++------- src/core/path.c | 10 +- src/core/service.c | 10 + src/core/socket.c | 10 +- src/core/special.h | 2 + src/core/timer.c | 8 +- units/basic.target | 4 +- units/paths.target | 10 + units/systemd-ask-password-console.path | 2 +- units/systemd-ask-password-wall.path | 2 +- units/timers.target | 10 + 13 files changed, 319 insertions(+), 160 deletions(-) create mode 100644 units/paths.target create mode 100644 units/timers.target diff --git a/Makefile.am b/Makefile.am index 2a1a08ce9..8569983a1 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 65923528d..a596e85b7 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.target Target 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 OS System 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 67a81b639..8a7242662 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.target A 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.service A 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.target A 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.target A 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.target A 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 295e5cdf0..ff49c069e 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 fa8a1cb03..98266a5a9 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 a3e3631da..31f4bf49b 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 c7b856e2b..ad873a9c3 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 d98468fd9..16b49174d 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 f9d03fa16..b67c996b3 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 000000000..25c7fd031 --- /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 80f6cc4c1..2949635fe 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 62dee8055..95ec9bc8a 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 000000000..07fda3d9d --- /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) -- 2.30.2