From 45bcfcb36cec9bf810686ed956ff215ac1db07d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Thu, 14 Jul 2022 18:05:55 +0200 Subject: units/initrd-parse-etc.service: only start units that are required 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. --- units/initrd-parse-etc.service | 24 ------------------------ units/initrd-parse-etc.service.in | 31 +++++++++++++++++++++++++++++++ units/meson.build | 2 +- 3 files changed, 32 insertions(+), 25 deletions(-) delete mode 100644 units/initrd-parse-etc.service create mode 100644 units/initrd-parse-etc.service.in (limited to 'units') diff --git a/units/initrd-parse-etc.service b/units/initrd-parse-etc.service deleted file mode 100644 index 38df728355..0000000000 --- a/units/initrd-parse-etc.service +++ /dev/null @@ -1,24 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# -# 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=Reload Configuration from the Real Root -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=systemctl --no-block start initrd-cleanup.service diff --git a/units/initrd-parse-etc.service.in b/units/initrd-parse-etc.service.in new file mode 100644 index 0000000000..5ac7a24bb0 --- /dev/null +++ b/units/initrd-parse-etc.service.in @@ -0,0 +1,31 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +# +# 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=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 + +[Service] +Type=oneshot + +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 diff --git a/units/meson.build b/units/meson.build index 40f784ec68..2010a5566f 100644 --- a/units/meson.build +++ b/units/meson.build @@ -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'], -- cgit v1.2.1