From: Franck Bui Date: Wed, 17 Jul 2024 09:02:03 +0000 (+0200) Subject: core: when switching root remove /run/systemd before executing the binary specified... X-Git-Tag: v257-rc1~852 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8c28dd24427598214d4464565192ec3f3b1a74a4;p=thirdparty%2Fsystemd.git core: when switching root remove /run/systemd before executing the binary specified by init= It's important if the binary specified by the init= boot option is not systemd otherwise it confuses systemctl that incorrectly assumes that systemd is still the init system due to the presence of /run/systemd/system. Also some tools might also check the presence of /run/systemd/private to test if systemd is running as pid1. --- diff --git a/src/core/main.c b/src/core/main.c index e5c2dc914e5..6234eff7e54 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -81,6 +81,7 @@ #include "psi-util.h" #include "random-util.h" #include "rlimit-util.h" +#include "rm-rf.h" #include "seccomp-util.h" #include "selinux-setup.h" #include "selinux-util.h" @@ -2052,6 +2053,17 @@ static int do_reexecute( arg_serialization = safe_fclose(arg_serialization); fds = fdset_free(fds); + /* Drop /run/systemd directory. Some of its content can be used as a flag indicating that systemd is + * the init system but we might be replacing it with something different. If systemd is used again it + * will recreate the directory and its content anyway. */ + r = rm_rf("/run/systemd.pre-switch-root", REMOVE_ROOT|REMOVE_MISSING_OK); + if (r < 0) + log_warning_errno(r, "Failed to prepare /run/systemd.pre-switch-root/, ignoring: %m"); + + r = RET_NERRNO(rename("/run/systemd", "/run/systemd.pre-switch-root")); + if (r < 0) + log_warning_errno(r, "Failed to move /run/systemd/ to /run/systemd.pre-switch-root/, ignoring: %m"); + /* Reopen the console */ (void) make_console_stdio();