diff options
author | Lennart Poettering <lennart@poettering.net> | 2021-01-15 09:58:17 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-15 09:58:17 +0100 |
commit | f1c86dd9abec1707b4a024f8bb6ade9630d9b5a9 (patch) | |
tree | ef0e47b8c7bf474313ee6e24f2e462825eb080f5 /src/basic | |
parent | Add truncate: to StandardOutput= etc. (diff) | |
parent | initrd: do a debug log if /etc/initrd-release doesn't take effect (diff) | |
download | systemd-f1c86dd9abec1707b4a024f8bb6ade9630d9b5a9.tar.xz systemd-f1c86dd9abec1707b4a024f8bb6ade9630d9b5a9.zip |
Merge pull request #18124 from ryncsn/initrd
initrd: add an env variable to accept non-ramfs rootfs
Diffstat (limited to 'src/basic')
-rw-r--r-- | src/basic/util.c | 49 |
1 files changed, 39 insertions, 10 deletions
diff --git a/src/basic/util.c b/src/basic/util.c index 7c708eb3be..d24d52190c 100644 --- a/src/basic/util.c +++ b/src/basic/util.c @@ -52,13 +52,14 @@ int prot_from_flags(int flags) { } bool in_initrd(void) { - struct statfs s; int r; + const char *e; + bool lenient = false; if (saved_in_initrd >= 0) return saved_in_initrd; - /* We make two checks here: + /* We have two checks here: * * 1. the flag file /etc/initrd-release must exist * 2. the root file system must be a memory file system @@ -66,18 +67,46 @@ bool in_initrd(void) { * The second check is extra paranoia, since misdetecting an * initrd can have bad consequences due the initrd * emptying when transititioning to the main systemd. + * + * If env var $SYSTEMD_IN_INITRD is not set or set to "auto", + * both checks are used. If it's set to "lenient", only check + * 1 is used. If set to a booleen value, then the boolean + * value is returned. */ - r = getenv_bool_secure("SYSTEMD_IN_INITRD"); - if (r < 0 && r != -ENXIO) - log_debug_errno(r, "Failed to parse $SYSTEMD_IN_INITRD, ignoring: %m"); + e = secure_getenv("SYSTEMD_IN_INITRD"); + if (e) { + if (streq(e, "lenient")) + lenient = true; + else if (!streq(e, "auto")) { + r = parse_boolean(e); + if (r >= 0) { + saved_in_initrd = r > 0; + return saved_in_initrd; + } + log_debug_errno(r, "Failed to parse $SYSTEMD_IN_INITRD, ignoring: %m"); + } + } + + if (!lenient) { + r = path_is_temporary_fs("/"); + if (r < 0) + log_debug_errno(r, "Couldn't determine if / is a temporary file system: %m"); - if (r >= 0) saved_in_initrd = r > 0; - else - saved_in_initrd = access("/etc/initrd-release", F_OK) >= 0 && - statfs("/", &s) >= 0 && - is_temporary_fs(&s); + } + + r = access("/etc/initrd-release", F_OK); + if (r >= 0) { + if (saved_in_initrd == 0) + log_debug("/etc/initrd-release exists, but it's not an initrd."); + else + saved_in_initrd = 1; + } else { + if (errno != ENOENT) + log_debug_errno(errno, "Failed to test if /etc/initrd-release exists: %m"); + saved_in_initrd = 0; + } return saved_in_initrd; } |