]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
tree-wide: Add initrd presets
authorDaanDeMeyer <daan.j.demeyer@gmail.com>
Wed, 2 Jul 2025 07:43:30 +0000 (09:43 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 3 Jul 2025 15:43:01 +0000 (17:43 +0200)
Currently, when running "systemctl preset-all --root=xxx" in mkosi
to enable/disable units for initrds, the system presets are used.
The problem with this approach is that the system presets are written
for the system, and that is not necessarily ideal for an initrd, but we
still want to use the same packages in the initrd that we install in the
system, so let's introduce a separate directory for initrd presets which
is used to pick up preset files from when we detect that we're configuring
an initrd (by looking for /etc/initrd-release).

We also introduce a systemd preset file for the initrd, which is based on
the system one, except with all the stuff unnecessary for the initrd removed.

12 files changed:
docs/PRESET.md
man/systemd.preset.xml
meson.build
presets/90-systemd-initrd.preset [new file with mode: 0644]
presets/90-systemd-user.preset [moved from presets/user/90-systemd.preset with 100% similarity]
presets/meson.build
src/core/systemd.pc.in
src/libsystemd/sd-path/sd-path.c
src/path/path-tool.c
src/shared/install.c
src/shared/pretty-print.c
src/systemd/sd-path.h

index 62aab967b63970cd168d0f53b61e1e3435674152..ba3c0a4770df02c4e7e0f41bd6b40924d227aa08 100644 (file)
@@ -29,7 +29,7 @@ systemd 32 and newer support package "preset" policies.
 These encode which units shall be enabled by default when they are installed, and which units shall not be enabled.
 
 Preset files may be written for specific distributions, for specific spins or for specific sites, in order to enforce different policies as needed.
-Preset policies are stored in .preset files in /usr/lib/systemd/system-preset/.
+Preset policies are stored in .preset files in /usr/lib/systemd/system-preset/ (or /usr/lib/systemd/initrd-preset/ for initrds).
 If no policy exists the default implied policy of "enable everything" is enforced, i.e. in Debian style.
 
 The policy encoded in preset files is applied to a unit by invoking "systemctl preset ".
index dcc740a16da21967b10a6db41e0567bcdfabefa6..a83492495e1d093a8c4d74d78db5ed362e8f60da 100644 (file)
       <member><filename>/run/systemd/user-preset/*.preset</filename></member>
       <member><filename>/usr/local/lib/systemd/user-preset/*.preset</filename></member>
       <member><filename>/usr/lib/systemd/user-preset/*.preset</filename></member>
+      <member><filename>/etc/systemd/initrd-preset/*.preset</filename></member>
+      <member><filename>/run/systemd/initrd-preset/*.preset</filename></member>
+      <member><filename>/usr/local/lib/systemd/initrd-preset/*.preset</filename></member>
+      <member><filename>/usr/lib/systemd/initrd-preset/*.preset</filename></member>
     </simplelist></para>
   </refsynopsisdiv>
 
index 8d252832aacf740523c21468f106139decbc7f12..55874ee6c6adef9ad4ef027b3a1b24e50f293b09 100644 (file)
@@ -172,6 +172,7 @@ systemshutdowndir = libexecdir / 'system-shutdown'
 systemsleepdir = libexecdir / 'system-sleep'
 systemunitdir = prefixdir / 'lib/systemd/system'
 systempresetdir = prefixdir / 'lib/systemd/system-preset'
+initrdpresetdir = prefixdir / 'lib/systemd/initrd-preset'
 udevlibexecdir = prefixdir / 'lib/udev'
 udevrulesdir = udevlibexecdir / 'rules.d'
 udevhwdbdir = udevlibexecdir / 'hwdb.d'
diff --git a/presets/90-systemd-initrd.preset b/presets/90-systemd-initrd.preset
new file mode 100644 (file)
index 0000000..e966a18
--- /dev/null
@@ -0,0 +1,38 @@
+#  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.
+
+# Settings for systemd units distributed with systemd itself, specific to initrds.
+
+enable systemd-journald-audit.socket
+enable systemd-network-generator.service
+enable systemd-networkd.service
+enable systemd-networkd-wait-online.service
+enable systemd-pstore.service
+enable systemd-resolved.service
+enable systemd-tpm2-clear.service
+
+disable console-getty.service
+disable debug-shell.service
+
+disable exit.target
+disable halt.target
+disable kexec.target
+disable poweroff.target
+enable reboot.target
+disable rescue.target
+
+disable proc-sys-fs-binfmt_misc.mount
+
+disable syslog.socket
+
+disable systemd-boot-check-no-failures.service
+disable systemd-journal-gatewayd.*
+disable systemd-journal-remote.*
+disable systemd-journal-upload.*
+disable systemd-time-wait-sync.service
index 84abeded2fd84d5e1655cd8f5a0b805adc3c6dd0..cc852d7c17258541ccf8580600abf20805542326 100644 (file)
@@ -3,5 +3,10 @@
 install_data('90-systemd.preset',
              install_dir : systempresetdir)
 
-install_data('user/90-systemd.preset',
-             install_dir : userpresetdir)
+install_data('90-systemd-user.preset',
+             install_dir : userpresetdir,
+             rename : '90-systemd.preset')
+
+install_data('90-systemd-initrd.preset',
+             install_dir : initrdpresetdir,
+             rename : '90-systemd.preset')
index 2b5fb8a2ece0dcb0afaa9d06eba34513330c6bdc..58f24631046e8fa8271dac4ff5f206cce367419c 100644 (file)
@@ -31,6 +31,9 @@ systemdsystemunitdir=${systemd_system_unit_dir}
 systemd_system_preset_dir=${prefix}/lib/systemd/system-preset
 systemdsystempresetdir=${systemd_system_preset_dir}
 
+systemd_initrd_preset_dir=${prefix}/lib/systemd/initrd-preset
+systemdinitrdpresetdir=${systemd_initrd_preset_dir}
+
 systemd_user_unit_dir=${prefix}/lib/systemd/user
 systemduserunitdir=${systemd_user_unit_dir}
 
index f562e3a7ecbbb8f42495f8700aaeae762aee5e61..0096997135357a6e55f0453cde88ae535e713151 100644 (file)
@@ -302,6 +302,10 @@ static int get_path(uint64_t type, char **buffer, const char **ret) {
                 *ret = PREFIX_NOSLASH "/lib/systemd/user-preset";
                 return 0;
 
+        case SD_PATH_SYSTEMD_INITRD_PRESET:
+                *ret = PREFIX_NOSLASH "/lib/systemd/initrd-preset";
+                return 0;
+
         case SD_PATH_SYSTEMD_SYSTEM_CONF:
                 *ret = SYSTEM_CONFIG_UNIT_DIR;
                 return 0;
index c725dd76fdc1cc660345060433a8a28e060e062d..41d0ba861cc72e0de794297c4fa6d23a0d13d686 100644 (file)
@@ -75,6 +75,7 @@ static const char* const path_table[_SD_PATH_MAX] = {
         [SD_PATH_SYSTEMD_USER_UNIT]                           = "systemd-user-unit",
         [SD_PATH_SYSTEMD_USER_PRESET]                         = "systemd-user-preset",
         [SD_PATH_SYSTEMD_USER_CONF]                           = "systemd-user-conf",
+        [SD_PATH_SYSTEMD_INITRD_PRESET]                       = "systemd-initrd-preset",
 
         [SD_PATH_SYSTEMD_SEARCH_SYSTEM_UNIT]                  = "systemd-search-system-unit",
         [SD_PATH_SYSTEMD_SEARCH_USER_UNIT]                    = "systemd-search-user-unit",
index 8c6909ddf2e9e25545d4bf2cc28d1451190ffd19..8fc087fb78ca2af1ed0e2b862a78d69fe1e524c4 100644 (file)
@@ -3284,16 +3284,22 @@ static int split_pattern_into_name_and_instances(const char *pattern, char **out
 }
 
 static int presets_find_config(RuntimeScope scope, const char *root_dir, char ***files) {
+        static const char* const initrd_dirs[] = { CONF_PATHS("systemd/initrd-preset"), NULL };
         static const char* const system_dirs[] = { CONF_PATHS("systemd/system-preset"), NULL };
         static const char* const user_dirs[] = { CONF_PATHS("systemd/user-preset"), NULL };
         const char* const* dirs;
+        int r;
 
         assert(scope >= 0);
         assert(scope < _RUNTIME_SCOPE_MAX);
 
-        if (scope == RUNTIME_SCOPE_SYSTEM)
-                dirs = system_dirs;
-        else if (IN_SET(scope, RUNTIME_SCOPE_GLOBAL, RUNTIME_SCOPE_USER))
+        if (scope == RUNTIME_SCOPE_SYSTEM) {
+                r = chase_and_access("/etc/initrd-release", root_dir, CHASE_PREFIX_ROOT, F_OK, /* ret_path= */ NULL);
+                if (r < 0 && r != -ENOENT)
+                        return r;
+
+                dirs = r >= 0 ? initrd_dirs : system_dirs;
+        } else if (IN_SET(scope, RUNTIME_SCOPE_GLOBAL, RUNTIME_SCOPE_USER))
                 dirs = user_dirs;
         else
                 assert_not_reached();
