gentoo-overlay/sys-apps/systemd/files/0001-Revert-Drop-split-usr-...

2608 lines
115 KiB
Diff
Raw Permalink Normal View History

From 6238160415cedaad4292938ba1c8df26da5ca2c0 Mon Sep 17 00:00:00 2001
From: "A. Wilcox" <AWilcox@Wilcox-Tech.com>
Date: Fri, 16 Aug 2024 20:45:29 -0500
Subject: [PATCH 01/34] Revert "Drop split-usr and unmerged-usr support"
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 8bit
This reverts commit b0d3095fd6cc1791a38f57a1982116b4475244ba.
Signed-off-by: Alexander Miroshnichenko <alex@millerson.name>
---
.semaphore/semaphore-runner.sh | 2 +-
README | 35 ++++-
catalog/meson.build | 2 +-
catalog/systemd.bg.catalog.in | 2 +
catalog/systemd.catalog.in | 3 -
catalog/systemd.fr.catalog.in | 2 +
catalog/systemd.it.catalog.in | 1 +
catalog/systemd.pl.catalog.in | 3 -
catalog/systemd.ru.catalog.in | 2 +
docs/DISTRO_PORTING.md | 1 +
hwdb.d/meson.build | 2 +-
man/org.freedesktop.systemd1.xml | 11 ++
man/systemd.exec.xml | 11 +-
meson.build | 138 ++++++++++++------
meson_options.txt | 14 +-
rules.d/64-btrfs.rules.in | 2 +-
rules.d/71-seat.rules.in | 4 +-
rules.d/99-systemd.rules.in | 2 +-
shell-completion/bash/systemctl.in | 2 +-
shell-completion/zsh/_systemctl.in | 2 +-
src/basic/constants.h | 17 ++-
src/basic/path-lookup.c | 5 +-
src/basic/path-lookup.h | 2 +-
src/basic/path-util.h | 4 +-
src/boot/meson.build | 3 +
src/core/manager-serialize.c | 10 ++
src/core/manager.c | 4 +-
src/core/manager.h | 2 +
src/core/meson.build | 4 +-
src/core/namespace.c | 8 +-
src/core/org.freedesktop.systemd1.policy.in | 2 +-
src/core/systemd.pc.in | 29 ++--
src/cryptsetup/cryptsetup-generator.c | 4 +-
src/cryptsetup/cryptsetup-tokens/meson.build | 2 +-
src/delta/delta.c | 36 +++++
src/dissect/meson.build | 2 +-
src/fstab-generator/meson.build | 2 +-
src/import/meson.build | 2 +-
src/integritysetup/integritysetup-generator.c | 4 +-
src/libsystemd/libsystemd.pc.in | 2 +-
src/libsystemd/sd-hwdb/hwdb-internal.h | 1 +
src/libsystemd/sd-path/sd-path.c | 27 ++--
src/libudev/libudev.pc.in | 2 +-
src/login/meson.build | 2 +
src/machine/machinectl.c | 2 +-
src/portable/meson.build | 2 +
src/portable/portable.c | 10 +-
src/resolve/meson.build | 14 +-
src/rpm/macros.systemd.in | 6 +-
src/rpm/meson.build | 4 +-
src/rpm/triggers.systemd.in | 4 +-
src/rpm/triggers.systemd.sh.in | 4 +-
src/shared/install.c | 5 +
src/shared/kbd-util.c | 3 +-
src/shared/meson.build | 2 +-
src/shared/resolve-util.h | 2 +-
src/shared/userdb-dropin.h | 3 +-
src/shared/userdb.c | 2 +-
src/sysext/meson.build | 4 +-
src/systemctl/meson.build | 1 +
src/systemctl/systemctl-sysv-compat.c | 2 +-
src/udev/meson.build | 2 +-
src/userdb/20-systemd-userdb.conf.in | 2 +-
.../xdg-autostart-service.c | 2 +-
sysctl.d/50-coredump.conf.in | 2 +-
test/fuzz/fuzz-catalog/systemd.pl.catalog | 2 +
test/test-fstab-generator.sh | 5 +
test/test-functions | 10 +-
units/emergency.service.in | 2 +-
units/initrd-parse-etc.service.in | 2 +-
units/rescue.service.in | 2 +-
units/systemd-backlight@.service.in | 4 +-
units/systemd-battery-check.service.in | 2 +-
units/systemd-binfmt.service.in | 4 +-
units/systemd-bless-boot.service.in | 2 +-
.../systemd-boot-check-no-failures.service.in | 2 +-
units/systemd-coredump@.service.in | 2 +-
units/systemd-fsck-root.service.in | 2 +-
units/systemd-fsck@.service.in | 2 +-
units/systemd-growfs-root.service.in | 2 +-
units/systemd-growfs@.service.in | 2 +-
units/systemd-hibernate.service.in | 2 +-
units/systemd-homed.service.in | 2 +-
units/systemd-hostnamed.service.in | 2 +-
units/systemd-hybrid-sleep.service.in | 2 +-
units/systemd-importd.service.in | 2 +-
units/systemd-initctl.service.in | 2 +-
units/systemd-journal-gatewayd.service.in | 2 +-
units/systemd-journal-remote.service.in | 2 +-
units/systemd-journal-upload.service.in | 2 +-
units/systemd-journald.service.in | 2 +-
units/systemd-journald@.service.in | 2 +-
units/systemd-localed.service.in | 2 +-
units/systemd-logind.service.in | 2 +-
units/systemd-machined.service.in | 2 +-
units/systemd-modules-load.service.in | 2 +-
units/systemd-network-generator.service.in | 2 +-
units/systemd-networkd-wait-online.service.in | 2 +-
.../systemd-networkd-wait-online@.service.in | 2 +-
units/systemd-networkd.service.in | 2 +-
units/systemd-oomd.service.in | 2 +-
units/systemd-pcrfs-root.service.in | 2 +-
units/systemd-pcrfs@.service.in | 2 +-
units/systemd-pcrmachine.service.in | 2 +-
units/systemd-pcrphase-initrd.service.in | 4 +-
units/systemd-pcrphase-sysinit.service.in | 4 +-
units/systemd-pcrphase.service.in | 4 +-
units/systemd-portabled.service.in | 2 +-
units/systemd-pstore.service.in | 2 +-
units/systemd-quotacheck@.service.in | 2 +-
units/systemd-random-seed.service.in | 4 +-
units/systemd-remount-fs.service.in | 2 +-
units/systemd-repart.service | 2 +-
units/systemd-resolved.service.in | 2 +-
units/systemd-rfkill.service.in | 2 +-
.../systemd-suspend-then-hibernate.service.in | 2 +-
units/systemd-suspend.service.in | 2 +-
units/systemd-sysctl.service.in | 2 +-
units/systemd-sysupdate-reboot.service.in | 2 +-
units/systemd-sysupdate.service.in | 2 +-
units/systemd-time-wait-sync.service.in | 2 +-
units/systemd-timedated.service.in | 2 +-
units/systemd-timesyncd.service.in | 2 +-
units/systemd-udevd.service.in | 2 +-
units/systemd-update-done.service.in | 2 +-
units/systemd-update-utmp-runlevel.service.in | 2 +-
units/systemd-update-utmp.service.in | 4 +-
units/systemd-user-sessions.service.in | 4 +-
units/systemd-userdbd.service.in | 2 +-
units/systemd-vconsole-setup.service.in | 2 +-
units/systemd-volatile-root.service.in | 2 +-
units/user-runtime-dir@.service.in | 4 +-
units/user@.service.in | 2 +-
133 files changed, 425 insertions(+), 235 deletions(-)
diff --git a/.semaphore/semaphore-runner.sh b/.semaphore/semaphore-runner.sh
index bc0cb6a9005d..831b45f062ed 100755
--- a/.semaphore/semaphore-runner.sh
+++ b/.semaphore/semaphore-runner.sh
@@ -94,7 +94,7 @@ EOF
# disable autopkgtests which are not for upstream
sed -i '/# NOUPSTREAM/ q' debian/tests/control
# enable more unit tests
- sed -i '/^CONFFLAGS =/ s/=/= --werror -Dtests=unsafe -Dslow-tests=true -Dfuzz-tests=true -Dman=true /' debian/rules
+ sed -i '/^CONFFLAGS =/ s/=/= --werror -Dtests=unsafe -Dsplit-usr=true -Dslow-tests=true -Dfuzz-tests=true -Dman=true /' debian/rules
# no orig tarball
echo '1.0' >debian/source/format
diff --git a/README b/README
index 7c7bbaf07015..a24f4097dd40 100644
--- a/README
+++ b/README
@@ -266,14 +266,13 @@ REQUIREMENTS:
make use of DynamicUser= now, hence enabling nss-systemd is not
optional.
- Note that the build prefix for systemd must be /usr/. (Moreover, packages
+ Note that the build prefix for systemd must be /usr. (Moreover, packages
systemd relies on — such as D-Bus — really should use the same prefix,
- otherwise you are on your own.) Split-usr and unmerged-usr systems are no
- longer supported, and moving everything under /usr/ is required. Systems
- with a separate /usr/ partition must mount it before transitioning into it
- (i.e.: from the initrd). For more information see:
- https://systemd.io/SEPARATE_USR_IS_BROKEN
- https://systemd.io/THE_CASE_FOR_THE_USR_MERGE
+ otherwise you are on your own.) -Dsplit-usr=false (which is the default
+ and does not need to be specified) is the recommended setting.
+ -Dsplit-usr=true can be used to give a semblance of support for systems
+ with programs installed split between / and /usr. Moving everything
+ under /usr is strongly encouraged.
Additional packages are necessary to run some tests:
- nc (used by test/TEST-12-ISSUE-3171)
@@ -413,6 +412,28 @@ SYSV INIT.D SCRIPTS:
needs to look like, and provide an implementation at the marked places.
WARNINGS and TAINT FLAGS:
+ systemd will warn during early boot if /usr is not already mounted at
+ this point (that means: either located on the same file system as / or
+ already mounted in the initrd). While in systemd itself very little
+ will break if /usr is on a separate late-mounted partition, many of its
+ dependencies very likely will break sooner or later in one form or
+ another. For example, udev rules tend to refer to binaries in /usr,
+ binaries that link to libraries in /usr, or binaries that refer to data
+ files in /usr. Since these breakages are not always directly visible,
+ systemd will warn about this. Such setups are not really supported by
+ the basic set of Linux OS components. Taint flag 'split-usr' will be
+ set when this condition is detected.
+
+ For more information on this issue consult
+ https://www.freedesktop.org/wiki/Software/systemd/separate-usr-is-broken
+
+ systemd will warn if the filesystem is not usr-merged (i.e.: /bin, /sbin
+ and /lib* are not symlinks to their counterparts under /usr). Taint flag
+ 'unmerged-usr' will be set when this condition is detected.
+
+ For more information on this issue consult
+ https://www.freedesktop.org/wiki/Software/systemd/TheCaseForTheUsrMerge
+
systemd requires that the /run mount point exists. systemd also
requires that /var/run is a symlink to /run. Taint flag 'var-run-bad'
will be set when this condition is detected.
diff --git a/catalog/meson.build b/catalog/meson.build
index 3c62749cf982..1cc977992db5 100644
--- a/catalog/meson.build
+++ b/catalog/meson.build
@@ -35,4 +35,4 @@ foreach file : in_files
endforeach
meson.add_install_script(sh, '-c',
- 'test -n "$DESTDIR" || @0@/journalctl --update-catalog'.format(bindir))
+ 'test -n "$DESTDIR" || @0@/journalctl --update-catalog'.format(rootbindir))
diff --git a/catalog/systemd.bg.catalog.in b/catalog/systemd.bg.catalog.in
index e1c32ede7820..08123a7b2606 100644
--- a/catalog/systemd.bg.catalog.in
+++ b/catalog/systemd.bg.catalog.in
@@ -395,6 +395,8 @@ Defined-By: systemd
Support: %SUPPORT_URL%
Възможни са следните етикети:
+ „split-usr“ — „/usr“ е отделна файлова система, която не е била монтирана при
+ стартирането на systemd
„cgroups-missing“ — ядрото е компилирано без поддръжка на „cgroup“ или е
ограничен достъпът до тази подсистема
„var-run-bad“ — „/var/run“ не е символна връзка към „/run“
diff --git a/catalog/systemd.catalog.in b/catalog/systemd.catalog.in
index 2831152763ec..f2a24ee6a101 100644
--- a/catalog/systemd.catalog.in
+++ b/catalog/systemd.catalog.in
@@ -558,9 +558,6 @@ Defined-By: systemd
Support: %SUPPORT_URL%
The following "tags" are possible:
-- "unmerged-usr" - /bin, /sbin, /lib* are not symlinks to their counterparts
- under /usr/
-- "unmerged-bin" - /usr/sbin is not a symlink to /usr/bin/
- "var-run-bad" — /var/run is not a symlink to /run/
- "cgroupsv1" - the system is using the deprecated cgroup v1 hierarchy
- "local-hwclock" - the local hardware clock (RTC) is configured to be in
diff --git a/catalog/systemd.fr.catalog.in b/catalog/systemd.fr.catalog.in
index 6b28ecb779e3..c25380c8a269 100644
--- a/catalog/systemd.fr.catalog.in
+++ b/catalog/systemd.fr.catalog.in
@@ -337,6 +337,8 @@ Defined-By: systemd
Support: %SUPPORT_URL%
Les étiquettes suivantes sont possibles :
+- "split-usr" — /usr est un système de fichiers séparé et nétait pas
+ monté quand systemd a été démarré
- "cgroups-missing" — le noyau a été compilé sans le support des groupes
de contrôle (cgroups) ou l'accès aux fichiers d'interface est restreint
- "var-run-bad" — /var/run n'est pas un lien symbolique vers /run
diff --git a/catalog/systemd.it.catalog.in b/catalog/systemd.it.catalog.in
index bcbbcc2eb0e0..fc2531405c54 100644
--- a/catalog/systemd.it.catalog.in
+++ b/catalog/systemd.it.catalog.in
@@ -403,6 +403,7 @@ Defined-By: systemd
Support: %SUPPORT_URL%
I seguenti "tags" sono possibili:
+- "split-usr" — /usr è un file system separato e non è stato montato all'avvio di systemd
- "cgroups-missing" — il kernel era compilato senza supporto cgroup o l'accesso ai
file attesi è ristretto.
- "var-run-bad" — /var/run non è un link simbolico (symlink) a /run
diff --git a/catalog/systemd.pl.catalog.in b/catalog/systemd.pl.catalog.in
index 75039e9fcd4e..5956afe099d8 100644
--- a/catalog/systemd.pl.catalog.in
+++ b/catalog/systemd.pl.catalog.in
@@ -564,9 +564,6 @@ Defined-By: systemd
Support: %SUPPORT_URL%
Możliwe są następujące „etykiety”:
-• „unmerged-usr” — /bin, /sbin, /lib* nie są dowiązaniami symbolicznymi
- do swoich odpowiedników pod /usr/,
-• „unmerged-bin” — /usr/sbin nie jest dowiązaniem symbolicznym do /usr/bin/,
• „var-run-bad” — /var/run nie jest dowiązaniem symbolicznym do /run/,
• „cgroupsv1” — system używa przestarzałej hierarchii cgroup v1,
• „local-hwclock” — lokalny zegar sprzętowy (RTC) jest skonfigurowany
diff --git a/catalog/systemd.ru.catalog.in b/catalog/systemd.ru.catalog.in
index 2d0d8c82a080..d49c39347529 100644
--- a/catalog/systemd.ru.catalog.in
+++ b/catalog/systemd.ru.catalog.in
@@ -388,6 +388,8 @@ Defined-By: systemd
Support: %SUPPORT_URL%
Перечень всех возможных меток, указывающих на проблемы конфигурации:
+- "split-usr" — каталог /usr расположен на отдельной файловой системе,
+ которая не была смонтирована на момент запуска systemd
- "cgroups-missing" — ядро собрано без поддержки контрольных групп, либо
отсутствуют права для доступа к интерфейсным файлам контрольных групп
- "var-run-bad" — /var/run не является символьной ссылкой на /run
diff --git a/docs/DISTRO_PORTING.md b/docs/DISTRO_PORTING.md
index cb230937f447..e5ee7995bd6e 100644
--- a/docs/DISTRO_PORTING.md
+++ b/docs/DISTRO_PORTING.md
@@ -13,6 +13,7 @@ You need to make the follow changes to adapt systemd to your distribution:
1. Find the right configure parameters for:
+ * `-Drootprefix=`
* `-Dsysvinit-path=`
* `-Dsysvrcnd-path=`
* `-Drc-local=`
diff --git a/hwdb.d/meson.build b/hwdb.d/meson.build
index b69b6d8f2518..780537facc19 100644
--- a/hwdb.d/meson.build
+++ b/hwdb.d/meson.build
@@ -55,7 +55,7 @@ if conf.get('ENABLE_HWDB') == 1
install_emptydir(sysconfdir / 'udev/hwdb.d')
meson.add_install_script(sh, '-c',
- 'test -n "$DESTDIR" || @0@/systemd-hwdb update'.format(bindir))
+ 'test -n "$DESTDIR" || @0@/systemd-hwdb update'.format(rootbindir))
endif
if want_tests != 'false'
diff --git a/man/org.freedesktop.systemd1.xml b/man/org.freedesktop.systemd1.xml
index b0b45097e30a..290054fa42a8 100644
--- a/man/org.freedesktop.systemd1.xml
+++ b/man/org.freedesktop.systemd1.xml
@@ -1654,6 +1654,17 @@ node /org/freedesktop/systemd1 {
used to lower the chance of bogus bug reports. The following taints are currently known:</para>
<variablelist>
+ <varlistentry>
+ <term><literal>split-usr</literal></term>
+
+ <listitem><para><filename>/usr/</filename> was not available when systemd was first invoked. It
+ must either be part of the root file system, or it must be mounted before
+ <command>systemd</command> is invoked. See
+ <ulink url="https://www.freedesktop.org/wiki/Software/systemd/separate-usr-is-broken">
+ Booting Without /usr is Broken</ulink> for details why this is bad.</para>
+ </listitem>
+ </varlistentry>
+
<varlistentry>
<term><literal>unmerged-usr</literal></term>
diff --git a/man/systemd.exec.xml b/man/systemd.exec.xml
index 21527f756d66..4dda7b2c43b8 100644
--- a/man/systemd.exec.xml
+++ b/man/systemd.exec.xml
@@ -3658,11 +3658,12 @@ StandardInputData=V2XigLJyZSBubyBzdHJhbmdlcnMgdG8gbG92ZQpZb3Uga25vdyB0aGUgcnVsZX
<listitem><para>Colon-separated list of directories to use when launching
executables. <command>systemd</command> uses a fixed value of
<literal><filename>/usr/local/sbin</filename>:<filename>/usr/local/bin</filename>:<filename>/usr/sbin</filename>:<filename>/usr/bin</filename></literal>
- in the system manager. In case of the user manager, a different path may be configured by the
- distribution. It is recommended to not rely on the order of entries, and have only one program
- with a given name in <varname>$PATH</varname>.</para>
-
- <xi:include href="version-info.xml" xpointer="v208"/></listitem>
+ in the system manager. When compiled for systems with "unmerged <filename>/usr/</filename>"
+ (<filename>/bin</filename> is not a symlink to <filename>/usr/bin</filename>),
+ <literal>:<filename>/sbin</filename>:<filename>/bin</filename></literal> is appended. In case of
+ the user manager, a different path may be configured by the distribution. It is recommended to
+ not rely on the order of entries, and have only one program with a given name in
+ <varname>$PATH</varname>.</para></listitem>
</varlistentry>
<varlistentry>
diff --git a/meson.build b/meson.build
index 737f9f0c6600..c068acc169a3 100644
--- a/meson.build
+++ b/meson.build
@@ -84,6 +84,14 @@ endif
#####################################################################
fs = import('fs')
+if get_option('split-usr') == 'auto'
+ split_usr = not fs.is_symlink('/bin')
+else
+ split_usr = get_option('split-usr') == 'true'
+endif
+conf.set10('HAVE_SPLIT_USR', split_usr,
+ description : '/usr/bin and /bin directories are separate')
+
if get_option('split-bin') == 'auto'
split_bin = not fs.is_symlink('/usr/sbin')
else
@@ -92,6 +100,15 @@ endif
conf.set10('HAVE_SPLIT_BIN', split_bin,
description : 'bin and sbin directories are separate')
+rootprefixdir = get_option('rootprefix')
+# Unusual rootprefixdir values are used by some distros
+# (see https://github.com/systemd/systemd/pull/7461).
+rootprefix_default = split_usr ? '/' : '/usr'
+if rootprefixdir == ''
+ rootprefixdir = rootprefix_default
+endif
+rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
+
have_standalone_binaries = get_option('standalone-binaries')
sysvinit_path = get_option('sysvinit-path')
@@ -115,8 +132,11 @@ prefixdir = get_option('prefix')
if not prefixdir.startswith('/')
error('Prefix is not absolute: "@0@"'.format(prefixdir))
endif
+if prefixdir != rootprefixdir and rootprefixdir != '/' and not prefixdir.strip('/').startswith(rootprefixdir.strip('/') + '/')
+ error('Prefix is not below root prefix (now rootprefix=@0@ prefix=@1@)'.format(
+ rootprefixdir, prefixdir))
+endif
-prefixdir_noslash = '/' + prefixdir.strip('/')
bindir = prefixdir / get_option('bindir')
sbindir = prefixdir / (split_bin ? 'sbin' : 'bin')
sbin_to_bin = split_bin ? '../bin/' : ''
@@ -126,8 +146,20 @@ includedir = prefixdir / get_option('includedir')
datadir = prefixdir / get_option('datadir')
localstatedir = '/' / get_option('localstatedir')
-libexecdir = prefixdir / 'lib/systemd'
-pkglibdir = libdir / 'systemd'
+rootbindir = rootprefixdir / 'bin'
+rootsbindir = rootprefixdir / (split_bin ? 'sbin' : 'bin')
+rootlibexecdir = rootprefixdir / 'lib/systemd'
+
+rootlibdir = get_option('rootlibdir')
+if rootlibdir == ''
+ # This will be a relative path if libdir is in prefix.
+ rootlibdir = get_option('libdir')
+endif
+if not rootlibdir.startswith('/')
+ # If we have a relative path, add rootprefixdir to the front.
+ rootlibdir = rootprefixdir / rootlibdir
+endif
+rootpkglibdir = rootlibdir / 'systemd'
install_sysconfdir = get_option('install-sysconfdir') != 'false'
install_sysconfdir_samples = get_option('install-sysconfdir') == 'true'
@@ -142,7 +174,7 @@ rpmmacrosdir = get_option('rpmmacrosdir')
if rpmmacrosdir != 'no'
rpmmacrosdir = prefixdir / rpmmacrosdir
endif
-modprobedir = prefixdir / 'lib/modprobe.d'
+modprobedir = rootprefixdir / 'lib/modprobe.d'
# Our own paths
pkgdatadir = datadir / 'systemd'
@@ -156,16 +188,16 @@ sysusersdir = prefixdir / 'lib/sysusers.d'
sysctldir = prefixdir / 'lib/sysctl.d'
binfmtdir = prefixdir / 'lib/binfmt.d'
modulesloaddir = prefixdir / 'lib/modules-load.d'
-networkdir = prefixdir / 'lib/systemd/network'
-systemgeneratordir = libexecdir / 'system-generators'
+networkdir = rootprefixdir / 'lib/systemd/network'
+systemgeneratordir = rootlibexecdir / 'system-generators'
usergeneratordir = prefixdir / 'lib/systemd/user-generators'
systemenvgeneratordir = prefixdir / 'lib/systemd/system-environment-generators'
userenvgeneratordir = prefixdir / 'lib/systemd/user-environment-generators'
-systemshutdowndir = libexecdir / 'system-shutdown'
-systemsleepdir = libexecdir / 'system-sleep'
-systemunitdir = prefixdir / 'lib/systemd/system'
-systempresetdir = prefixdir / 'lib/systemd/system-preset'
-udevlibexecdir = prefixdir / 'lib/udev'
+systemshutdowndir = rootlibexecdir / 'system-shutdown'
+systemsleepdir = rootlibexecdir / 'system-sleep'
+systemunitdir = rootprefixdir / 'lib/systemd/system'
+systempresetdir = rootprefixdir / 'lib/systemd/system-preset'
+udevlibexecdir = rootprefixdir / 'lib/udev'
udevrulesdir = udevlibexecdir / 'rules.d'
udevhwdbdir = udevlibexecdir / 'hwdb.d'
catalogdir = prefixdir / 'lib/systemd/catalog'
@@ -179,12 +211,13 @@ testdata_dir = testsdir / 'testdata'
systemdstatedir = localstatedir / 'lib/systemd'
catalogstatedir = systemdstatedir / 'catalog'
randomseeddir = localstatedir / 'lib/systemd'
-profiledir = libexecdir / 'portable' / 'profile'
-repartdefinitionsdir = libexecdir / 'repart/definitions'
-ntpservicelistdir = prefixdir / 'lib/systemd/ntp-units.d'
+profiledir = rootlibexecdir / 'portable' / 'profile'
+repartdefinitionsdir = rootlibexecdir / 'repart/definitions'
+ntpservicelistdir = rootprefixdir / 'lib/systemd/ntp-units.d'
credstoredir = prefixdir / 'lib/credstore'
pcrlockdir = prefixdir / 'lib/pcrlock.d'
mimepackagesdir = prefixdir / 'share/mime/packages'
+libexecdir = rootlibexecdir
configfiledir = get_option('configfiledir')
if configfiledir == ''
@@ -199,12 +232,12 @@ endif
pamlibdir = get_option('pamlibdir')
if pamlibdir == ''
- pamlibdir = libdir / 'security'
+ pamlibdir = rootlibdir / 'security'
endif
pamconfdir = get_option('pamconfdir')
if pamconfdir == ''
- pamconfdir = prefixdir / 'lib/pam.d'
+ pamconfdir = rootlibdir / 'pam.d'
endif
sshconfdir = get_option('sshconfdir')
@@ -225,7 +258,7 @@ conf.set('SSHDPRIVSEPDIR', sshdprivsepdir, description : 'SSH privilege separati
libcryptsetup_plugins_dir = get_option('libcryptsetup-plugins-dir')
if libcryptsetup_plugins_dir == ''
- libcryptsetup_plugins_dir = libdir / 'cryptsetup'
+ libcryptsetup_plugins_dir = rootlibdir / 'cryptsetup'
endif
memory_accounting_default = get_option('memory-accounting-default')
@@ -234,7 +267,6 @@ if status_unit_format_default == 'auto'
status_unit_format_default = conf.get('BUILD_MODE_DEVELOPER') == 1 ? 'name' : 'description'
endif
-conf.set_quoted('BINDIR', bindir)
conf.set_quoted('BINFMT_DIR', binfmtdir)
conf.set_quoted('BOOTLIBDIR', bootlibdir)
conf.set_quoted('CATALOG_DATABASE', catalogstatedir / 'database')
@@ -251,39 +283,43 @@ conf.set_quoted('MODULESLOAD_DIR', modulesloaddir)
conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
conf.set_quoted('POLKIT_AGENT_BINARY_PATH', bindir / 'pkttyagent')
conf.set_quoted('PREFIX', prefixdir)
-conf.set_quoted('PREFIX_NOSLASH', prefixdir_noslash)
conf.set_quoted('RANDOM_SEED', randomseeddir / 'random-seed')
conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
conf.set_quoted('RC_LOCAL_PATH', get_option('rc-local'))
+conf.set_quoted('ROOTBINDIR', rootbindir)
+conf.set_quoted('ROOTLIBDIR', rootlibdir)
+conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
+conf.set_quoted('ROOTPREFIX', rootprefixdir)
+conf.set_quoted('ROOTPREFIX_NOSLASH', rootprefixdir_noslash)
conf.set_quoted('SSHCONFDIR', sshconfdir)
conf.set_quoted('SSHDCONFDIR', sshdconfdir)
conf.set_quoted('SYSCONF_DIR', sysconfdir)
conf.set_quoted('SYSCTL_DIR', sysctldir)
-conf.set_quoted('SYSTEMCTL_BINARY_PATH', bindir / 'systemctl')
-conf.set_quoted('SYSTEMD_BINARY_PATH', libexecdir / 'systemd')
-conf.set_quoted('SYSTEMD_EXECUTOR_BINARY_PATH', libexecdir / 'systemd-executor')
+conf.set_quoted('SYSTEMCTL_BINARY_PATH', rootbindir / 'systemctl')
+conf.set_quoted('SYSTEMD_BINARY_PATH', rootlibexecdir / 'systemd')
+conf.set_quoted('SYSTEMD_EXECUTOR_BINARY_PATH', rootlibexecdir / 'systemd-executor')
conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
-conf.set_quoted('SYSTEMD_CGROUPS_AGENT_PATH', libexecdir / 'systemd-cgroups-agent')
-conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', bindir / 'systemd-cryptsetup')
-conf.set_quoted('SYSTEMD_EXPORT_PATH', libexecdir / 'systemd-export')
-conf.set_quoted('SYSTEMD_FSCK_PATH', libexecdir / 'systemd-fsck')
-conf.set_quoted('SYSTEMD_GROWFS_PATH', libexecdir / 'systemd-growfs')
-conf.set_quoted('SYSTEMD_HOMEWORK_PATH', libexecdir / 'systemd-homework')
-conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', libexecdir / 'systemd-import-fs')
-conf.set_quoted('SYSTEMD_IMPORT_PATH', libexecdir / 'systemd-import')
-conf.set_quoted('SYSTEMD_INTEGRITYSETUP_PATH', libexecdir / 'systemd-integritysetup')
+conf.set_quoted('SYSTEMD_CGROUPS_AGENT_PATH', rootlibexecdir / 'systemd-cgroups-agent')
+conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', rootlibexecdir / 'systemd-cryptsetup')
+conf.set_quoted('SYSTEMD_EXPORT_PATH', rootlibexecdir / 'systemd-export')
+conf.set_quoted('SYSTEMD_FSCK_PATH', rootlibexecdir / 'systemd-fsck')
+conf.set_quoted('SYSTEMD_GROWFS_PATH', rootlibexecdir / 'systemd-growfs')
+conf.set_quoted('SYSTEMD_HOMEWORK_PATH', rootlibexecdir / 'systemd-homework')
+conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', rootlibexecdir / 'systemd-import-fs')
+conf.set_quoted('SYSTEMD_IMPORT_PATH', rootlibexecdir / 'systemd-import')
+conf.set_quoted('SYSTEMD_INTEGRITYSETUP_PATH', rootlibexecdir / 'systemd-integritysetup')
conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', pkgdatadir / 'kbd-model-map')
conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', pkgdatadir / 'language-fallback-map')
-conf.set_quoted('SYSTEMD_MAKEFS_PATH', libexecdir / 'systemd-makefs')
-conf.set_quoted('SYSTEMD_PULL_PATH', libexecdir / 'systemd-pull')
-conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', libexecdir / 'systemd-shutdown')
+conf.set_quoted('SYSTEMD_MAKEFS_PATH', rootlibexecdir / 'systemd-makefs')
+conf.set_quoted('SYSTEMD_PULL_PATH', rootlibexecdir / 'systemd-pull')
+conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', rootlibexecdir / 'systemd-shutdown')
conf.set_quoted('SYSTEMD_TEST_DATA', testdata_dir)
-conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', bindir / 'systemd-tty-ask-password-agent')
-conf.set_quoted('SYSTEMD_UPDATE_HELPER_PATH', libexecdir / 'systemd-update-helper')
-conf.set_quoted('SYSTEMD_USERWORK_PATH', libexecdir / 'systemd-userwork')
-conf.set_quoted('SYSTEMD_MOUNTWORK_PATH', libexecdir / 'systemd-mountwork')
-conf.set_quoted('SYSTEMD_NSRESOURCEWORK_PATH', libexecdir / 'systemd-nsresourcework')
-conf.set_quoted('SYSTEMD_VERITYSETUP_PATH', libexecdir / 'systemd-veritysetup')
+conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', rootbindir / 'systemd-tty-ask-password-agent')
+conf.set_quoted('SYSTEMD_UPDATE_HELPER_PATH', rootlibexecdir / 'systemd-update-helper')
+conf.set_quoted('SYSTEMD_USERWORK_PATH', rootlibexecdir / 'systemd-userwork')
+conf.set_quoted('SYSTEMD_MOUNTWORK_PATH', rootlibexecdir / 'systemd-mountwork')
+conf.set_quoted('SYSTEMD_NSRESOURCEWORK_PATH', rootlibexecdir / 'systemd-nsresourcework')
+conf.set_quoted('SYSTEMD_VERITYSETUP_PATH', rootlibexecdir / 'systemd-veritysetup')
conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', pkgsysconfdir / 'system')
conf.set_quoted('SYSTEM_DATA_UNIT_DIR', systemunitdir)
conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir)
@@ -305,7 +341,7 @@ conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordi
conf.set_quoted('USER_GENERATOR_DIR', usergeneratordir)
conf.set_quoted('USER_KEYRING_PATH', pkgsysconfdir / 'import-pubring.gpg')
conf.set_quoted('USER_PRESET_DIR', userpresetdir)
-conf.set_quoted('VENDOR_KEYRING_PATH', libexecdir / 'import-pubring.gpg')
+conf.set_quoted('VENDOR_KEYRING_PATH', rootlibexecdir / 'import-pubring.gpg')
conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
conf.set10('ENABLE_URLIFY', get_option('urlify'))
@@ -2098,7 +2134,7 @@ libsystemd = shared_library(
link_depends : libsystemd_sym,
install : true,
install_tag: 'libsystemd',
- install_dir : libdir)
+ install_dir : rootlibdir)
install_libsystemd_static = static_library(
'systemd',
@@ -2109,7 +2145,7 @@ install_libsystemd_static = static_library(
build_by_default : static_libsystemd != 'false',
install : static_libsystemd != 'false',
install_tag: 'libsystemd',
- install_dir : libdir,
+ install_dir : rootlibdir,
pic : static_libsystemd_pic,
dependencies : [libblkid,
libcap,
@@ -2144,7 +2180,7 @@ libudev = shared_library(
link_depends : libudev_sym,
install : true,
install_tag: 'libudev',
- install_dir : libdir)
+ install_dir : rootlibdir)
install_libudev_static = static_library(
'udev',
@@ -2157,7 +2193,7 @@ install_libudev_static = static_library(
build_by_default : static_libudev != 'false',
install : static_libudev != 'false',
install_tag: 'libudev',
- install_dir : libdir,
+ install_dir : rootlibdir,
link_depends : libudev_sym,
dependencies : [libmount,
libshared_deps,
@@ -2197,7 +2233,7 @@ endif
executable_template = {
'include_directories' : includes,
'link_with' : libshared,
- 'install_rpath' : pkglibdir,
+ 'install_rpath' : rootpkglibdir,
'install' : true,
}
@@ -2903,11 +2939,14 @@ alt_time_epoch = run_command('date', '-Is', '-u', '-d', '@@0@'.format(time_epoch
check : true).stdout().strip()
summary({
+ 'split /usr' : split_usr,
'split bin-sbin' : split_bin,
'prefix directory' : prefixdir,
+ 'rootprefix directory' : rootprefixdir,
'sysconf directory' : sysconfdir,
'include directory' : includedir,
'lib directory' : libdir,
+ 'rootlib directory' : rootlibdir,
'SysV init scripts' : sysvinit_path,
'SysV rc?.d directories' : sysvrcnd_path,
'PAM modules directory' : pamlibdir,
@@ -3139,3 +3178,10 @@ summary({
'enabled' : ', '.join(found),
'disabled' : ', '.join(missing)},
section : 'Features')
+
+if rootprefixdir != rootprefix_default
+ warning('\n' +
+ 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
+ 'systemd used fixed names for unit file directories and other paths, so anything\n' +
+ 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
+endif
diff --git a/meson_options.txt b/meson_options.txt
index 909e2d53e8b0..67b1fc1b7e9e 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -11,14 +11,14 @@ option('vcs-tag', type : 'boolean', value : true,
option('mode', type : 'combo', choices : ['developer', 'release'],
description : 'autoenable features suitable for systemd development/release builds')
-option('split-usr', type : 'combo', choices : ['auto', 'true', 'false'], deprecated: true,
- description : 'This option is deprecated and will be removed in a future release')
+option('split-usr', type : 'combo', choices : ['auto', 'true', 'false'],
+ description : '''/bin, /sbin aren't symlinks into /usr''')
option('split-bin', type : 'combo', choices : ['auto', 'true', 'false'],
- description : 'sbin is not a symlink to bin')
-option('rootlibdir', type : 'string', deprecated: true,
- description : 'This option is deprecated and will be removed in a future release')
-option('rootprefix', type : 'string', deprecated: true,
- description : 'This option is deprecated and will be removed in a future release')
+ description : '''sbin is not a symlink to bin''')
+option('rootlibdir', type : 'string',
+ description : '''[/usr]/lib/x86_64-linux-gnu or such''')
+option('rootprefix', type : 'string',
+ description : '''override the root prefix [default '/' if split-usr and '/usr' otherwise]''')
option('link-udev-shared', type : 'boolean',
description : 'link systemd-udevd and its helpers to libsystemd-shared.so')
option('link-executor-shared', type : 'boolean',
diff --git a/rules.d/64-btrfs.rules.in b/rules.d/64-btrfs.rules.in
index 039d759f621d..df6e12a5ddc5 100644
--- a/rules.d/64-btrfs.rules.in
+++ b/rules.d/64-btrfs.rules.in
@@ -12,6 +12,6 @@ IMPORT{builtin}="btrfs ready $devnode"
ENV{ID_BTRFS_READY}=="0", ENV{SYSTEMD_READY}="0"
# reconsider pending devices in case when multidevice volume awaits
-ENV{ID_BTRFS_READY}=="1", RUN+="{{BINDIR}}/udevadm trigger -s block -p ID_BTRFS_READY=0"
+ENV{ID_BTRFS_READY}=="1", RUN+="{{ROOTBINDIR}}/udevadm trigger -s block -p ID_BTRFS_READY=0"
LABEL="btrfs_end"
diff --git a/rules.d/71-seat.rules.in b/rules.d/71-seat.rules.in
index 1fd7ec23b097..25e4ee7e5893 100644
--- a/rules.d/71-seat.rules.in
+++ b/rules.d/71-seat.rules.in
@@ -71,11 +71,11 @@ SUBSYSTEM=="usb", ATTR{idVendor}=="17e9", ATTR{idProduct}=="401a", ATTR{product}
SUBSYSTEM=="usb", ATTR{idVendor}=="17e9", ATTR{idProduct}=="401a", ATTR{product}=="mimo inc", \
ATTR{../idVendor}=="058f", ATTR{../idProduct}=="6254", \
ENV{ID_AVOID_LOOP}=="", \
- RUN+="{{BINDIR}}/udevadm trigger --parent-match=%p/.."
+ RUN+="{{ROOTBINDIR}}/udevadm trigger --parent-match=%p/.."
TAG=="seat", ENV{ID_PATH}=="", IMPORT{builtin}="path_id"
TAG=="seat", ENV{ID_FOR_SEAT}=="", ENV{ID_PATH_TAG}!="", ENV{ID_FOR_SEAT}="$env{SUBSYSTEM}-$env{ID_PATH_TAG}"
-SUBSYSTEM=="input", ATTR{name}=="Wiebetech LLC Wiebetech", RUN+="{{BINDIR}}/loginctl lock-sessions"
+SUBSYSTEM=="input", ATTR{name}=="Wiebetech LLC Wiebetech", RUN+="{{ROOTBINDIR}}/loginctl lock-sessions"
LABEL="seat_end"
diff --git a/rules.d/99-systemd.rules.in b/rules.d/99-systemd.rules.in
index 8ba6f177f845..5cacff93c5fa 100644
--- a/rules.d/99-systemd.rules.in
+++ b/rules.d/99-systemd.rules.in
@@ -68,7 +68,7 @@ SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ENV{ID_USB_INTERFACES}=="*:0701??:
SUBSYSTEM=="udc", TAG+="systemd", ENV{SYSTEMD_WANTS}+="usb-gadget.target"
# Apply sysctl variables to network devices (and only to those) as they appear.
-ACTION=="add", SUBSYSTEM=="net", KERNEL!="lo", RUN+="{{LIBEXECDIR}}/systemd-sysctl --prefix=/net/ipv4/conf/$name --prefix=/net/ipv4/neigh/$name --prefix=/net/ipv6/conf/$name --prefix=/net/ipv6/neigh/$name"
+ACTION=="add", SUBSYSTEM=="net", KERNEL!="lo", RUN+="{{ROOTLIBEXECDIR}}/systemd-sysctl --prefix=/net/ipv4/conf/$name --prefix=/net/ipv4/neigh/$name --prefix=/net/ipv6/conf/$name --prefix=/net/ipv6/neigh/$name"
{% if ENABLE_BACKLIGHT %}
# Pull in backlight save/restore for all backlight devices and
diff --git a/shell-completion/bash/systemctl.in b/shell-completion/bash/systemctl.in
index f4576c4355b7..74507e9cfd32 100644
--- a/shell-completion/bash/systemctl.in
+++ b/shell-completion/bash/systemctl.in
@@ -13,7 +13,7 @@ __systemctl() {
}
__systemd_properties() {
- {{LIBEXECDIR}}/systemd --dump-bus-properties
+ {{ROOTLIBEXECDIR}}/systemd --dump-bus-properties
}
__contains_word () {
diff --git a/shell-completion/zsh/_systemctl.in b/shell-completion/zsh/_systemctl.in
index df9045f229bc..d9f4686f89d1 100644
--- a/shell-completion/zsh/_systemctl.in
+++ b/shell-completion/zsh/_systemctl.in
@@ -472,7 +472,7 @@ done
(( $+functions[_systemctl_unit_properties] )) ||
_systemctl_unit_properties() {
- local -a _sys_all_properties=( ${(f)"$({{LIBEXECDIR}}/systemd --no-pager --dump-bus-properties 2>/dev/null)"} )
+ local -a _sys_all_properties=( ${(f)"$({{ROOTLIBEXECDIR}}/systemd --no-pager --dump-bus-properties 2>/dev/null)"} )
_wanted systemd-unit-properties expl 'unit property' \
_values -s , "${_sys_all_properties[@]}"
}
diff --git a/src/basic/constants.h b/src/basic/constants.h
index e70817c51f84..cec9c478a2c4 100644
--- a/src/basic/constants.h
+++ b/src/basic/constants.h
@@ -56,19 +56,32 @@
#define NOTIFY_FD_MAX 768
#define NOTIFY_BUFFER_MAX PIPE_BUF
+#if HAVE_SPLIT_USR
+# define _CONF_PATHS_SPLIT_USR_NULSTR(n) "/lib/" n "\0"
+# define _CONF_PATHS_SPLIT_USR(n) , "/lib/" n
+#else
+# define _CONF_PATHS_SPLIT_USR_NULSTR(n)
+# define _CONF_PATHS_SPLIT_USR(n)
+#endif
+
/* Return a nulstr for a standard cascade of configuration paths, suitable to pass to
* conf_files_list_nulstr() to implement drop-in directories for extending configuration files. */
#define CONF_PATHS_NULSTR(n) \
"/etc/" n "\0" \
"/run/" n "\0" \
"/usr/local/lib/" n "\0" \
- "/usr/lib/" n "\0"
+ "/usr/lib/" n "\0" \
+ _CONF_PATHS_SPLIT_USR_NULSTR(n)
#define CONF_PATHS(n) \
"/etc/" n, \
"/run/" n, \
"/usr/local/lib/" n, \
- "/usr/lib/" n
+ "/usr/lib/" n \
+ _CONF_PATHS_SPLIT_USR(n)
+
+#define CONF_PATHS_USR_STRV(n) \
+ STRV_MAKE(CONF_PATHS_USR(n))
#define CONF_PATHS_STRV(n) \
STRV_MAKE(CONF_PATHS(n))
diff --git a/src/basic/path-lookup.c b/src/basic/path-lookup.c
index 540256b73b84..3d3df61fb927 100644
--- a/src/basic/path-lookup.c
+++ b/src/basic/path-lookup.c
@@ -551,6 +551,10 @@ int lookup_paths_init(
assert(scope >= 0);
assert(scope < _RUNTIME_SCOPE_MAX);
+#if HAVE_SPLIT_USR
+ flags |= LOOKUP_PATHS_SPLIT_USR;
+#endif
+
if (!empty_or_root(root_dir)) {
if (scope == RUNTIME_SCOPE_USER)
return -EINVAL;
@@ -642,7 +646,6 @@ int lookup_paths_init(
"/usr/local/lib/systemd/system",
SYSTEM_DATA_UNIT_DIR,
"/usr/lib/systemd/system",
- /* To be used ONLY for images which might be legacy split-usr */
STRV_IFNOTNULL(flags & LOOKUP_PATHS_SPLIT_USR ? "/lib/systemd/system" : NULL),
STRV_IFNOTNULL(generator_late));
break;
diff --git a/src/basic/path-lookup.h b/src/basic/path-lookup.h
index 0db2c5a98caf..cbf1bcf24e54 100644
--- a/src/basic/path-lookup.h
+++ b/src/basic/path-lookup.h
@@ -10,7 +10,7 @@
typedef enum LookupPathsFlags {
LOOKUP_PATHS_EXCLUDE_GENERATED = 1 << 0,
LOOKUP_PATHS_TEMPORARY_GENERATED = 1 << 1,
- LOOKUP_PATHS_SPLIT_USR = 1 << 2, /* Legacy, use ONLY for image payloads which might be old */
+ LOOKUP_PATHS_SPLIT_USR = 1 << 2,
} LookupPathsFlags;
typedef struct LookupPaths {
diff --git a/src/basic/path-util.h b/src/basic/path-util.h
index 792b8ff2cbc6..a224091db4ce 100644
--- a/src/basic/path-util.h
+++ b/src/basic/path-util.h
@@ -17,8 +17,8 @@
#define PATH_MERGED_BIN(x) x "bin"
#define PATH_MERGED_BIN_NULSTR(x) x "bin\0"
-#define DEFAULT_PATH_WITH_SBIN PATH_SPLIT_BIN("/usr/local/") ":" PATH_SPLIT_BIN("/usr/")
-#define DEFAULT_PATH_WITHOUT_SBIN PATH_MERGED_BIN("/usr/local/") ":" PATH_MERGED_BIN("/usr/")
+#define DEFAULT_PATH_WITH_SBIN PATH_SPLIT_BIN("/usr/local/") ":" PATH_SPLIT_BIN("/usr/") ":" PATH_SPLIT_BIN("/")
+#define DEFAULT_PATH_WITHOUT_SBIN PATH_MERGED_BIN("/usr/local/") ":" PATH_MERGED_BIN("/usr/") ":" PATH_MERGED_BIN("/")
#define DEFAULT_PATH_COMPAT PATH_SPLIT_BIN("/usr/local/") ":" PATH_SPLIT_BIN("/usr/") ":" PATH_SPLIT_BIN("/")
diff --git a/src/boot/meson.build b/src/boot/meson.build
index 55b9bd6294b0..ec1ba21d49f5 100644
--- a/src/boot/meson.build
+++ b/src/boot/meson.build
@@ -30,6 +30,7 @@ executables += [
],
'sources' : bootctl_sources,
'link_with' : boot_link_with,
+ 'install_dir' : rootbindir,
'dependencies' : libblkid,
},
libexec_template + {
@@ -41,6 +42,7 @@ executables += [
],
'sources' : files('bless-boot.c'),
'link_with' : boot_link_with,
+ 'install_dir' : rootlibexecdir,
'dependencies' : libblkid,
},
generator_template + {
@@ -65,5 +67,6 @@ executables += [
libexec_template + {
'name' : 'systemd-boot-check-no-failures',
'sources' : files('boot-check-no-failures.c'),
+ 'install_dir' : rootlibexecdir,
},
]
diff --git a/src/core/manager-serialize.c b/src/core/manager-serialize.c
index 1d2959abf439..03803a810172 100644
--- a/src/core/manager-serialize.c
+++ b/src/core/manager-serialize.c
@@ -90,6 +90,7 @@ int manager_serialize(
(void) serialize_item_format(f, "current-job-id", "%" PRIu32, m->current_job_id);
(void) serialize_item_format(f, "n-installed-jobs", "%u", m->n_installed_jobs);
(void) serialize_item_format(f, "n-failed-jobs", "%u", m->n_failed_jobs);
+ (void) serialize_bool(f, "taint-usr", m->taint_usr);
(void) serialize_bool(f, "ready-sent", m->ready_sent);
(void) serialize_bool(f, "taint-logged", m->taint_logged);
(void) serialize_bool(f, "service-watchdogs", m->service_watchdogs);
@@ -354,6 +355,15 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
else
m->n_failed_jobs += n;
+ } else if ((val = startswith(l, "taint-usr="))) {
+ int b;
+
+ b = parse_boolean(val);
+ if (b < 0)
+ log_notice("Failed to parse taint /usr flag '%s', ignoring.", val);
+ else
+ m->taint_usr = m->taint_usr || b;
+
} else if ((val = startswith(l, "ready-sent="))) {
int b;
diff --git a/src/core/manager.c b/src/core/manager.c
index 5997ef0cf13b..cc2e145260dc 100644
--- a/src/core/manager.c
+++ b/src/core/manager.c
@@ -1056,6 +1056,9 @@ int manager_new(RuntimeScope runtime_scope, ManagerTestRunFlags test_run_flags,
log_debug("Using systemd-executor binary from '%s'.", executor_path);
}
+ m->taint_usr =
+ !in_initrd() &&
+ dir_is_empty("/usr", /* ignore_hidden_or_backup= */ false) > 0;
/* Note that we do not set up the notify fd here. We do that after deserialization,
* since they might have gotten serialized across the reexec. */
@@ -4946,7 +4949,6 @@ static int manager_dispatch_handoff_timestamp_fd(sd_event_source *source, int fd
FOREACH_ARRAY(u, units, n_units) {
if (!UNIT_VTABLE(*u)->notify_handoff_timestamp)
continue;
-
UNIT_VTABLE(*u)->notify_handoff_timestamp(*u, ucred, &dt);
}
diff --git a/src/core/manager.h b/src/core/manager.h
index 0641b2726f0f..cdb1e36d3fea 100644
--- a/src/core/manager.h
+++ b/src/core/manager.h
@@ -388,6 +388,8 @@ struct Manager {
/* Flags */
bool dispatching_load_queue;
+ bool taint_usr;
+
/* Have we already sent out the READY=1 notification? */
bool ready_sent;
diff --git a/src/core/meson.build b/src/core/meson.build
index dbeb752977c8..5fa5abc82c75 100644
--- a/src/core/meson.build
+++ b/src/core/meson.build
@@ -142,7 +142,7 @@ libcore = shared_library(
link_whole: libcore_static,
link_with : libshared,
install : true,
- install_dir : pkglibdir)
+ install_dir : rootpkglibdir)
core_includes = [includes, include_directories('.')]
@@ -261,7 +261,7 @@ if install_sysconfdir
endif
install_emptydir(sbindir)
-meson.add_install_script(sh, '-c', ln_s.format(libexecdir / 'systemd', sbindir / 'init'))
+meson.add_install_script(sh, '-c', ln_s.format(rootlibexecdir / 'systemd', rootsbindir / 'init'))
############################################################
diff --git a/src/core/namespace.c b/src/core/namespace.c
index a9b98bcd32b2..e2f37287075e 100644
--- a/src/core/namespace.c
+++ b/src/core/namespace.c
@@ -154,7 +154,7 @@ static const MountEntry protect_kernel_tunables_sys_table[] = {
/* ProtectKernelModules= option */
static const MountEntry protect_kernel_modules_table[] = {
- { "/usr/lib/modules", MOUNT_INACCESSIBLE, true },
+ { "/lib/modules", MOUNT_INACCESSIBLE, true },
};
/* ProtectKernelLogs= option */
@@ -195,6 +195,9 @@ static const MountEntry protect_system_yes_table[] = {
{ "/usr", MOUNT_READ_ONLY, false },
{ "/boot", MOUNT_READ_ONLY, true },
{ "/efi", MOUNT_READ_ONLY, true },
+ { "/lib", MOUNT_READ_ONLY, true },
+ { "/bin", MOUNT_READ_ONLY, true },
+ { "/sbin", MOUNT_READ_ONLY, true },
};
/* ProtectSystem=full includes ProtectSystem=yes */
@@ -203,6 +206,9 @@ static const MountEntry protect_system_full_table[] = {
{ "/boot", MOUNT_READ_ONLY, true },
{ "/efi", MOUNT_READ_ONLY, true },
{ "/etc", MOUNT_READ_ONLY, false },
+ { "/lib", MOUNT_READ_ONLY, false },
+ { "/bin", MOUNT_READ_ONLY, false },
+ { "/sbin", MOUNT_READ_ONLY, false },
};
/* ProtectSystem=strict table. In this strict mode, we mount everything read-only, except for /proc, /dev,
diff --git a/src/core/org.freedesktop.systemd1.policy.in b/src/core/org.freedesktop.systemd1.policy.in
index 0083e0b58521..9e9a20f66f67 100644
--- a/src/core/org.freedesktop.systemd1.policy.in
+++ b/src/core/org.freedesktop.systemd1.policy.in
@@ -26,7 +26,7 @@
<allow_inactive>no</allow_inactive>
<allow_active>auth_admin_keep</allow_active>
</defaults>
- <annotate key="org.freedesktop.policykit.exec.path">{{LIBEXECDIR}}/systemd-reply-password</annotate>
+ <annotate key="org.freedesktop.policykit.exec.path">{{ROOTLIBEXECDIR}}/systemd-reply-password</annotate>
</action>
<action id="org.freedesktop.systemd1.manage-units">
diff --git a/src/core/systemd.pc.in b/src/core/systemd.pc.in
index f3b85b01909a..693433b34b87 100644
--- a/src/core/systemd.pc.in
+++ b/src/core/systemd.pc.in
@@ -11,24 +11,19 @@
# considered deprecated (though there is no plan to remove them). New names
# shall have underscores.
-# root_prefix and rootprefix are deprecated since we dropped support for split-usr
-# however we used to install units in root_prefix and a lot of downstream software
-# overrode this variable in their build system to support installing units elsewhere.
-# To stop those builds from silently breaking we keep root_prefix around but have
-# it as an alias for prefix
-root_prefix={{PREFIX_NOSLASH}}
+prefix=/usr
+root_prefix={{ROOTPREFIX_NOSLASH}}
rootprefix=${root_prefix}
-prefix=${rootprefix}
sysconf_dir={{SYSCONF_DIR}}
sysconfdir=${sysconf_dir}
-systemd_util_dir=${prefix}/lib/systemd
+systemd_util_dir=${root_prefix}/lib/systemd
systemdutildir=${systemd_util_dir}
-systemd_system_unit_dir=${prefix}/lib/systemd/system
+systemd_system_unit_dir=${rootprefix}/lib/systemd/system
systemdsystemunitdir=${systemd_system_unit_dir}
-systemd_system_preset_dir=${prefix}/lib/systemd/system-preset
+systemd_system_preset_dir=${rootprefix}/lib/systemd/system-preset
systemdsystempresetdir=${systemd_system_preset_dir}
systemd_user_unit_dir=${prefix}/lib/systemd/user
@@ -49,7 +44,7 @@ systemdsystemunitpath=${systemd_system_unit_path}
systemd_user_unit_path=${systemd_user_conf_dir}:/etc/systemd/user:/run/systemd/user:/usr/local/lib/systemd/user:/usr/local/share/systemd/user:${systemd_user_unit_dir}:/usr/lib/systemd/user:/usr/share/systemd/user
systemduserunitpath=${systemd_user_unit_path}
-systemd_system_generator_dir=${prefix}/lib/systemd/system-generators
+systemd_system_generator_dir=${root_prefix}/lib/systemd/system-generators
systemdsystemgeneratordir=${systemd_system_generator_dir}
systemd_user_generator_dir=${prefix}/lib/systemd/user-generators
@@ -61,10 +56,10 @@ systemdsystemgeneratorpath=${systemd_system_generator_path}
systemd_user_generator_path=/run/systemd/user-generators:/etc/systemd/user-generators:/usr/local/lib/systemd/user-generators:${systemd_user_generator_dir}
systemdusergeneratorpath=${systemd_user_generator_path}
-systemd_sleep_dir=${prefix}/lib/systemd/system-sleep
+systemd_sleep_dir=${root_prefix}/lib/systemd/system-sleep
systemdsleepdir=${systemd_sleep_dir}
-systemd_shutdown_dir=${prefix}/lib/systemd/system-shutdown
+systemd_shutdown_dir=${root_prefix}/lib/systemd/system-shutdown
systemdshutdowndir=${systemd_shutdown_dir}
tmpfiles_dir=${prefix}/lib/tmpfiles.d
@@ -72,16 +67,16 @@ tmpfilesdir=${tmpfiles_dir}
user_tmpfiles_dir=${prefix}/share/user-tmpfiles.d
-sysusers_dir=${prefix}/lib/sysusers.d
+sysusers_dir=${rootprefix}/lib/sysusers.d
sysusersdir=${sysusers_dir}
-sysctl_dir=${prefix}/lib/sysctl.d
+sysctl_dir=${rootprefix}/lib/sysctl.d
sysctldir=${sysctl_dir}
-binfmt_dir=${prefix}/lib/binfmt.d
+binfmt_dir=${rootprefix}/lib/binfmt.d
binfmtdir=${binfmt_dir}
-modules_load_dir=${prefix}/lib/modules-load.d
+modules_load_dir=${rootprefix}/lib/modules-load.d
modulesloaddir=${modules_load_dir}
catalog_dir=${prefix}/lib/systemd/catalog
diff --git a/src/cryptsetup/cryptsetup-generator.c b/src/cryptsetup/cryptsetup-generator.c
index 4db25d362f05..b42fe806a547 100644
--- a/src/cryptsetup/cryptsetup-generator.c
+++ b/src/cryptsetup/cryptsetup-generator.c
@@ -536,13 +536,13 @@ static int create_disk(
}
fprintf(f,
- "ExecStartPost=" LIBEXECDIR "/systemd-makefs '%s' '/dev/mapper/%s'\n",
+ "ExecStartPost=" ROOTLIBEXECDIR "/systemd-makefs '%s' '/dev/mapper/%s'\n",
tmp_fstype_escaped ?: "ext4", name_escaped);
}
if (swap)
fprintf(f,
- "ExecStartPost=" LIBEXECDIR "/systemd-makefs swap '/dev/mapper/%s'\n",
+ "ExecStartPost=" ROOTLIBEXECDIR "/systemd-makefs swap '/dev/mapper/%s'\n",
name_escaped);
r = fflush_and_check(f);
diff --git a/src/cryptsetup/cryptsetup-tokens/meson.build b/src/cryptsetup/cryptsetup-tokens/meson.build
index b26940c6a3b1..9f9c1f20b649 100644
--- a/src/cryptsetup/cryptsetup-tokens/meson.build
+++ b/src/cryptsetup/cryptsetup-tokens/meson.build
@@ -30,7 +30,7 @@ template = {
libshared,
],
'version-script' : meson.current_source_dir() / 'cryptsetup-token.sym',
- 'install_rpath' : pkglibdir,
+ 'install_rpath' : rootpkglibdir,
'install' : true,
'install_dir' : libcryptsetup_plugins_dir,
}
diff --git a/src/delta/delta.c b/src/delta/delta.c
index 3433250549bb..a82f7f5ee17a 100644
--- a/src/delta/delta.c
+++ b/src/delta/delta.c
@@ -35,6 +35,9 @@ static const char prefixes[] =
"/usr/local/share\0"
"/usr/lib\0"
"/usr/share\0"
+#if HAVE_SPLIT_USR
+ "/lib\0"
+#endif
;
static const char suffixes[] =
@@ -365,6 +368,36 @@ static int enumerate_dir(
return 0;
}
+static int should_skip_path(const char *prefix, const char *suffix) {
+#if HAVE_SPLIT_USR
+ _cleanup_free_ char *target = NULL, *dirname = NULL;
+
+ dirname = path_join(prefix, suffix);
+ if (!dirname)
+ return -ENOMEM;
+
+ if (chase(dirname, NULL, 0, &target, NULL) < 0)
+ return false;
+
+ NULSTR_FOREACH(p, prefixes) {
+ _cleanup_free_ char *tmp = NULL;
+
+ if (path_startswith(dirname, p))
+ continue;
+
+ tmp = path_join(p, suffix);
+ if (!tmp)
+ return -ENOMEM;
+
+ if (path_equal(target, tmp)) {
+ log_debug("%s redirects to %s, skipping.", dirname, target);
+ return true;
+ }
+ }
+#endif
+ return false;
+}
+
static int process_suffix(const char *suffix, const char *onlyprefix) {
char *f, *key;
OrderedHashmap *top, *bottom, *drops, *h;
@@ -388,6 +421,9 @@ static int process_suffix(const char *suffix, const char *onlyprefix) {
NULSTR_FOREACH(p, prefixes) {
_cleanup_free_ char *t = NULL;
+ if (should_skip_path(p, suffix) > 0)
+ continue;
+
t = path_join(p, suffix);
if (!t) {
r = -ENOMEM;
diff --git a/src/dissect/meson.build b/src/dissect/meson.build
index e422dbdd27b2..c6a485db97ec 100644
--- a/src/dissect/meson.build
+++ b/src/dissect/meson.build
@@ -13,5 +13,5 @@ if conf.get('HAVE_BLKID') == 1
install_emptydir(sbindir)
meson.add_install_script(sh, '-c',
ln_s.format(bindir / 'systemd-dissect',
- sbindir / 'mount.ddi'))
+ rootsbindir / 'mount.ddi'))
endif
diff --git a/src/fstab-generator/meson.build b/src/fstab-generator/meson.build
index 7b90580e9063..2146d24474bb 100644
--- a/src/fstab-generator/meson.build
+++ b/src/fstab-generator/meson.build
@@ -9,4 +9,4 @@ executables += [
meson.add_install_script(sh, '-c',
ln_s.format(systemgeneratordir / 'systemd-fstab-generator',
- libexecdir / 'systemd-sysroot-fstab-check'))
+ rootlibexecdir / 'systemd-sysroot-fstab-check'))
diff --git a/src/import/meson.build b/src/import/meson.build
index 184dd7bbf2dc..ed5290df9cf6 100644
--- a/src/import/meson.build
+++ b/src/import/meson.build
@@ -129,5 +129,5 @@ install_data('org.freedesktop.import1.policy',
install_dir : polkitpolicydir)
install_data('import-pubring.gpg',
- install_dir : libexecdir)
+ install_dir : rootlibexecdir)
# TODO: shouldn't this be in pkgdatadir?
diff --git a/src/integritysetup/integritysetup-generator.c b/src/integritysetup/integritysetup-generator.c
index 72b890575ce1..ea187e0c191a 100644
--- a/src/integritysetup/integritysetup-generator.c
+++ b/src/integritysetup/integritysetup-generator.c
@@ -101,8 +101,8 @@ static int create_disk(
"Type=oneshot\n"
"RemainAfterExit=yes\n"
"TimeoutSec=infinity\n"
- "ExecStart=" LIBEXECDIR "/systemd-integritysetup attach '%s' '%s' '%s' '%s'\n"
- "ExecStop=" LIBEXECDIR "/systemd-integritysetup detach '%s'\n",
+ "ExecStart=" ROOTLIBEXECDIR "/systemd-integritysetup attach '%s' '%s' '%s' '%s'\n"
+ "ExecStop=" ROOTLIBEXECDIR "/systemd-integritysetup detach '%s'\n",
name_escaped, device, empty_to_dash(key_file_escaped), empty_to_dash(options),
name_escaped);
diff --git a/src/libsystemd/libsystemd.pc.in b/src/libsystemd/libsystemd.pc.in
index 3a43ef60710e..da6e4e667ef7 100644
--- a/src/libsystemd/libsystemd.pc.in
+++ b/src/libsystemd/libsystemd.pc.in
@@ -9,7 +9,7 @@
prefix={{PREFIX}}
exec_prefix={{PREFIX}}
-libdir={{LIBDIR}}
+libdir={{ROOTLIBDIR}}
includedir={{INCLUDE_DIR}}
Name: systemd
diff --git a/src/libsystemd/sd-hwdb/hwdb-internal.h b/src/libsystemd/sd-hwdb/hwdb-internal.h
index 9db3b314416e..5302679a6252 100644
--- a/src/libsystemd/sd-hwdb/hwdb-internal.h
+++ b/src/libsystemd/sd-hwdb/hwdb-internal.h
@@ -86,4 +86,5 @@ struct trie_value_entry2_f {
"/etc/systemd/hwdb/hwdb.bin\0" \
"/etc/udev/hwdb.bin\0" \
"/usr/lib/systemd/hwdb/hwdb.bin\0" \
+ _CONF_PATHS_SPLIT_USR_NULSTR("systemd/hwdb/hwdb.bin") \
UDEVLIBEXECDIR "/hwdb.bin\0"
diff --git a/src/libsystemd/sd-path/sd-path.c b/src/libsystemd/sd-path/sd-path.c
index 8edbde9c8ec4..0d68a4394514 100644
--- a/src/libsystemd/sd-path/sd-path.c
+++ b/src/libsystemd/sd-path/sd-path.c
@@ -311,7 +311,7 @@ static int get_path(uint64_t type, char **buffer, const char **ret) {
return from_user_dir("XDG_DESKTOP_DIR", buffer, ret);
case SD_PATH_SYSTEMD_UTIL:
- *ret = PREFIX_NOSLASH "/lib/systemd";
+ *ret = ROOTPREFIX_NOSLASH "/lib/systemd";
return 0;
case SD_PATH_SYSTEMD_SYSTEM_UNIT:
@@ -319,7 +319,7 @@ static int get_path(uint64_t type, char **buffer, const char **ret) {
return 0;
case SD_PATH_SYSTEMD_SYSTEM_PRESET:
- *ret = PREFIX_NOSLASH "/lib/systemd/system-preset";
+ *ret = ROOTPREFIX_NOSLASH "/lib/systemd/system-preset";
return 0;
case SD_PATH_SYSTEMD_USER_UNIT:
@@ -327,7 +327,7 @@ static int get_path(uint64_t type, char **buffer, const char **ret) {
return 0;
case SD_PATH_SYSTEMD_USER_PRESET:
- *ret = PREFIX_NOSLASH "/lib/systemd/user-preset";
+ *ret = ROOTPREFIX_NOSLASH "/lib/systemd/user-preset";
return 0;
case SD_PATH_SYSTEMD_SYSTEM_CONF:
@@ -347,11 +347,11 @@ static int get_path(uint64_t type, char **buffer, const char **ret) {
return 0;
case SD_PATH_SYSTEMD_SLEEP:
- *ret = PREFIX_NOSLASH "/lib/systemd/system-sleep";
+ *ret = ROOTPREFIX_NOSLASH "/lib/systemd/system-sleep";
return 0;
case SD_PATH_SYSTEMD_SHUTDOWN:
- *ret = PREFIX_NOSLASH "/lib/systemd/system-shutdown";
+ *ret = ROOTPREFIX_NOSLASH "/lib/systemd/system-shutdown";
return 0;
case SD_PATH_TMPFILES:
@@ -359,19 +359,19 @@ static int get_path(uint64_t type, char **buffer, const char **ret) {
return 0;
case SD_PATH_SYSUSERS:
- *ret = PREFIX_NOSLASH "/lib/sysusers.d";
+ *ret = ROOTPREFIX_NOSLASH "/lib/sysusers.d";
return 0;
case SD_PATH_SYSCTL:
- *ret = PREFIX_NOSLASH "/lib/sysctl.d";
+ *ret = ROOTPREFIX_NOSLASH "/lib/sysctl.d";
return 0;
case SD_PATH_BINFMT:
- *ret = PREFIX_NOSLASH "/lib/binfmt.d";
+ *ret = ROOTPREFIX_NOSLASH "/lib/binfmt.d";
return 0;
case SD_PATH_MODULES_LOAD:
- *ret = PREFIX_NOSLASH "/lib/modules-load.d";
+ *ret = ROOTPREFIX_NOSLASH "/lib/modules-load.d";
return 0;
case SD_PATH_CATALOG:
@@ -531,6 +531,9 @@ static int get_search(uint64_t type, char ***ret) {
true,
ARRAY_SBIN_BIN("/usr/local/"),
ARRAY_SBIN_BIN("/usr/"),
+#if HAVE_SPLIT_USR
+ ARRAY_SBIN_BIN("/"),
+#endif
NULL);
case SD_PATH_SEARCH_LIBRARY_PRIVATE:
@@ -541,6 +544,9 @@ static int get_search(uint64_t type, char ***ret) {
false,
"/usr/local/lib",
"/usr/lib",
+#if HAVE_SPLIT_USR
+ "/lib",
+#endif
NULL);
case SD_PATH_SEARCH_LIBRARY_ARCH:
@@ -550,6 +556,9 @@ static int get_search(uint64_t type, char ***ret) {
"LD_LIBRARY_PATH",
true,
LIBDIR,
+#if HAVE_SPLIT_USR
+ ROOTLIBDIR,
+#endif
NULL);
case SD_PATH_SEARCH_SHARED:
diff --git a/src/libudev/libudev.pc.in b/src/libudev/libudev.pc.in
index 6541bcb1ab6b..1d6487fa4084 100644
--- a/src/libudev/libudev.pc.in
+++ b/src/libudev/libudev.pc.in
@@ -9,7 +9,7 @@
prefix={{PREFIX}}
exec_prefix={{PREFIX}}
-libdir={{LIBDIR}}
+libdir={{ROOTLIBDIR}}
includedir={{INCLUDE_DIR}}
Name: libudev
diff --git a/src/login/meson.build b/src/login/meson.build
index 43db03184c58..5636dbde41ae 100644
--- a/src/login/meson.build
+++ b/src/login/meson.build
@@ -50,6 +50,7 @@ executables += [
'dbus' : true,
'conditions' : ['ENABLE_LOGIND'],
'sources' : systemd_logind_sources,
+ 'install_dir' : rootlibexecdir,
'link_with' : [
liblogind_core,
libshared,
@@ -64,6 +65,7 @@ executables += [
'public' : true,
'conditions' : ['ENABLE_LOGIND'],
'sources' : loginctl_sources,
+ 'install_dir' : rootbindir,
'dependencies' : [
liblz4_cflags,
libxz_cflags,
diff --git a/src/machine/machinectl.c b/src/machine/machinectl.c
index 1b63e6d20378..e419289e5c78 100644
--- a/src/machine/machinectl.c
+++ b/src/machine/machinectl.c
@@ -1997,7 +1997,7 @@ static int chainload_importctl(int argc, char *argv[]) {
log_debug("Chainloading: %s", joined);
}
- r = invoke_callout_binary(BINDIR "/importctl", c);
+ r = invoke_callout_binary(ROOTBINDIR "/importctl", c);
return log_error_errno(r, "Failed to invoke 'importctl': %m");
}
diff --git a/src/portable/meson.build b/src/portable/meson.build
index 210829b85145..e168b509c340 100644
--- a/src/portable/meson.build
+++ b/src/portable/meson.build
@@ -25,6 +25,7 @@ executables += [
'conditions' : ['ENABLE_PORTABLED'],
'sources' : systemd_portabled_sources,
'link_with' : portabled_link_with,
+ 'install_dir' : rootlibexecdir,
'dependencies' : [
libselinux,
threads,
@@ -36,6 +37,7 @@ executables += [
'conditions' : ['ENABLE_PORTABLED'],
'sources' : files('portablectl.c'),
'link_with' : portabled_link_with,
+ 'install_dir' : rootbindir,
'dependencies' : threads,
},
]
diff --git a/src/portable/portable.c b/src/portable/portable.c
index 53418c417b51..153c8dfb74f5 100644
--- a/src/portable/portable.c
+++ b/src/portable/portable.c
@@ -245,8 +245,8 @@ static int extract_now(
}
/* Then, send unit file data to the parent (or/and add it to the hashmap). For that we use our usual unit
- * discovery logic. Note that we force looking inside of /lib/systemd/system/ for units too, as the
- * image might have a legacy split-usr layout. */
+ * discovery logic. Note that we force looking inside of /lib/systemd/system/ for units too, as we mightbe
+ * compiled for a split-usr system but the image might be a legacy-usr one. */
r = lookup_paths_init(&paths, RUNTIME_SCOPE_SYSTEM, LOOKUP_PATHS_SPLIT_USR, where);
if (r < 0)
return log_debug_errno(r, "Failed to acquire lookup paths: %m");
@@ -1664,7 +1664,7 @@ int portable_attach(
strempty(extensions_joined));
}
- r = lookup_paths_init(&paths, RUNTIME_SCOPE_SYSTEM, /* flags= */ 0, NULL);
+ r = lookup_paths_init(&paths, RUNTIME_SCOPE_SYSTEM, LOOKUP_PATHS_SPLIT_USR, NULL);
if (r < 0)
return r;
@@ -1854,7 +1854,7 @@ int portable_detach(
assert(name_or_path);
- r = lookup_paths_init(&paths, RUNTIME_SCOPE_SYSTEM, /* flags= */ 0, NULL);
+ r = lookup_paths_init(&paths, RUNTIME_SCOPE_SYSTEM, LOOKUP_PATHS_SPLIT_USR, NULL);
if (r < 0)
return r;
@@ -2040,7 +2040,7 @@ static int portable_get_state_internal(
assert(name_or_path);
assert(ret);
- r = lookup_paths_init(&paths, RUNTIME_SCOPE_SYSTEM, /* flags= */ 0, NULL);
+ r = lookup_paths_init(&paths, RUNTIME_SCOPE_SYSTEM, LOOKUP_PATHS_SPLIT_USR, NULL);
if (r < 0)
return r;
diff --git a/src/resolve/meson.build b/src/resolve/meson.build
index d336b2c07bf4..ae1bc2a825dc 100644
--- a/src/resolve/meson.build
+++ b/src/resolve/meson.build
@@ -144,6 +144,7 @@ executables += [
files('resolved.c'),
'include_directories' : resolve_includes,
'link_with' : link_with,
+ 'install_dir': rootlibexecdir,
'dependencies' : systemd_resolved_dependencies,
},
executable_template + {
@@ -152,6 +153,7 @@ executables += [
'conditions' : ['ENABLE_RESOLVE'],
'sources' : resolvectl_sources,
'link_with' : link_with,
+ 'install_dir': rootbindir,
'dependencies' : [
lib_openssl_or_gcrypt,
libidn,
@@ -231,17 +233,17 @@ if conf.get('ENABLE_RESOLVE') == 1
install_data('org.freedesktop.resolve1.policy',
install_dir : polkitpolicydir)
install_data('resolv.conf',
- install_dir : libexecdir)
+ install_dir : rootlibexecdir)
- install_emptydir(sbindir)
+ install_emptydir(rootsbindir)
meson.add_install_script(sh, '-c',
- ln_s.format(bindir / 'resolvectl',
- sbindir / 'resolvconf'))
+ ln_s.format(rootbindir / 'resolvectl',
+ rootsbindir / 'resolvconf'))
# symlink for backwards compatibility after rename
meson.add_install_script(sh, '-c',
- ln_s.format(bindir / 'resolvectl',
- bindir / 'systemd-resolve'))
+ ln_s.format(rootbindir / 'resolvectl',
+ rootbindir / 'systemd-resolve'))
endif
custom_target(
diff --git a/src/rpm/macros.systemd.in b/src/rpm/macros.systemd.in
index ce65ec670042..815e8ce9c838 100644
--- a/src/rpm/macros.systemd.in
+++ b/src/rpm/macros.systemd.in
@@ -5,7 +5,7 @@
# RPM macros for packages installing systemd unit files
-%_systemd_util_dir {{LIBEXECDIR}}
+%_systemd_util_dir {{ROOTLIBEXECDIR}}
%_unitdir {{SYSTEM_DATA_UNIT_DIR}}
%_userunitdir {{USER_DATA_UNIT_DIR}}
%_presetdir {{SYSTEM_PRESET_DIR}}
@@ -187,10 +187,10 @@ SYSTEMD_INLINE_EOF\
%sysctl_apply() \
%{expand:%%{?__systemd_someargs_%#:%%__systemd_someargs_%# sysctl_apply}} \
-[ -x {{LIBEXECDIR}}/systemd-sysctl ] && {{LIBEXECDIR}}/systemd-sysctl %{?*} || : \
+[ -x {{ROOTLIBEXECDIR}}/systemd-sysctl ] && {{ROOTLIBEXECDIR}}/systemd-sysctl %{?*} || : \
%{nil}
%binfmt_apply() \
%{expand:%%{?__systemd_someargs_%#:%%__systemd_someargs_%# binfmt_apply}} \
-[ -x {{LIBEXECDIR}}/systemd-binfmt ] && {{LIBEXECDIR}}/systemd-binfmt %{?*} || : \
+[ -x {{ROOTLIBEXECDIR}}/systemd-binfmt ] && {{ROOTLIBEXECDIR}}/systemd-binfmt %{?*} || : \
%{nil}
diff --git a/src/rpm/meson.build b/src/rpm/meson.build
index af39ff145ab9..817665912a9f 100644
--- a/src/rpm/meson.build
+++ b/src/rpm/meson.build
@@ -3,8 +3,8 @@
in_files = [
['macros.systemd', rpmmacrosdir != 'no', rpmmacrosdir],
- # we conditionalize on rpmmacrosdir, but install into libexecdir
- ['systemd-update-helper', rpmmacrosdir != 'no', libexecdir],
+ # we conditionalize on rpmmacrosdir, but install into rootlibexecdir
+ ['systemd-update-helper', rpmmacrosdir != 'no', rootlibexecdir],
['triggers.systemd', false],
['triggers.systemd.sh', false]]
diff --git a/src/rpm/triggers.systemd.in b/src/rpm/triggers.systemd.in
index d480ab84b6bb..60b963fffdfd 100644
--- a/src/rpm/triggers.systemd.in
+++ b/src/rpm/triggers.systemd.in
@@ -58,7 +58,7 @@ assert(rpm.execute("journalctl", "--update-catalog"))
-- This script will automatically apply binfmt rules if files have been
-- installed or updated in {{BINFMT_DIR}}.
if posix.access("/run/systemd/system") then
- assert(rpm.execute("{{LIBEXECDIR}}/systemd-binfmt"))
+ assert(rpm.execute("{{ROOTLIBEXECDIR}}/systemd-binfmt"))
end
%transfiletriggerin -P 1000600 -p <lua> -- {{TMPFILES_DIR}}
@@ -78,5 +78,5 @@ end
-- This script will automatically apply sysctl rules if files have been
-- installed or updated in {{SYSCTL_DIR}}.
if posix.access("/run/systemd/system") then
- assert(rpm.execute("{{LIBEXECDIR}}/systemd-sysctl"))
+ assert(rpm.execute("{{ROOTLIBEXECDIR}}/systemd-sysctl"))
end
diff --git a/src/rpm/triggers.systemd.sh.in b/src/rpm/triggers.systemd.sh.in
index 1b94f7d73a05..8c301f5ed9d6 100644
--- a/src/rpm/triggers.systemd.sh.in
+++ b/src/rpm/triggers.systemd.sh.in
@@ -61,7 +61,7 @@ journalctl --update-catalog || :
if test -d "/run/systemd/system"; then
# systemd-binfmt might fail if binfmt_misc kernel module is not loaded
# during install
- {{LIBEXECDIR}}/systemd-binfmt || :
+ {{ROOTLIBEXECDIR}}/systemd-binfmt || :
fi
%transfiletriggerin -P 1000600 -- {{TMPFILES_DIR}}
@@ -83,5 +83,5 @@ fi
# This script will automatically apply sysctl rules if files have been
# installed or updated in {{SYSCTL_DIR}}.
if test -d "/run/systemd/system"; then
- {{LIBEXECDIR}}/systemd-sysctl || :
+ {{ROOTLIBEXECDIR}}/systemd-sysctl || :
fi
diff --git a/src/shared/install.c b/src/shared/install.c
index 53566b7eef7f..50e899274450 100644
--- a/src/shared/install.c
+++ b/src/shared/install.c
@@ -266,6 +266,11 @@ static int path_is_vendor_or_generator(const LookupPaths *lp, const char *path)
if (path_startswith(rpath, "/usr"))
return true;
+#if HAVE_SPLIT_USR
+ if (path_startswith(rpath, "/lib"))
+ return true;
+#endif
+
if (path_is_generator(lp, rpath))
return true;
diff --git a/src/shared/kbd-util.c b/src/shared/kbd-util.c
index 60e0429b82a8..2b918138cb67 100644
--- a/src/shared/kbd-util.c
+++ b/src/shared/kbd-util.c
@@ -14,7 +14,8 @@
#define KBD_KEYMAP_DIRS \
"/usr/share/keymaps/", \
"/usr/share/kbd/keymaps/", \
- "/usr/lib/kbd/keymaps/"
+ "/usr/lib/kbd/keymaps/", \
+ "/lib/kbd/keymaps/"
int keymap_directories(char ***ret) {
assert(ret);
diff --git a/src/shared/meson.build b/src/shared/meson.build
index e513c0ec1c27..e7ce0cf4935c 100644
--- a/src/shared/meson.build
+++ b/src/shared/meson.build
@@ -363,7 +363,7 @@ libshared = shared_library(
dependencies : [libshared_deps,
userspace],
install : true,
- install_dir : pkglibdir)
+ install_dir : rootpkglibdir)
shared_fdisk_sources = files('fdisk-util.c')
diff --git a/src/shared/resolve-util.h b/src/shared/resolve-util.h
index 2d210f9af755..7c9008c7053f 100644
--- a/src/shared/resolve-util.h
+++ b/src/shared/resolve-util.h
@@ -96,4 +96,4 @@ DnsCacheMode dns_cache_mode_from_string(const char *s) _pure_;
#define PRIVATE_STUB_RESOLV_CONF "/run/systemd/resolve/stub-resolv.conf"
/* A static resolv.conf file containing no domains, but only our own DNS server address */
-#define PRIVATE_STATIC_RESOLV_CONF LIBEXECDIR "/resolv.conf"
+#define PRIVATE_STATIC_RESOLV_CONF ROOTLIBEXECDIR "/resolv.conf"
diff --git a/src/shared/userdb-dropin.h b/src/shared/userdb-dropin.h
index 3bd1b9c8451f..fad3981f7c6b 100644
--- a/src/shared/userdb-dropin.h
+++ b/src/shared/userdb-dropin.h
@@ -13,7 +13,8 @@
"/run/" n "\0" \
"/run/host/" n "\0" \
"/usr/local/lib/" n "\0" \
- "/usr/lib/" n "\0"
+ "/usr/lib/" n "\0" \
+ _CONF_PATHS_SPLIT_USR_NULSTR(n)
int dropin_user_record_by_name(const char *name, const char *path, UserDBFlags flags, UserRecord **ret);
int dropin_user_record_by_uid(uid_t uid, const char *path, UserDBFlags flags, UserRecord **ret);
diff --git a/src/shared/userdb.c b/src/shared/userdb.c
index 75dece344293..353388125f79 100644
--- a/src/shared/userdb.c
+++ b/src/shared/userdb.c
@@ -1448,7 +1448,7 @@ int userdb_block_nss_systemd(int b) {
/* Note that we might be called from libnss_systemd.so.2 itself, but that should be fine, really. */
- dl = dlopen(LIBDIR "/libnss_systemd.so.2", RTLD_LAZY|RTLD_NODELETE);
+ dl = dlopen(ROOTLIBDIR "/libnss_systemd.so.2", RTLD_LAZY|RTLD_NODELETE);
if (!dl) {
/* If the file isn't installed, don't complain loudly */
log_debug("Failed to dlopen(libnss_systemd.so.2), ignoring: %s", dlerror());
diff --git a/src/sysext/meson.build b/src/sysext/meson.build
index 2983970d802a..09b68fde382a 100644
--- a/src/sysext/meson.build
+++ b/src/sysext/meson.build
@@ -10,6 +10,6 @@ executables += [
]
if conf.get('ENABLE_SYSEXT') == 1
- meson.add_install_script(sh, '-c', ln_s.format(bindir / 'systemd-sysext',
- bindir / 'systemd-confext'))
+ meson.add_install_script(sh, '-c', ln_s.format(rootbindir / 'systemd-sysext',
+ rootbindir / 'systemd-confext'))
endif
diff --git a/src/systemctl/meson.build b/src/systemctl/meson.build
index 88f73bf502a7..30d173ed123c 100644
--- a/src/systemctl/meson.build
+++ b/src/systemctl/meson.build
@@ -53,6 +53,7 @@ executables += [
'public' : true,
'sources' : systemctl_sources,
'link_with' : systemctl_link_with,
+ 'install_dir' : rootbindir,
'dependencies' : [
libcap,
liblz4_cflags,
diff --git a/src/systemctl/systemctl-sysv-compat.c b/src/systemctl/systemctl-sysv-compat.c
index 8ee16eb13f88..b55675c83aa1 100644
--- a/src/systemctl/systemctl-sysv-compat.c
+++ b/src/systemctl/systemctl-sysv-compat.c
@@ -137,7 +137,7 @@ int enable_sysv_units(const char *verb, char **args) {
while (args[f]) {
const char *argv[] = {
- LIBEXECDIR "/systemd-sysv-install",
+ ROOTLIBEXECDIR "/systemd-sysv-install",
NULL, /* --root= */
NULL, /* verb */
NULL, /* service */
diff --git a/src/udev/meson.build b/src/udev/meson.build
index 3535551e7440..33d9aef9fbad 100644
--- a/src/udev/meson.build
+++ b/src/udev/meson.build
@@ -97,7 +97,7 @@ link_config_gperf_c = custom_target(
if get_option('link-udev-shared')
udev_link_with = [libshared]
- udev_rpath = pkglibdir
+ udev_rpath = rootpkglibdir
else
udev_link_with = [libshared_static,
libsystemd_static]
diff --git a/src/userdb/20-systemd-userdb.conf.in b/src/userdb/20-systemd-userdb.conf.in
index 031fc3a4b89b..823907a5fe31 100644
--- a/src/userdb/20-systemd-userdb.conf.in
+++ b/src/userdb/20-systemd-userdb.conf.in
@@ -2,5 +2,5 @@
#
# Make sure SSH authorized keys recorded in user records can be consumed by SSH
#
-AuthorizedKeysCommand {{BINDIR}}/userdbctl ssh-authorized-keys %u
+AuthorizedKeysCommand {{ROOTBINDIR}}/userdbctl ssh-authorized-keys %u
AuthorizedKeysCommandUser root
diff --git a/src/xdg-autostart-generator/xdg-autostart-service.c b/src/xdg-autostart-generator/xdg-autostart-service.c
index 480d1009c3e5..6778c90535b2 100644
--- a/src/xdg-autostart-generator/xdg-autostart-service.c
+++ b/src/xdg-autostart-generator/xdg-autostart-service.c
@@ -668,7 +668,7 @@ int xdg_autostart_service_generate_unit(
/* Just assume the values are reasonably sane */
fprintf(f,
- "ExecCondition=" LIBEXECDIR "/systemd-xdg-autostart-condition \"%s\" \"%s\"\n",
+ "ExecCondition=" ROOTLIBEXECDIR "/systemd-xdg-autostart-condition \"%s\" \"%s\"\n",
e_only_show_in,
e_not_show_in);
}
diff --git a/sysctl.d/50-coredump.conf.in b/sysctl.d/50-coredump.conf.in
index 90c080bdfefa..5fb551a8cf9f 100644
--- a/sysctl.d/50-coredump.conf.in
+++ b/sysctl.d/50-coredump.conf.in
@@ -13,7 +13,7 @@
# the core dump.
#
# See systemd-coredump(8) and core(5).
-kernel.core_pattern=|{{LIBEXECDIR}}/systemd-coredump %P %u %g %s %t %c %h
+kernel.core_pattern=|{{ROOTLIBEXECDIR}}/systemd-coredump %P %u %g %s %t %c %h
# Allow 16 coredumps to be dispatched in parallel by the kernel.
# We collect metadata from /proc/%P/, and thus need to make sure the crashed
diff --git a/test/fuzz/fuzz-catalog/systemd.pl.catalog b/test/fuzz/fuzz-catalog/systemd.pl.catalog
index 99a62ce5e0b6..a064813fab94 100644
--- a/test/fuzz/fuzz-catalog/systemd.pl.catalog
+++ b/test/fuzz/fuzz-catalog/systemd.pl.catalog
@@ -376,6 +376,8 @@ Defined-By: systemd
Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
Możliwe są następujące „etykiety”:
+• „split-usr” — /usr jest oddzielnym systemem plików, który nie był
+ zamontowany w czasie uruchomienia systemd,
• „cgroups-missing” — jądro zostało skompilowane bez obsługi cgroups
lub dostęp do oczekiwanych plików interfejsu jest ograniczony,
• „var-run-bad” — /var/run nie jest dowiązaniem symbolicznym do /run,
diff --git a/test/test-fstab-generator.sh b/test/test-fstab-generator.sh
index af8fa7c226d5..476312133e43 100755
--- a/test/test-fstab-generator.sh
+++ b/test/test-fstab-generator.sh
@@ -59,6 +59,11 @@ test_one() (
touch "$i"
done
+ # For split-usr system
+ for i in "$out"/systemd-*.service; do
+ sed -i -e 's:ExecStart=/lib/systemd/:ExecStart=/usr/lib/systemd/:' "$i"
+ done
+
if [[ "${input##*/}" =~ \.fstab\.input ]]; then
for i in "$out"/*.{automount,mount,swap}; do
sed -i -e 's:SourcePath=.*$:SourcePath=/etc/fstab:' "$i"
diff --git a/test/test-functions b/test/test-functions
index 04fe20f5478c..5ed9041eb182 100644
--- a/test/test-functions
+++ b/test/test-functions
@@ -95,7 +95,7 @@ else
fi
if ! ROOTLIBDIR=$(pkg-config --variable=systemdutildir systemd); then
- echo "WARNING! Cannot determine libdir from pkg-config, assuming /usr/lib/systemd" >&2
+ echo "WARNING! Cannot determine rootlibdir from pkg-config, assuming /usr/lib/systemd" >&2
ROOTLIBDIR=/usr/lib/systemd
fi
@@ -2183,6 +2183,14 @@ install_keymaps() {
dinfo "Install console keymaps"
+ if command -v meson >/dev/null \
+ && [[ "$(meson configure "${BUILD_DIR:?}" | grep 'split-usr' | awk '{ print $2 }')" == "true" ]] \
+ || [[ ! -L /lib ]]; then
+ prefix+=(
+ "/lib"
+ )
+ fi
+
if (( $# == 0 )); then
for p in "${prefix[@]}"; do
# The first three paths may be deprecated.
diff --git a/units/emergency.service.in b/units/emergency.service.in
index 25aa8ec5106d..c21336ff0251 100644
--- a/units/emergency.service.in
+++ b/units/emergency.service.in
@@ -20,7 +20,7 @@ Before=rescue.service
Environment=HOME=/root
WorkingDirectory=-/root
ExecStartPre=-plymouth --wait quit
-ExecStart=-{{LIBEXECDIR}}/systemd-sulogin-shell emergency
+ExecStart=-{{ROOTLIBEXECDIR}}/systemd-sulogin-shell emergency
Type=idle
StandardInput=tty-force
StandardOutput=inherit
diff --git a/units/initrd-parse-etc.service.in b/units/initrd-parse-etc.service.in
index 1eef2bd9be8b..fb8c941832bc 100644
--- a/units/initrd-parse-etc.service.in
+++ b/units/initrd-parse-etc.service.in
@@ -23,7 +23,7 @@ OnFailureJobMode=replace-irreversibly
[Service]
Type=oneshot
-ExecStart={{LIBEXECDIR}}/systemd-sysroot-fstab-check
+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
diff --git a/units/rescue.service.in b/units/rescue.service.in
index add604724a7e..c95a44dcdbc6 100644
--- a/units/rescue.service.in
+++ b/units/rescue.service.in
@@ -19,7 +19,7 @@ Before=shutdown.target
Environment=HOME=/root
WorkingDirectory=-/root
ExecStartPre=-plymouth --wait quit
-ExecStart=-{{LIBEXECDIR}}/systemd-sulogin-shell rescue
+ExecStart=-{{ROOTLIBEXECDIR}}/systemd-sulogin-shell rescue
Type=idle
StandardInput=tty-force
StandardOutput=inherit
diff --git a/units/systemd-backlight@.service.in b/units/systemd-backlight@.service.in
index e7e35ecf0d0b..981d0f278ee3 100644
--- a/units/systemd-backlight@.service.in
+++ b/units/systemd-backlight@.service.in
@@ -19,7 +19,7 @@ Before=sysinit.target shutdown.target
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-backlight load %i
-ExecStop={{LIBEXECDIR}}/systemd-backlight save %i
+ExecStart={{ROOTLIBEXECDIR}}/systemd-backlight load %i
+ExecStop={{ROOTLIBEXECDIR}}/systemd-backlight save %i
TimeoutSec=90s
StateDirectory=systemd/backlight
diff --git a/units/systemd-battery-check.service.in b/units/systemd-battery-check.service.in
index ee87118a074b..30d5ea145fc8 100644
--- a/units/systemd-battery-check.service.in
+++ b/units/systemd-battery-check.service.in
@@ -22,5 +22,5 @@ Before=initrd-root-device.target systemd-hibernate-resume.service
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-battery-check
+ExecStart={{ROOTLIBEXECDIR}}/systemd-battery-check
FailureAction=poweroff-force
diff --git a/units/systemd-binfmt.service.in b/units/systemd-binfmt.service.in
index 318bf8efc290..44024436b13d 100644
--- a/units/systemd-binfmt.service.in
+++ b/units/systemd-binfmt.service.in
@@ -28,6 +28,6 @@ ConditionDirectoryNotEmpty=|/run/binfmt.d
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-binfmt
-ExecStop={{LIBEXECDIR}}/systemd-binfmt --unregister
+ExecStart={{ROOTLIBEXECDIR}}/systemd-binfmt
+ExecStop={{ROOTLIBEXECDIR}}/systemd-binfmt --unregister
TimeoutSec=90s
diff --git a/units/systemd-bless-boot.service.in b/units/systemd-bless-boot.service.in
index e7a45481447d..557f77b16f63 100644
--- a/units/systemd-bless-boot.service.in
+++ b/units/systemd-bless-boot.service.in
@@ -19,4 +19,4 @@ Before=shutdown.target
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-bless-boot good
+ExecStart={{ROOTLIBEXECDIR}}/systemd-bless-boot good
diff --git a/units/systemd-boot-check-no-failures.service.in b/units/systemd-boot-check-no-failures.service.in
index 2e17cb9c8e8b..2eb4c79966ed 100644
--- a/units/systemd-boot-check-no-failures.service.in
+++ b/units/systemd-boot-check-no-failures.service.in
@@ -16,7 +16,7 @@ Before=boot-complete.target
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-boot-check-no-failures
+ExecStart={{ROOTLIBEXECDIR}}/systemd-boot-check-no-failures
[Install]
RequiredBy=boot-complete.target
diff --git a/units/systemd-coredump@.service.in b/units/systemd-coredump@.service.in
index 012c60d2f684..15bfb243b41d 100644
--- a/units/systemd-coredump@.service.in
+++ b/units/systemd-coredump@.service.in
@@ -17,7 +17,7 @@ Requires=systemd-journald.socket
Before=shutdown.target
[Service]
-ExecStart=-{{LIBEXECDIR}}/systemd-coredump
+ExecStart=-{{ROOTLIBEXECDIR}}/systemd-coredump
IPAddressDeny=any
LockPersonality=yes
MemoryDenyWriteExecute=yes
diff --git a/units/systemd-fsck-root.service.in b/units/systemd-fsck-root.service.in
index ebe8262a49e2..8cfbe7ce9879 100644
--- a/units/systemd-fsck-root.service.in
+++ b/units/systemd-fsck-root.service.in
@@ -20,5 +20,5 @@ OnFailureJobMode=replace-irreversibly
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-fsck
+ExecStart={{ROOTLIBEXECDIR}}/systemd-fsck
TimeoutSec=infinity
diff --git a/units/systemd-fsck@.service.in b/units/systemd-fsck@.service.in
index 8eb4821d41f5..a3a7a2e36720 100644
--- a/units/systemd-fsck@.service.in
+++ b/units/systemd-fsck@.service.in
@@ -20,5 +20,5 @@ Before=systemd-quotacheck.service shutdown.target
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-fsck %f
+ExecStart={{ROOTLIBEXECDIR}}/systemd-fsck %f
TimeoutSec=infinity
diff --git a/units/systemd-growfs-root.service.in b/units/systemd-growfs-root.service.in
index a6568638b02c..0468774cb002 100644
--- a/units/systemd-growfs-root.service.in
+++ b/units/systemd-growfs-root.service.in
@@ -19,5 +19,5 @@ Before=shutdown.target
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-growfs /
+ExecStart={{ROOTLIBEXECDIR}}/systemd-growfs /
TimeoutSec=infinity
diff --git a/units/systemd-growfs@.service.in b/units/systemd-growfs@.service.in
index 8099b1ea4701..90fb0a86619b 100644
--- a/units/systemd-growfs@.service.in
+++ b/units/systemd-growfs@.service.in
@@ -20,5 +20,5 @@ Before=shutdown.target
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-growfs %f
+ExecStart={{ROOTLIBEXECDIR}}/systemd-growfs %f
TimeoutSec=infinity
diff --git a/units/systemd-hibernate.service.in b/units/systemd-hibernate.service.in
index c43195bc076d..94181fcc6d1b 100644
--- a/units/systemd-hibernate.service.in
+++ b/units/systemd-hibernate.service.in
@@ -16,4 +16,4 @@ After=sleep.target
[Service]
Type=oneshot
-ExecStart={{LIBEXECDIR}}/systemd-sleep hibernate
+ExecStart={{ROOTLIBEXECDIR}}/systemd-sleep hibernate
diff --git a/units/systemd-homed.service.in b/units/systemd-homed.service.in
index b54e5d30b200..2063f6ddfd7d 100644
--- a/units/systemd-homed.service.in
+++ b/units/systemd-homed.service.in
@@ -20,7 +20,7 @@ DeviceAllow=/dev/loop-control rw
DeviceAllow=/dev/mapper/control rw
DeviceAllow=block-* rw
DeviceAllow=char-hidraw rw
-ExecStart={{LIBEXECDIR}}/systemd-homed
+ExecStart={{ROOTLIBEXECDIR}}/systemd-homed
KillMode=mixed
LimitNOFILE={{HIGH_RLIMIT_NOFILE}}
LockPersonality=yes
diff --git a/units/systemd-hostnamed.service.in b/units/systemd-hostnamed.service.in
index ab00c24b53b2..48bffe3e4e72 100644
--- a/units/systemd-hostnamed.service.in
+++ b/units/systemd-hostnamed.service.in
@@ -18,7 +18,7 @@ Documentation=man:org.freedesktop.hostname1(5)
Type=notify
BusName=org.freedesktop.hostname1
CapabilityBoundingSet=CAP_SYS_ADMIN
-ExecStart={{LIBEXECDIR}}/systemd-hostnamed
+ExecStart={{ROOTLIBEXECDIR}}/systemd-hostnamed
IPAddressDeny=any
LockPersonality=yes
MemoryDenyWriteExecute=yes
diff --git a/units/systemd-hybrid-sleep.service.in b/units/systemd-hybrid-sleep.service.in
index c85215bdacfd..ec5142085e82 100644
--- a/units/systemd-hybrid-sleep.service.in
+++ b/units/systemd-hybrid-sleep.service.in
@@ -16,4 +16,4 @@ After=sleep.target
[Service]
Type=oneshot
-ExecStart={{LIBEXECDIR}}/systemd-sleep hybrid-sleep
+ExecStart={{ROOTLIBEXECDIR}}/systemd-sleep hybrid-sleep
diff --git a/units/systemd-importd.service.in b/units/systemd-importd.service.in
index daa93776e178..dab382a55fa3 100644
--- a/units/systemd-importd.service.in
+++ b/units/systemd-importd.service.in
@@ -14,7 +14,7 @@ Documentation=man:org.freedesktop.import1(5)
[Service]
Type=notify
-ExecStart={{LIBEXECDIR}}/systemd-importd
+ExecStart={{ROOTLIBEXECDIR}}/systemd-importd
BusName=org.freedesktop.import1
KillMode=mixed
CapabilityBoundingSet=CAP_CHOWN CAP_FOWNER CAP_FSETID CAP_MKNOD CAP_SETFCAP CAP_SYS_ADMIN CAP_SETPCAP CAP_DAC_OVERRIDE CAP_LINUX_IMMUTABLE
diff --git a/units/systemd-initctl.service.in b/units/systemd-initctl.service.in
index 6a19058186ca..efac5c4b1143 100644
--- a/units/systemd-initctl.service.in
+++ b/units/systemd-initctl.service.in
@@ -13,7 +13,7 @@ Documentation=man:systemd-initctl.service(8)
DefaultDependencies=no
[Service]
-ExecStart={{LIBEXECDIR}}/systemd-initctl
+ExecStart={{ROOTLIBEXECDIR}}/systemd-initctl
NoNewPrivileges=yes
NotifyAccess=all
SystemCallArchitectures=native
diff --git a/units/systemd-journal-gatewayd.service.in b/units/systemd-journal-gatewayd.service.in
index 27ae42cccee8..81c53fa01f41 100644
--- a/units/systemd-journal-gatewayd.service.in
+++ b/units/systemd-journal-gatewayd.service.in
@@ -14,7 +14,7 @@ Requires=systemd-journal-gatewayd.socket
[Service]
DynamicUser=yes
-ExecStart={{LIBEXECDIR}}/systemd-journal-gatewayd
+ExecStart={{ROOTLIBEXECDIR}}/systemd-journal-gatewayd
LockPersonality=yes
MemoryDenyWriteExecute=yes
PrivateDevices=yes
diff --git a/units/systemd-journal-remote.service.in b/units/systemd-journal-remote.service.in
index 651741099055..d8f28f252c0e 100644
--- a/units/systemd-journal-remote.service.in
+++ b/units/systemd-journal-remote.service.in
@@ -13,7 +13,7 @@ Documentation=man:systemd-journal-remote(8) man:journal-remote.conf(5)
Requires=systemd-journal-remote.socket
[Service]
-ExecStart={{LIBEXECDIR}}/systemd-journal-remote --listen-https=-3 --output=/var/log/journal/remote/
+ExecStart={{ROOTLIBEXECDIR}}/systemd-journal-remote --listen-https=-3 --output=/var/log/journal/remote/
LockPersonality=yes
LogsDirectory=journal/remote
MemoryDenyWriteExecute=yes
diff --git a/units/systemd-journal-upload.service.in b/units/systemd-journal-upload.service.in
index 273511e72f7f..7e64870e9d5d 100644
--- a/units/systemd-journal-upload.service.in
+++ b/units/systemd-journal-upload.service.in
@@ -15,7 +15,7 @@ After=network-online.target
[Service]
DynamicUser=yes
-ExecStart={{LIBEXECDIR}}/systemd-journal-upload --save-state
+ExecStart={{ROOTLIBEXECDIR}}/systemd-journal-upload --save-state
LockPersonality=yes
MemoryDenyWriteExecute=yes
PrivateDevices=yes
diff --git a/units/systemd-journald.service.in b/units/systemd-journald.service.in
index 4404af963bb4..669d3bef9a9f 100644
--- a/units/systemd-journald.service.in
+++ b/units/systemd-journald.service.in
@@ -30,7 +30,7 @@ IgnoreOnIsolate=yes
[Service]
DeviceAllow=char-* rw
-ExecStart={{LIBEXECDIR}}/systemd-journald
+ExecStart={{ROOTLIBEXECDIR}}/systemd-journald
FileDescriptorStoreMax=4224
# Ensure services using StandardOutput=journal do not break when journald is stopped
FileDescriptorStorePreserve=yes
diff --git a/units/systemd-journald@.service.in b/units/systemd-journald@.service.in
index b705ce08ff5c..35c998285f2f 100644
--- a/units/systemd-journald@.service.in
+++ b/units/systemd-journald@.service.in
@@ -16,7 +16,7 @@ After=systemd-journald@%i.socket systemd-journald-varlink@%i.socket
[Service]
CapabilityBoundingSet=CAP_SYS_ADMIN CAP_DAC_OVERRIDE CAP_SYS_PTRACE CAP_CHOWN CAP_DAC_READ_SEARCH CAP_FOWNER CAP_SETUID CAP_SETGID CAP_MAC_OVERRIDE
DevicePolicy=closed
-ExecStart={{LIBEXECDIR}}/systemd-journald %i
+ExecStart={{ROOTLIBEXECDIR}}/systemd-journald %i
FileDescriptorStoreMax=4224
Group=systemd-journal
IPAddressDeny=any
diff --git a/units/systemd-localed.service.in b/units/systemd-localed.service.in
index 4de89aa8ddd9..13020914d9a6 100644
--- a/units/systemd-localed.service.in
+++ b/units/systemd-localed.service.in
@@ -18,7 +18,7 @@ Documentation=man:org.freedesktop.locale1(5)
Type=notify
BusName=org.freedesktop.locale1
CapabilityBoundingSet=
-ExecStart={{LIBEXECDIR}}/systemd-localed
+ExecStart={{ROOTLIBEXECDIR}}/systemd-localed
IPAddressDeny=any
LockPersonality=yes
MemoryDenyWriteExecute=yes
diff --git a/units/systemd-logind.service.in b/units/systemd-logind.service.in
index cc1b6be429c9..2912301a3a41 100644
--- a/units/systemd-logind.service.in
+++ b/units/systemd-logind.service.in
@@ -30,7 +30,7 @@ DeviceAllow=char-drm rw
DeviceAllow=char-input rw
DeviceAllow=char-tty rw
DeviceAllow=char-vcs rw
-ExecStart={{LIBEXECDIR}}/systemd-logind
+ExecStart={{ROOTLIBEXECDIR}}/systemd-logind
FileDescriptorStoreMax=768
IPAddressDeny=any
LockPersonality=yes
diff --git a/units/systemd-machined.service.in b/units/systemd-machined.service.in
index 47aa5deeedc5..d3f8abd9e4c6 100644
--- a/units/systemd-machined.service.in
+++ b/units/systemd-machined.service.in
@@ -19,7 +19,7 @@ RequiresMountsFor=/var/lib/machines
[Service]
BusName=org.freedesktop.machine1
CapabilityBoundingSet=CAP_KILL CAP_SYS_PTRACE CAP_SYS_ADMIN CAP_SETGID CAP_SYS_CHROOT CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE CAP_CHOWN CAP_FOWNER CAP_FSETID CAP_MKNOD CAP_LINUX_IMMUTABLE
-ExecStart={{LIBEXECDIR}}/systemd-machined
+ExecStart={{ROOTLIBEXECDIR}}/systemd-machined
IPAddressDeny=any
LockPersonality=yes
MemoryDenyWriteExecute=yes
diff --git a/units/systemd-modules-load.service.in b/units/systemd-modules-load.service.in
index ad262fa13ab1..9c5be76d2181 100644
--- a/units/systemd-modules-load.service.in
+++ b/units/systemd-modules-load.service.in
@@ -27,5 +27,5 @@ ConditionKernelCommandLine=|rd.modules_load
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-modules-load
+ExecStart={{ROOTLIBEXECDIR}}/systemd-modules-load
TimeoutSec=90s
diff --git a/units/systemd-network-generator.service.in b/units/systemd-network-generator.service.in
index f7d13d308467..c5cf7b1cd0ea 100644
--- a/units/systemd-network-generator.service.in
+++ b/units/systemd-network-generator.service.in
@@ -20,7 +20,7 @@ Before=shutdown.target initrd-switch-root.target
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-network-generator
+ExecStart={{ROOTLIBEXECDIR}}/systemd-network-generator
ImportCredential=network.netdev.*
ImportCredential=network.link.*
ImportCredential=network.network.*
diff --git a/units/systemd-networkd-wait-online.service.in b/units/systemd-networkd-wait-online.service.in
index 7768121f5fc2..3dc5ce926527 100644
--- a/units/systemd-networkd-wait-online.service.in
+++ b/units/systemd-networkd-wait-online.service.in
@@ -19,7 +19,7 @@ Before=network-online.target shutdown.target
[Service]
Type=oneshot
-ExecStart={{LIBEXECDIR}}/systemd-networkd-wait-online
+ExecStart={{ROOTLIBEXECDIR}}/systemd-networkd-wait-online
RemainAfterExit=yes
[Install]
diff --git a/units/systemd-networkd-wait-online@.service.in b/units/systemd-networkd-wait-online@.service.in
index 60d173490b38..b7a1e409f443 100644
--- a/units/systemd-networkd-wait-online@.service.in
+++ b/units/systemd-networkd-wait-online@.service.in
@@ -19,7 +19,7 @@ Before=network-online.target shutdown.target
[Service]
Type=oneshot
-ExecStart={{LIBEXECDIR}}/systemd-networkd-wait-online -i %i
+ExecStart={{ROOTLIBEXECDIR}}/systemd-networkd-wait-online -i %i
RemainAfterExit=yes
[Install]
diff --git a/units/systemd-networkd.service.in b/units/systemd-networkd.service.in
index 6141fdbb6d78..cf7aff4caeda 100644
--- a/units/systemd-networkd.service.in
+++ b/units/systemd-networkd.service.in
@@ -24,7 +24,7 @@ AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_BROADCAST CAP_NET
BusName=org.freedesktop.network1
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_BROADCAST CAP_NET_RAW
DeviceAllow=char-* rw
-ExecStart=!!{{LIBEXECDIR}}/systemd-networkd
+ExecStart=!!{{ROOTLIBEXECDIR}}/systemd-networkd
FileDescriptorStoreMax=512
ImportCredential=network.wireguard.*
LockPersonality=yes
diff --git a/units/systemd-oomd.service.in b/units/systemd-oomd.service.in
index 82bd6245f83a..c138f5eefaff 100644
--- a/units/systemd-oomd.service.in
+++ b/units/systemd-oomd.service.in
@@ -26,7 +26,7 @@ After=systemd-oomd.socket
AmbientCapabilities=CAP_KILL CAP_DAC_OVERRIDE
BusName=org.freedesktop.oom1
CapabilityBoundingSet=CAP_KILL CAP_DAC_OVERRIDE
-ExecStart={{LIBEXECDIR}}/systemd-oomd
+ExecStart={{ROOTLIBEXECDIR}}/systemd-oomd
IPAddressDeny=any
LockPersonality=yes
MemoryDenyWriteExecute=yes
diff --git a/units/systemd-pcrfs-root.service.in b/units/systemd-pcrfs-root.service.in
index 5b40a91ca649..a3d78a27382f 100644
--- a/units/systemd-pcrfs-root.service.in
+++ b/units/systemd-pcrfs-root.service.in
@@ -20,4 +20,4 @@ ConditionSecurity=measured-uki
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-pcrextend --graceful --file-system=/
+ExecStart={{ROOTLIBEXECDIR}}/systemd-pcrphase --graceful --file-system=/
diff --git a/units/systemd-pcrfs@.service.in b/units/systemd-pcrfs@.service.in
index 203d7b9782e1..964422e603cf 100644
--- a/units/systemd-pcrfs@.service.in
+++ b/units/systemd-pcrfs@.service.in
@@ -21,4 +21,4 @@ ConditionSecurity=measured-uki
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-pcrextend --graceful --file-system=%f
+ExecStart={{ROOTLIBEXECDIR}}/systemd-pcrphase --graceful --file-system=%f
diff --git a/units/systemd-pcrmachine.service.in b/units/systemd-pcrmachine.service.in
index 65caf2ed4928..278c5b7640ae 100644
--- a/units/systemd-pcrmachine.service.in
+++ b/units/systemd-pcrmachine.service.in
@@ -20,4 +20,4 @@ ConditionSecurity=measured-uki
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-pcrextend --graceful --machine-id
+ExecStart={{ROOTLIBEXECDIR}}/systemd-pcrphase --graceful --machine-id
diff --git a/units/systemd-pcrphase-initrd.service.in b/units/systemd-pcrphase-initrd.service.in
index 6fcf94de76c5..c6b7e5975964 100644
--- a/units/systemd-pcrphase-initrd.service.in
+++ b/units/systemd-pcrphase-initrd.service.in
@@ -20,5 +20,5 @@ ConditionSecurity=measured-uki
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-pcrextend --graceful enter-initrd
-ExecStop={{LIBEXECDIR}}/systemd-pcrextend --graceful leave-initrd
+ExecStart={{ROOTLIBEXECDIR}}/systemd-pcrphase --graceful enter-initrd
+ExecStop={{ROOTLIBEXECDIR}}/systemd-pcrphase --graceful leave-initrd
diff --git a/units/systemd-pcrphase-sysinit.service.in b/units/systemd-pcrphase-sysinit.service.in
index 8c0c0c82a2c7..e4680609bf8e 100644
--- a/units/systemd-pcrphase-sysinit.service.in
+++ b/units/systemd-pcrphase-sysinit.service.in
@@ -20,5 +20,5 @@ ConditionSecurity=measured-uki
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-pcrextend --graceful sysinit
-ExecStop={{LIBEXECDIR}}/systemd-pcrextend --graceful final
+ExecStart={{ROOTLIBEXECDIR}}/systemd-pcrphase --graceful sysinit
+ExecStop={{ROOTLIBEXECDIR}}/systemd-pcrphase --graceful final
diff --git a/units/systemd-pcrphase.service.in b/units/systemd-pcrphase.service.in
index 04ace12e14d4..1c54df829ca3 100644
--- a/units/systemd-pcrphase.service.in
+++ b/units/systemd-pcrphase.service.in
@@ -18,5 +18,5 @@ ConditionSecurity=measured-uki
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-pcrextend --graceful ready
-ExecStop={{LIBEXECDIR}}/systemd-pcrextend --graceful shutdown
+ExecStart={{ROOTLIBEXECDIR}}/systemd-pcrphase --graceful ready
+ExecStop={{ROOTLIBEXECDIR}}/systemd-pcrphase --graceful shutdown
diff --git a/units/systemd-portabled.service.in b/units/systemd-portabled.service.in
index b4ec252c0394..ab660ce36c8d 100644
--- a/units/systemd-portabled.service.in
+++ b/units/systemd-portabled.service.in
@@ -14,7 +14,7 @@ Documentation=man:org.freedesktop.portable1(5)
RequiresMountsFor=/var/lib/portables
[Service]
-ExecStart={{LIBEXECDIR}}/systemd-portabled
+ExecStart={{ROOTLIBEXECDIR}}/systemd-portabled
BusName=org.freedesktop.portable1
CapabilityBoundingSet=CAP_KILL CAP_SYS_PTRACE CAP_SYS_ADMIN CAP_SETGID CAP_SYS_CHROOT CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE CAP_CHOWN CAP_FOWNER CAP_FSETID CAP_MKNOD
MemoryDenyWriteExecute=yes
diff --git a/units/systemd-pstore.service.in b/units/systemd-pstore.service.in
index 0b5a20a3532e..02ac29caa4ed 100644
--- a/units/systemd-pstore.service.in
+++ b/units/systemd-pstore.service.in
@@ -20,7 +20,7 @@ Wants=modprobe@efi_pstore.service
[Service]
Type=oneshot
-ExecStart={{LIBEXECDIR}}/systemd-pstore
+ExecStart={{ROOTLIBEXECDIR}}/systemd-pstore
RemainAfterExit=yes
StateDirectory=systemd/pstore
diff --git a/units/systemd-quotacheck@.service.in b/units/systemd-quotacheck@.service.in
index f2b8db7abb89..735dd76f2bae 100644
--- a/units/systemd-quotacheck@.service.in
+++ b/units/systemd-quotacheck@.service.in
@@ -23,5 +23,5 @@ Conflicts=shutdown.target
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-quotacheck %f
+ExecStart={{ROOTLIBEXECDIR}}/systemd-quotacheck %f
TimeoutSec=infinity
diff --git a/units/systemd-random-seed.service.in b/units/systemd-random-seed.service.in
index 99b5f33ea262..820fdd8536dd 100644
--- a/units/systemd-random-seed.service.in
+++ b/units/systemd-random-seed.service.in
@@ -25,8 +25,8 @@ Before=shutdown.target
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-random-seed load
-ExecStop={{LIBEXECDIR}}/systemd-random-seed save
+ExecStart={{ROOTLIBEXECDIR}}/systemd-random-seed load
+ExecStop={{ROOTLIBEXECDIR}}/systemd-random-seed save
# This service waits until the kernel's entropy pool is initialized, and may be
# used as ordering barrier for service that require an initialized entropy
diff --git a/units/systemd-remount-fs.service.in b/units/systemd-remount-fs.service.in
index 4ac8978ff22f..cbb792ea68ee 100644
--- a/units/systemd-remount-fs.service.in
+++ b/units/systemd-remount-fs.service.in
@@ -22,4 +22,4 @@ Before=shutdown.target
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-remount-fs
+ExecStart={{ROOTLIBEXECDIR}}/systemd-remount-fs
diff --git a/units/systemd-repart.service b/units/systemd-repart.service
index 1f7e2a612a71..8285788a4fae 100644
--- a/units/systemd-repart.service
+++ b/units/systemd-repart.service
@@ -29,7 +29,7 @@ Before=shutdown.target initrd-switch-root.target
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart=systemd-repart --dry-run=no
+ExecStart={{ROOTBINDIR}}/systemd-repart --dry-run=no
# The tool returns 76 if it can't find the root block device
SuccessExitStatus=76
diff --git a/units/systemd-resolved.service.in b/units/systemd-resolved.service.in
index 4aa0788ac4e3..7305d7904bb3 100644
--- a/units/systemd-resolved.service.in
+++ b/units/systemd-resolved.service.in
@@ -24,7 +24,7 @@ Wants=nss-lookup.target
AmbientCapabilities=CAP_SETPCAP CAP_NET_RAW CAP_NET_BIND_SERVICE
BusName=org.freedesktop.resolve1
CapabilityBoundingSet=CAP_SETPCAP CAP_NET_RAW CAP_NET_BIND_SERVICE
-ExecStart=!!{{LIBEXECDIR}}/systemd-resolved
+ExecStart=!!{{ROOTLIBEXECDIR}}/systemd-resolved
LockPersonality=yes
MemoryDenyWriteExecute=yes
NoNewPrivileges=yes
diff --git a/units/systemd-rfkill.service.in b/units/systemd-rfkill.service.in
index 072ae643b087..a5b6cc4b7f91 100644
--- a/units/systemd-rfkill.service.in
+++ b/units/systemd-rfkill.service.in
@@ -19,7 +19,7 @@ After=sys-devices-virtual-misc-rfkill.device
Before=shutdown.target
[Service]
-ExecStart={{LIBEXECDIR}}/systemd-rfkill
+ExecStart={{ROOTLIBEXECDIR}}/systemd-rfkill
NoNewPrivileges=yes
StateDirectory=systemd/rfkill
TimeoutSec=90s
diff --git a/units/systemd-suspend-then-hibernate.service.in b/units/systemd-suspend-then-hibernate.service.in
index d7ab2c195e59..f9c96757be65 100644
--- a/units/systemd-suspend-then-hibernate.service.in
+++ b/units/systemd-suspend-then-hibernate.service.in
@@ -16,4 +16,4 @@ After=sleep.target
[Service]
Type=oneshot
-ExecStart={{LIBEXECDIR}}/systemd-sleep suspend-then-hibernate
+ExecStart={{ROOTLIBEXECDIR}}/systemd-sleep suspend-then-hibernate
diff --git a/units/systemd-suspend.service.in b/units/systemd-suspend.service.in
index aa264e860c5b..2515575e1040 100644
--- a/units/systemd-suspend.service.in
+++ b/units/systemd-suspend.service.in
@@ -16,4 +16,4 @@ After=sleep.target
[Service]
Type=oneshot
-ExecStart={{LIBEXECDIR}}/systemd-sleep suspend
+ExecStart={{ROOTLIBEXECDIR}}/systemd-sleep suspend
diff --git a/units/systemd-sysctl.service.in b/units/systemd-sysctl.service.in
index 4179753cde50..7307601a7dfb 100644
--- a/units/systemd-sysctl.service.in
+++ b/units/systemd-sysctl.service.in
@@ -19,6 +19,6 @@ ConditionPathIsReadWrite=/proc/sys/net/
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-sysctl
+ExecStart={{ROOTLIBEXECDIR}}/systemd-sysctl
TimeoutSec=90s
ImportCredential=sysctl.*
diff --git a/units/systemd-sysupdate-reboot.service.in b/units/systemd-sysupdate-reboot.service.in
index 5d4011a21327..9d7b7d1657ad 100644
--- a/units/systemd-sysupdate-reboot.service.in
+++ b/units/systemd-sysupdate-reboot.service.in
@@ -14,7 +14,7 @@ ConditionVirtualization=!container
[Service]
Type=oneshot
-ExecStart={{LIBEXECDIR}}/systemd-sysupdate reboot
+ExecStart={{ROOTLIBEXECDIR}}/systemd-sysupdate reboot
[Install]
Also=systemd-sysupdate-reboot.timer
diff --git a/units/systemd-sysupdate.service.in b/units/systemd-sysupdate.service.in
index 1becbec5edeb..085a9c4a22c2 100644
--- a/units/systemd-sysupdate.service.in
+++ b/units/systemd-sysupdate.service.in
@@ -17,7 +17,7 @@ ConditionVirtualization=!container
[Service]
Type=simple
NotifyAccess=main
-ExecStart={{LIBEXECDIR}}/systemd-sysupdate update
+ExecStart={{ROOTLIBEXECDIR}}/systemd-sysupdate update
CapabilityBoundingSet=CAP_CHOWN CAP_FOWNER CAP_FSETID CAP_MKNOD CAP_SETFCAP CAP_SYS_ADMIN CAP_SETPCAP CAP_DAC_OVERRIDE CAP_LINUX_IMMUTABLE
NoNewPrivileges=yes
MemoryDenyWriteExecute=yes
diff --git a/units/systemd-time-wait-sync.service.in b/units/systemd-time-wait-sync.service.in
index 6b99393f6908..25adecc86b19 100644
--- a/units/systemd-time-wait-sync.service.in
+++ b/units/systemd-time-wait-sync.service.in
@@ -28,7 +28,7 @@ Conflicts=shutdown.target
[Service]
Type=oneshot
-ExecStart={{LIBEXECDIR}}/systemd-time-wait-sync
+ExecStart={{ROOTLIBEXECDIR}}/systemd-time-wait-sync
TimeoutStartSec=infinity
RemainAfterExit=yes
diff --git a/units/systemd-timedated.service.in b/units/systemd-timedated.service.in
index 06c3306a6eb6..d73b398244b5 100644
--- a/units/systemd-timedated.service.in
+++ b/units/systemd-timedated.service.in
@@ -18,7 +18,7 @@ Type=notify
BusName=org.freedesktop.timedate1
CapabilityBoundingSet=CAP_SYS_TIME
DeviceAllow=char-rtc r
-ExecStart={{LIBEXECDIR}}/systemd-timedated
+ExecStart={{ROOTLIBEXECDIR}}/systemd-timedated
IPAddressDeny=any
LockPersonality=yes
MemoryDenyWriteExecute=yes
diff --git a/units/systemd-timesyncd.service.in b/units/systemd-timesyncd.service.in
index cf233fbffd4f..c60646109138 100644
--- a/units/systemd-timesyncd.service.in
+++ b/units/systemd-timesyncd.service.in
@@ -26,7 +26,7 @@ CapabilityBoundingSet=CAP_SYS_TIME
# correct time to work, but we likely won't acquire that without NTP. Let's
# break this chicken-and-egg cycle here.
Environment=SYSTEMD_NSS_RESOLVE_VALIDATE=0
-ExecStart=!!{{LIBEXECDIR}}/systemd-timesyncd
+ExecStart=!!{{ROOTLIBEXECDIR}}/systemd-timesyncd
LockPersonality=yes
MemoryDenyWriteExecute=yes
NoNewPrivileges=yes
diff --git a/units/systemd-udevd.service.in b/units/systemd-udevd.service.in
index f4a44820880d..3cc35a976848 100644
--- a/units/systemd-udevd.service.in
+++ b/units/systemd-udevd.service.in
@@ -26,7 +26,7 @@ OOMScoreAdjust=-1000
Sockets=systemd-udevd-control.socket systemd-udevd-kernel.socket
Restart=always
RestartSec=0
-ExecStart={{LIBEXECDIR}}/systemd-udevd
+ExecStart={{ROOTLIBEXECDIR}}/systemd-udevd
KillMode=mixed
TasksMax=infinity
PrivateMounts=yes
diff --git a/units/systemd-update-done.service.in b/units/systemd-update-done.service.in
index 4ea43c7dca7e..53cc6dd621bd 100644
--- a/units/systemd-update-done.service.in
+++ b/units/systemd-update-done.service.in
@@ -20,4 +20,4 @@ ConditionNeedsUpdate=|/var
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-update-done
+ExecStart={{ROOTLIBEXECDIR}}/systemd-update-done
diff --git a/units/systemd-update-utmp-runlevel.service.in b/units/systemd-update-utmp-runlevel.service.in
index 17772d4576c4..18c92f9b5a4c 100644
--- a/units/systemd-update-utmp-runlevel.service.in
+++ b/units/systemd-update-utmp-runlevel.service.in
@@ -22,4 +22,4 @@ Before=shutdown.target
[Service]
Type=oneshot
-ExecStart={{LIBEXECDIR}}/systemd-update-utmp runlevel
+ExecStart={{ROOTLIBEXECDIR}}/systemd-update-utmp runlevel
diff --git a/units/systemd-update-utmp.service.in b/units/systemd-update-utmp.service.in
index 1a88b7b2b891..73a848390e95 100644
--- a/units/systemd-update-utmp.service.in
+++ b/units/systemd-update-utmp.service.in
@@ -22,5 +22,5 @@ RequiresMountsFor=/var/log/wtmp
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-update-utmp reboot
-ExecStop={{LIBEXECDIR}}/systemd-update-utmp shutdown
+ExecStart={{ROOTLIBEXECDIR}}/systemd-update-utmp reboot
+ExecStop={{ROOTLIBEXECDIR}}/systemd-update-utmp shutdown
diff --git a/units/systemd-user-sessions.service.in b/units/systemd-user-sessions.service.in
index ae694bf21b51..adca848c2a60 100644
--- a/units/systemd-user-sessions.service.in
+++ b/units/systemd-user-sessions.service.in
@@ -15,5 +15,5 @@ After=remote-fs.target nss-user-lookup.target network.target home.mount
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-user-sessions start
-ExecStop={{LIBEXECDIR}}/systemd-user-sessions stop
+ExecStart={{ROOTLIBEXECDIR}}/systemd-user-sessions start
+ExecStop={{ROOTLIBEXECDIR}}/systemd-user-sessions stop
diff --git a/units/systemd-userdbd.service.in b/units/systemd-userdbd.service.in
index 1c092654b99c..b57661100cd0 100644
--- a/units/systemd-userdbd.service.in
+++ b/units/systemd-userdbd.service.in
@@ -17,7 +17,7 @@ DefaultDependencies=no
[Service]
CapabilityBoundingSet=CAP_DAC_READ_SEARCH CAP_SYS_RESOURCE
-ExecStart={{LIBEXECDIR}}/systemd-userdbd
+ExecStart={{ROOTLIBEXECDIR}}/systemd-userdbd
IPAddressDeny=any
LimitNOFILE={{HIGH_RLIMIT_NOFILE}}
LockPersonality=yes
diff --git a/units/systemd-vconsole-setup.service.in b/units/systemd-vconsole-setup.service.in
index c6c5bc9130a3..2884e84e6cfe 100644
--- a/units/systemd-vconsole-setup.service.in
+++ b/units/systemd-vconsole-setup.service.in
@@ -31,6 +31,6 @@ Type=oneshot
SuccessExitStatus=SIGTERM
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-vconsole-setup
+ExecStart={{ROOTLIBEXECDIR}}/systemd-vconsole-setup
ImportCredential=vconsole.*
diff --git a/units/systemd-volatile-root.service.in b/units/systemd-volatile-root.service.in
index 6f221dc5ecb4..5a0ec89fd685 100644
--- a/units/systemd-volatile-root.service.in
+++ b/units/systemd-volatile-root.service.in
@@ -19,4 +19,4 @@ AssertPathExists=/etc/initrd-release
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart={{LIBEXECDIR}}/systemd-volatile-root yes /sysroot
+ExecStart={{ROOTLIBEXECDIR}}/systemd-volatile-root yes /sysroot
diff --git a/units/user-runtime-dir@.service.in b/units/user-runtime-dir@.service.in
index 241e9267bb0c..e49eb20441fc 100644
--- a/units/user-runtime-dir@.service.in
+++ b/units/user-runtime-dir@.service.in
@@ -14,8 +14,8 @@ After=systemd-logind.service dbus.service
IgnoreOnIsolate=yes
[Service]
-ExecStart={{LIBEXECDIR}}/systemd-user-runtime-dir start %i
-ExecStop={{LIBEXECDIR}}/systemd-user-runtime-dir stop %i
+ExecStart={{ROOTLIBEXECDIR}}/systemd-user-runtime-dir start %i
+ExecStop={{ROOTLIBEXECDIR}}/systemd-user-runtime-dir stop %i
Type=oneshot
RemainAfterExit=yes
Slice=user-%i.slice
diff --git a/units/user@.service.in b/units/user@.service.in
index 569546574721..03791f338f8d 100644
--- a/units/user@.service.in
+++ b/units/user@.service.in
@@ -18,7 +18,7 @@ IgnoreOnIsolate=yes
User=%i
PAMName=systemd-user
Type=notify-reload
-ExecStart={{LIBEXECDIR}}/systemd --user
+ExecStart={{ROOTLIBEXECDIR}}/systemd --user
Slice=user-%i.slice
KillMode=mixed
Delegate=pids memory cpu
--
2.41.0