]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
Revert "initrd: extend SYSTEMD_IN_INITRD to accept non-ramfs rootfs"
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sun, 6 Nov 2022 19:34:21 +0000 (20:34 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 9 Nov 2022 08:20:33 +0000 (09:20 +0100)
This reverts commit 1f22621ba33f8089d2ae5fbcaf8b3970dd68aaf0.

As described in the reverted commit, we don't want to get rid of the check
completely. But the check requires opting-in by setting SYSTEMD_IN_INITRD=lenient,
which is cumbersome and doesn't seem to actually happen.
https://bugzilla.redhat.com/show_bug.cgi?id=2137631 is caused by systemd refusing
to treat the system as an initrd because overlayfs is used. Let's revert this
approach and do something that doesn't require opt-in instead.

I don't think it makes sense to keep support for "SYSTEMD_IN_INITRD=lenient" or
"SYSTEMD_IN_INITRD=auto". To get "auto" behaviour, just unset the option. And
"lenient" will be reimplemented as a better check. Thus the changes to the
option interface are completely reverted.

docs/ENVIRONMENT.md
src/basic/initrd-util.c

index a840dd0c9085f0c82beb765b182ebf6da9a7783b..ab3add6031aef7e6138b936e3eb1f25cbb0f93bd 100644 (file)
@@ -73,13 +73,9 @@ All tools:
   (relevant in particular for the system manager and `systemd-hostnamed`).
   Must be a valid hostname (either a single label or a FQDN).
 
-* `$SYSTEMD_IN_INITRD=[auto|lenient|0|1]` — if set, specifies initrd detection
-  method. Defaults to `auto`. Behavior is defined as follows:
-  `auto`: Checks if `/etc/initrd-release` exists, and a temporary fs is mounted
-          on `/`. If both conditions meet, then it's in initrd.
-  `lenient`: Similar to `auto`, but the rootfs check is skipped.
-  `0|1`: Simply overrides initrd detection. This is useful for debugging and
-         testing initrd-only programs in the main system.
+* `$SYSTEMD_IN_INITRD` — takes a boolean. If set, overrides initrd detection.
+  This is useful for debugging and testing initrd-only programs in the main
+  system.
 
 * `$SYSTEMD_BUS_TIMEOUT=SECS` — specifies the maximum time to wait for method call
   completion. If no time unit is specified, assumes seconds. The usual other units
index 2b6809aea52630dc05a21f99980f71818e0e9126..3624dcca560bfb1fefae86532dee72b94487074c 100644 (file)
@@ -12,13 +12,11 @@ static int saved_in_initrd = -1;
 
 bool in_initrd(void) {
         int r;
-        const char *e;
-        bool lenient = false;
 
         if (saved_in_initrd >= 0)
                 return saved_in_initrd;
 
-        /* We have two checks here:
+        /* We make two checks here:
          *
          * 1. the flag file /etc/initrd-release must exist
          * 2. the root file system must be a memory file system
@@ -26,46 +24,17 @@ 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 boolean value, then the boolean
-         * value is returned.
          */
 
-        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");
+        r = getenv_bool_secure("SYSTEMD_IN_INITRD");
+        if (r < 0 && r != -ENXIO)
+                log_debug_errno(r, "Failed to parse $SYSTEMD_IN_INITRD, ignoring: %m");
 
+        if (r >= 0)
                 saved_in_initrd = r > 0;
-        }
-
-        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;
-        }
+        else
+                saved_in_initrd = access("/etc/initrd-release", F_OK) >= 0 &&
+                                  path_is_temporary_fs("/") > 0;
 
         return saved_in_initrd;
 }