diff --git a/nixos/modules/system/boot/systemd/initrd.nix b/nixos/modules/system/boot/systemd/initrd.nix index fa144951b208..2ccc964820fe 100644 --- a/nixos/modules/system/boot/systemd/initrd.nix +++ b/nixos/modules/system/boot/systemd/initrd.nix @@ -233,8 +233,8 @@ in { emergencyAccess = mkOption { type = with types; oneOf [ bool (nullOr (passwdEntry str)) ]; description = '' - Set to true for unauthenticated emergency access, and false for - no emergency access. + Set to true for unauthenticated emergency access, and false or + null for no emergency access. Can also be set to a hashed super user password to allow authenticated access to the emergency mode. @@ -436,7 +436,12 @@ in { # We can use either ! or * to lock the root account in the # console, but some software like OpenSSH won't even allow you # to log in with an SSH key if you use ! so we use * instead - "/etc/shadow".text = "root:${if isBool cfg.emergencyAccess then optionalString (!cfg.emergencyAccess) "*" else cfg.emergencyAccess}:::::::"; + "/etc/shadow".text = let + ea = cfg.emergencyAccess; + access = ea != null && !(isBool ea && !ea); + passwd = if isString ea then ea else ""; + in + "root:${if access then passwd else "*"}:::::::"; "/bin".source = "${initrdBinEnv}/bin"; "/sbin".source = "${initrdBinEnv}/sbin";