index 8be99a8d3f4cf6ab5cb19002d952491c18d51f94..95d6d7051e1bec9aba4418fa6cbcfbea35eb94cb 100644 (file)
@@ -372,7 +372,7 @@ static int guess_type(const char **name, char ***ret_prefixes, bool *ret_is_coll
         } else if (path_equal(n, "systemd/relabel-extra.d")) {
                 coll = run = true;
                 ext = ".relabel";
-        } else if (PATH_IN_SET(n, "systemd/system-preset", "systemd/user-preset")) {
+        } else if (PATH_IN_SET(n, "systemd/system-preset", "systemd/user-preset", "systemd/initrd-preset")) {
                 coll = true;
                 ext = ".preset";
         }
index 5d5bdfe206629d89d251854036ca34b22e3b8b38..58726f731cee5b00b51df9c5aa4fd5df3705cd01 100644 (file)
@@ -88,6 +88,7 @@ enum {
         SD_PATH_SYSTEMD_USER_UNIT,
         SD_PATH_SYSTEMD_USER_PRESET,
         SD_PATH_SYSTEMD_USER_CONF,
+        SD_PATH_SYSTEMD_INITRD_PRESET,
 
         SD_PATH_SYSTEMD_SEARCH_SYSTEM_UNIT,
         SD_PATH_SYSTEMD_SEARCH_USER_UNIT,