]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
units/initrd-parse-etc.service: only start units that are required
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 14 Jul 2022 16:05:55 +0000 (18:05 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sat, 23 Jul 2022 17:02:39 +0000 (19:02 +0200)
This makes use of the option switch that was added in the previous commit.
We used a pretty big hammer on a relatively small nail: we would do daemon-reload
and (in principle) allow any configuration to be changed. But in fact we only
made use of this in systemd-fstab-generator. systemd-fstab-generator filters
out all mountpoints except /usr and those marked with x-initrd.mount, i.e. on
a big majority of systems it wouldn't do anything.

Also, since systemd-fstab-generator first parses /proc/cmdline, and then
initrd's /etc/fstab, and only then /sysroot/etc/fstab, configuration in the
host would only matter if it the same mountpoint wasn't configured "earlier".
So the config in the host could be used for new mountpoints, but it couldn't
be used to amend configuration for existing mountpoints. And we wouldn't actually
remount anything, so mountpoints that were already mounted wouldn't be affected,
even if did change some config.

In the new scheme, we will parse /sysroot/etc/fstab and explicitly start
sysroot-usr.mount and other units that we just wrote. In most cases (as written
above), this will actually result in no units being created or started.

If the generator is invoked on a system with /sysroot/etc/fstab present,
behaviour is not changed and we'll create units as before. This is needed so
that if daemon-reload is later at some points, we don't "lose" those units.

There's a minor bugfix here: we honour x-initrd.mount for swaps, but we
wouldn't restart swap.target, i.e. the new swaps wouldn't necessarilly be
pulled in immediately.

TODO
units/initrd-parse-etc.service.in [moved from units/initrd-parse-etc.service with 56% similarity]
units/meson.build

diff --git a/TODO b/TODO
index 2ef618dda91718ded10fc4412a5c980bff2920dc..a09db24912f700904e590513f830892853ec85b9 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1225,10 +1225,6 @@ Features:
 
 * fstab-generator: default to tmpfs-as-root if only usr= is specified on the kernel cmdline
 
-* initrd-parse-etc.service: can we skip daemon-reload if /sysroot/etc/fstab is missing?
-  Note that we start initrd-fs.target and initrd-cleanup.target there, so a straightforward
-  ConditionPathExists= is not enough.
-
 * docs: bring https://www.freedesktop.org/wiki/Software/systemd/MyServiceCantGetRealtime up to date
 
 * add a job mode that will fail if a transaction would mean stopping
similarity index 56%
rename from units/initrd-parse-etc.service
rename to units/initrd-parse-etc.service.in
index 38df7283558fd0861bc0a52b21526345dd1a67e7..5ac7a24bb01cc7d007360cc1554773bf2a231a07 100644 (file)
@@ -8,17 +8,24 @@
 #  (at your option) any later version.
 
 [Unit]
-Description=Reload Configuration from the Real Root
+Description=Mountpoints Configured in the Real Root
+AssertPathExists=/etc/initrd-release
+
 DefaultDependencies=no
 Requires=initrd-root-fs.target
 After=initrd-root-fs.target
+
 OnFailure=emergency.target
 OnFailureJobMode=replace-irreversibly
-AssertPathExists=/etc/initrd-release
 
 [Service]
 Type=oneshot
-ExecStartPre=-systemctl daemon-reload
-# we have to retrigger initrd-fs.target after daemon-reload
-ExecStart=-systemctl --no-block start initrd-fs.target
+
+ExecStart={{ROOTLIBEXECDIR}}/systemd-sysroot-fstab-check
+
+# We want to enqueue initrd-cleanup.service/start after we finished the part
+# above. It can't be part of the initial transaction, because non-oneshot units
+# use Conflicts=initrd-cleanup.service to be terminated before we switch root.
+# Effectively, initrd-parse-etc.service acts as a synchronization point after
+# which cleanup of the initrd processes starts.
 ExecStart=systemctl --no-block start initrd-cleanup.service
index 40f784ec683a155664fa1d8591d6b4029150103d..2010a5566f030aad7e8de95982aca24deef1793f 100644 (file)
@@ -36,7 +36,6 @@ units = [
         ['suspend-then-hibernate.target',       'ENABLE_HIBERNATE'],
         ['initrd-cleanup.service',              'ENABLE_INITRD'],
         ['initrd-fs.target',                    'ENABLE_INITRD'],
-        ['initrd-parse-etc.service',            'ENABLE_INITRD'],
         ['initrd-root-device.target',           'ENABLE_INITRD'],
         ['initrd-root-fs.target',               'ENABLE_INITRD'],
         ['initrd-switch-root.service',          'ENABLE_INITRD'],
@@ -179,6 +178,7 @@ in_units = [
         ['emergency.service',                    ''],
         ['getty@.service',                       '',
          'autovt@.service'],
+        ['initrd-parse-etc.service',             'ENABLE_INITRD'],
         ['kmod-static-nodes.service',            'HAVE_KMOD ENABLE_TMPFILES',
          'sysinit.target.wants/'],
         ['quotaon.service',                      'ENABLE_QUOTACHECK'],